|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Журнал событий Windows
Всем привет!
Давно ищу, компоненту для чтения журнала событий 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 часов =( по Гринвичу чтоли отображается? |