Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.12.2015, 17:47
VKoonts VKoonts вне форума
Прохожий
 
Регистрация: 06.12.2015
Сообщения: 13
Версия Delphi: XE8 v.22xx
Репутация: 10
Сообщение Журнал событий Windows

Всем привет!
Давно ищу, компоненту для чтения журнала событий windows, может кто натыкался на подобную, или знает как прочесть содержимое журналов?
Нужно не записывать, а именно читать и копировать содержимое журнала средствами Delphi.
Ответить с цитированием
  #2  
Старый 06.12.2015, 18:33
VKoonts VKoonts вне форума
Прохожий
 
Регистрация: 06.12.2015
Сообщения: 13
Версия Delphi: XE8 v.22xx
Репутация: 10
По умолчанию

В винде есть такая замечательная вещь как "wevtutil" - это оператор для командной строки. Дак вот, можно написать батник примено такой:
Код:
wevtutil qe system /rd:true /f:text> G:\System_Log.txt
И на выходе будет txt файл с красиво оформленными событиями, а затем уже в делфе можно все это перебрать.

Но все же хотелось бы более изящный способ.
Ответить с цитированием
  #3  
Старый 06.12.2015, 23:02
lmikle lmikle сейчас на форуме
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А что, без компонента никак?
Там, вроде, набор функций простой. Читать отсюда: https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
Ответить с цитированием
  #4  
Старый 07.12.2015, 01:33
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Посмотрел примерчик по ссылке и вот задался вопросом, почему сравнение в примере оформлено вот так?
Код:
if (NULL == pBuffer)
я понимаю, что компилятору без разницы, но почему все-же задом наперед?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 07.12.2015, 07:32
lmikle lmikle сейчас на форуме
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Страдалецъ
Посмотрел примерчик по ссылке и вот задался вопросом, почему сравнение в примере оформлено вот так?
Код:
if (NULL == pBuffer)
я понимаю, что компилятору без разницы, но почему все-же задом наперед?

Это известная парадигма. Дело в том, что C/C++, как и некоторые другие ЯВУ, позволяют делать операции присваивания внутри условных операторов. Т.е. при банальной очепятке у тебя может получиться вот такой код:
Код:
if (pBuffer = NULL) ...
Этот код прекрасно компилируется, но вот логика его будет неправильная. А если ты опечатаешься когда NULL идет первым в условии, то получишь ошибку компиляции...
Ответить с цитированием
  #6  
Старый 07.12.2015, 19:58
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

О как, даже не подумал о такой возможности.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #7  
Старый 08.12.2015, 04:50
VKoonts VKoonts вне форума
Прохожий
 
Регистрация: 06.12.2015
Сообщения: 13
Версия Delphi: XE8 v.22xx
Репутация: 10
По умолчанию

Ребят, не сочтите за труд, пример с использованием ReadEventLog в дельфинском синтаксисе. С какого боку с этой функции подойти?
какие параметры у нее и что возвращает?

Спасибо за ответы.
Ответить с цитированием
  #8  
Старый 08.12.2015, 07:17
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
По умолчанию

http://www.delphisources.ru/forum/sh...ad.php?t=26956

Вот. Когда то мне помогли.
Ответить с цитированием
  #9  
Старый 08.12.2015, 10:09
VKoonts VKoonts вне форума
Прохожий
 
Регистрация: 06.12.2015
Сообщения: 13
Версия Delphi: XE8 v.22xx
Репутация: 10
По умолчанию

Цитата:
Сообщение от Romix
http://www.delphisources.ru/forum/sh...ad.php?t=26956

Вот. Когда то мне помогли.

Спасибо, примеры интересные.
Но в этом примере я не пойму, что вообще программа делает:
Код:
{$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  
Старый 08.12.2015, 11:27
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
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  
Старый 08.12.2015, 12:41
VKoonts VKoonts вне форума
Прохожий
 
Регистрация: 06.12.2015
Сообщения: 13
Версия Delphi: XE8 v.22xx
Репутация: 10
По умолчанию

Здорово! Только ничего не понятно. Программа компилится, но вообще не понятно что делает. сымитировал системную ошибку, никакой реакции.
Ответить с цитированием
  #12  
Старый 08.12.2015, 14:09
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

программа выдает содержимое журнала Windows "Система"
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #13  
Старый 09.12.2015, 10:19
VKoonts VKoonts вне форума
Прохожий
 
Регистрация: 06.12.2015
Сообщения: 13
Версия Delphi: XE8 v.22xx
Репутация: 10
По умолчанию

У меня ничего не показывает =(

Ответить с цитированием
  #14  
Старый 09.12.2015, 10:32
VKoonts VKoonts вне форума
Прохожий
 
Регистрация: 06.12.2015
Сообщения: 13
Версия Delphi: XE8 v.22xx
Репутация: 10
По умолчанию

Разобрался... при формировании формы не проходит код. Добавил кнопку в которой этот код... и все заработало, осталось в божеский вид это все привести Огромное спасибо!

Ответить с цитированием
  #15  
Старый 09.12.2015, 11:12
VKoonts VKoonts вне форума
Прохожий
 
Регистрация: 06.12.2015
Сообщения: 13
Версия Delphi: XE8 v.22xx
Репутация: 10
По умолчанию

Не уверен что все правильно переводится:

Код:
        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 часов =(
по Гринвичу чтоли отображается?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:36.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter