![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Всем привет!
Давно ищу, компоненту для чтения журнала событий windows, может кто натыкался на подобную, или знает как прочесть содержимое журналов? Нужно не записывать, а именно читать и копировать содержимое журнала средствами Delphi. |
|
#2
|
|||
|
|||
|
В винде есть такая замечательная вещь как "wevtutil" - это оператор для командной строки. Дак вот, можно написать батник примено такой:
Код:
wevtutil qe system /rd:true /f:text> G:\System_Log.txt Но все же хотелось бы более изящный способ. |
|
#3
|
|||
|
|||
|
А что, без компонента никак?
Там, вроде, набор функций простой. Читать отсюда: https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx |
|
#4
|
||||
|
||||
|
Посмотрел примерчик по ссылке и вот задался вопросом, почему сравнение в примере оформлено вот так?
Код:
if (NULL == pBuffer) |
|
#5
|
|||
|
|||
|
Цитата:
Это известная парадигма. Дело в том, что C/C++, как и некоторые другие ЯВУ, позволяют делать операции присваивания внутри условных операторов. Т.е. при банальной очепятке у тебя может получиться вот такой код: Код:
if (pBuffer = NULL) ... |
|
#6
|
||||
|
||||
|
О как, даже не подумал о такой возможности.
|
|
#7
|
|||
|
|||
|
Ребят, не сочтите за труд, пример с использованием ReadEventLog в дельфинском синтаксисе. С какого боку с этой функции подойти?
какие параметры у нее и что возвращает? Спасибо за ответы. |
|
#8
|
|||
|
|||
|
|
|
#9
|
|||
|
|||
|
Цитата:
Спасибо, примеры интересные. Но в этом примере я не пойму, что вообще программа делает: Код:
{$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.: Кстати, не по теме, на форуме спойлеры есть? |
|
#10
|
||||
|
||||
|
Код:
unit Unit1;
interface
uses
DateUtils,
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type
PEVENTLOGRECORD = ^EVENTLOGRECORD;
EVENTLOGRECORD = record
Length: DWORD;
Reserved: DWORD;
RecordNumber: DWORD;
TimeGenerated: DWORD;
TimeWritten: DWORD;
EventID: DWORD;
EventType: Word;
NumStrings: Word;
EventCategory: Word;
ReservedFlags: Word;
ClosingRecordNumber: DWORD;
StringOffset: DWORD;
UserSidLength: DWORD;
UserSidOffset: DWORD;
DataLength: DWORD;
DataOffset: DWORD;
end;
const
EVENTLOG_SEQUENTIAL_READ = 1;
EVENTLOG_SEEK_READ = 2;
EVENTLOG_FORWARDS_READ = 4;
EVENTLOG_BACKWARDS_READ = 8;
procedure TForm1.FormCreate(Sender: TObject);
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;
Memo1.Lines.Add('RecordNumber = '+IntToStr(Buffer^.RecordNumber)+' '+PChar(Integer(Buffer)+SizeOf(EVENTLOGRECORD))+' TimeGenerated = '+DateTimeToStr(UnixToDateTime(Buffer^.TimeGenerated))+' EventID = '+IntToStr(Buffer^.EventID));
end else Break;
end;
FreeMemory(Buffer);
CloseEventLog(hEventLog);
finally
Memo1.Lines.EndUpdate;
end;
end;
end. |
|
#11
|
|||
|
|||
|
Здорово! Только ничего не понятно. Программа компилится, но вообще не понятно что делает. сымитировал системную ошибку, никакой реакции.
![]() |
|
#12
|
||||
|
||||
|
программа выдает содержимое журнала Windows "Система"
|
|
#13
|
|||
|
|||
|
У меня ничего не показывает =(
![]() |
|
#14
|
|||
|
|||
|
Разобрался... при формировании формы не проходит код. Добавил кнопку в которой этот код... и все заработало, осталось в божеский вид это все привести
Огромное спасибо! ![]() |
|
#15
|
|||
|
|||
|
Не уверен что все правильно переводится:
Код:
Memo1.Lines.Add('RecordNumber = '+IntToStr(Buffer^.RecordNumber));
Memo1.Lines.Add('Источник: '+PChar(Integer(Buffer)+SizeOf(EVENTLOGRECORD)));
Memo1.Lines.Add('Дата и время: '+DateTimeToStr(UnixToDateTime(Buffer^.TimeGenerated)));
Memo1.Lines.Add('Код события: '+IntToStr(Buffer^.EventID));
Memo1.Lines.Add('Length: '+IntToStr(Buffer^.Length));
Memo1.Lines.Add('Reserved: '+IntToStr(Buffer^.Reserved));
Memo1.Lines.Add('TimeWritten: '+IntToStr(Buffer^.TimeWritten));
Memo1.Lines.Add('EventType: '+IntToStr(Buffer^.EventType));
Memo1.Lines.Add('NumStrings: '+IntToStr(Buffer^.NumStrings));
Memo1.Lines.Add('EventCategory: '+IntToStr(Buffer^.EventCategory));
Memo1.Lines.Add('ReservedFlags: '+IntToStr(Buffer^.ReservedFlags));
Memo1.Lines.Add('ClosingRecordNumber: '+IntToStr(Buffer^.ClosingRecordNumber));
Memo1.Lines.Add('StringOffset: '+IntToStr(Buffer^.StringOffset));
Memo1.Lines.Add('UserSidLength: '+IntToStr(Buffer^.UserSidLength));
Memo1.Lines.Add('UserSidOffset: '+IntToStr(Buffer^.UserSidOffset));
Memo1.Lines.Add('DataLength: '+IntToStr(Buffer^.DataLength));
Memo1.Lines.Add('DataOffset: '+IntToStr(Buffer^.DataOffset));И код события не всегда корректно отображается: ![]() Черный верно, а красный нет. И описание события как вставить? И время почему то -8 часов =( по Гринвичу чтоли отображается? |