08.12.2015, 10:09
|
Прохожий
|
|
Регистрация: 06.12.2015
Сообщения: 13
Версия Delphi: XE8 v.22xx
Репутация: 10
|
|
Спасибо, примеры интересные.
Но в этом примере я не пойму, что вообще программа делает:
Код:
{$APPTYPE CONSOLE}
uses
SysUtils,
ActiveX,
ComObj,
Variants;
procedure GetLogEvents;
const
wbemFlagForwardOnly = $00000020;
var
FSWbemLocator : OLEVariant;
FWMIService : OLEVariant;
FWbemObjectSet: OLEVariant;
FWbemObject : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
begin;
FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
FWbemObjectSet:= FWMIService.ExecQuery('SELECT Category,ComputerName,EventCode,Message,RecordNumber FROM Win32_NTLogEvent '+
'Where Logfile="System" and EventCode=1','WQL',wbemFlagForwardOnly);
oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
while oEnum.Next(1, FWbemObject, iValue) = 0 do
begin
Writeln(Format('Category %s',[String(FWbemObject.Category)]));
Writeln(Format('Computer Name %s',[String(FWbemObject.ComputerName)]));
Writeln(Format('EventCode %d',[Integer(FWbemObject.EventCode)]));
Writeln(Format('Message %s',[String(FWbemObject.Message)]));
Writeln(Format('RecordNumber %d',[Integer(FWbemObject.RecordNumber)]));
FWbemObject:=Unassigned;
end;
end;
begin
try
CoInitialize(nil);
try
GetLogEvents;
finally
CoUninitialize;
end;
except
on E:EOleException do
Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
Writeln('Press Enter to exit');
Readln;
end.
Вроде выводит новые события (хотя не уверен).
а тут ругается уже на PEVENTLOGRECORD. :
Код:
var
hEventLog: THandle;
NumberOfRecords: DWORD;
Buffer: PEVENTLOGRECORD;
BytesRead, MinNumberOfBytesNeeded: DWORD;
begin
Memo1.Lines.BeginUpdate;
try
hEventLog:=OpenEventLog(nil, 'SYSTEM');
if hEventLog=0 then RaiseLastOSError;
if GetNumberOfEventLogRecords(hEventLog, NumberOfRecords) then Memo1.Lines.Add('NumberOfRecords = '+IntToStr(NumberOfRecords));
Buffer:=GetMemory($10000);
while True do
begin
if not ReadEventLog(hEventLog, EVENTLOG_SEQUENTIAL_READ or EVENTLOG_BACKWARDS_READ, 0, Buffer, 0, BytesRead, MinNumberOfBytesNeeded) then
begin
if GetLastError<>ERROR_INSUFFICIENT_BUFFER then Break;
if not ReadEventLog(hEventLog, EVENTLOG_SEQUENTIAL_READ or EVENTLOG_BACKWARDS_READ, 0, Buffer, MinNumberOfBytesNeeded, BytesRead, MinNumberOfBytesNeeded) then Break;
if PChar(Integer(Buffer)+SizeOf(EVENTLOGRECORD))='Microsoft-Windows-Kernel-General' then
begin
if Buffer^.EventID in [12, 13] then
Memo1.Lines.Add('RecordNumber = '+IntToStr(Buffer^.RecordNumber)+' '+PChar(Integer(Buffer)+SizeOf(EVENTLOGRECORD))+' TimeGenerated = '+DateTimeToStr(UnixToDateTime(Buffer^.TimeGenerated))+' EventID = '+IntToStr(Buffer^.EventID));
end;
end else Break;
end;
FreeMemory(Buffer);
CloseEventLog(hEventLog);
finally
Memo1.Lines.EndUpdate;
end;
end;
Кто-нибудь может мне коментарии написать? а то я, видать совсем дуб
P.S.: Кстати, не по теме, на форуме спойлеры есть?
|