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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.11.2013, 17:55
Lord_Vlad Lord_Vlad вне форума
Прохожий
 
Регистрация: 28.11.2013
Адрес: Москва
Сообщения: 19
Версия Delphi: Delphi 10
Репутация: 10
Вопрос Доступ к журналу событий системы

Доброго времени суток, форумчане

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

По долгу рабочему столкнулся с задачей чтения журнала событий Windows 7 и Windows Server 2003-2008.
В целом проблем не возникло. Все разделы читаются полностью и без проблем, кроме раздела Security - при его чтении ответ пустой. Просто пустой.

Прошу вашей помощи, может посоветуете, как получить доступ к этому разделу.

Заранее спасибо, и привожу свой код

Код:
procedure TForm1.GetLogEvents;
  const
    wbemFlagForwardOnly = $00000020;
  var
    FSWbemLocator : OLEVariant;
    FWMIService : OLEVariant;
    FWbemObjectSet: OLEVariant;
    FWbemObject : OLEVariant;
    oEnum : IEnumvariant;
    iValue : LongWord;
    Insertion     : array of String;
    I: integer;
  begin
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
    FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
    FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_NTLogEvent Where LogFile="Security"','WQL',wbemFlagForwardOnly);
    oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
    while oEnum.Next(1, FWbemObject, iValue) = 0 do begin
      Form1.Memo1.Lines.Append(Format('Category %s',[String(FWbemObject.Category)]));
      Form1.Memo1.Lines.Append(Format('Computer Name %s',[String(FWbemObject.ComputerName)]));
      Form1.Memo1.Lines.Append(Format('EventCode %d',[Integer(FWbemObject.EventCode)]));
      Form1.Memo1.Lines.Append(Format('RecordNumber %d',[Integer(FWbemObject.RecordNumber)]));
      Form1.Memo1.Lines.Append(Format('Source Name %s',[String(FWbemObject.SourceName)]));

      Memo1.Lines.Append('------------------------------------------');

      FWbemObject:=Unassigned;
    end;
  end;
Ответить с цитированием
  #2  
Старый 28.11.2013, 19:05
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Lord_Vlad
Доброго времени суток, форумчане

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

По долгу рабочему столкнулся с задачей чтения журнала событий Windows 7 и Windows Server 2003-2008.
В целом проблем не возникло. Все разделы читаются полностью и без проблем, кроме раздела Security - при его чтении ответ пустой. Просто пустой.

Прошу вашей помощи, может посоветуете, как получить доступ к этому разделу.

Заранее спасибо, и привожу свой код
Через WMI я события журнала "Security" не читал, но через стандартные API-функции (OpenEventLog, ReadEventLog, ...) журнал "Security" я читал без проблем. Но правда только с правами администратора.
Ответить с цитированием
  #3  
Старый 28.11.2013, 20:26
Lord_Vlad Lord_Vlad вне форума
Прохожий
 
Регистрация: 28.11.2013
Адрес: Москва
Сообщения: 19
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Через WMI я события журнала "Security" не читал, но через стандартные API-функции (OpenEventLog, ReadEventLog, ...) журнал "Security" я читал без проблем. Но правда только с правами администратора.

Да, стандартными я тоже читал, через ReadEventLog().
Однако там я так и не смог придумать, как отличить события:
- создание файла;
- чтение файла (или атрибутов файла);
- перемещение файла;
- удаление файла.

А через WMI оно читается через "InsertionStrings" записи журнала, которые через API недоступны

Если же есть опыт подобного отслеживания через API, буду премного благодарен, если поделитесь
Ответить с цитированием
  #4  
Старый 29.11.2013, 01:42
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Lord_Vlad
Код:
procedure TForm1.GetLogEvents;
  const
    wbemFlagForwardOnly = $00000020;
  var
    FSWbemLocator : OLEVariant;
    FWMIService : OLEVariant;
    FWbemObjectSet: OLEVariant;
    FWbemObject : OLEVariant;
    oEnum : IEnumvariant;
    iValue : LongWord;
    Insertion     : array of String;
    I: integer;
  begin
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
    FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
    FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_NTLogEvent Where LogFile="Security"','WQL',wbemFlagForwardOnly);
    oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
    while oEnum.Next(1, FWbemObject, iValue) = 0 do begin
      Form1.Memo1.Lines.Append(Format('Category %s',[String(FWbemObject.Category)]));
      Form1.Memo1.Lines.Append(Format('Computer Name %s',[String(FWbemObject.ComputerName)]));
      Form1.Memo1.Lines.Append(Format('EventCode %d',[Integer(FWbemObject.EventCode)]));
      Form1.Memo1.Lines.Append(Format('RecordNumber %d',[Integer(FWbemObject.RecordNumber)]));
      Form1.Memo1.Lines.Append(Format('Source Name %s',[String(FWbemObject.SourceName)]));

      Memo1.Lines.Append('------------------------------------------');

      FWbemObject:=Unassigned;
    end;
  end;
Проверил этот код у себя на Windows7 - прекрасно всё работает без каких либо изменений.
Но конечно же только с правами администратора - без прав администратора возвращает пустой ответ - похоже как раз твой случай.
Ответить с цитированием
  #5  
Старый 29.11.2013, 01:55
Lord_Vlad Lord_Vlad вне форума
Прохожий
 
Регистрация: 28.11.2013
Адрес: Москва
Сообщения: 19
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию

Прости, мы говорим о запуске из-под администратора?
Запускаю из-под учетки админа, даже от имени админа - ответ пустой именно в разделе Security. Остальные разделы - нормально
Ответить с цитированием
  #6  
Старый 29.11.2013, 02:15
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Lord_Vlad
Прости, мы говорим о запуске из-под администратора?
Запускаю из-под учетки админа, даже от имени админа - ответ пустой именно в разделе Security. Остальные разделы - нормально
Ы? Как это такое может быть? Вот я сделал мини-тест: http://yadi.sk/d/9wEiRoaIDVDuD (исходники с exe-шником, компилировано в Delphi7) - запусти под администратором и нажми кнопку Button1.
Ответить с цитированием
  #7  
Старый 29.11.2013, 10:52
Lord_Vlad Lord_Vlad вне форума
Прохожий
 
Регистрация: 28.11.2013
Адрес: Москва
Сообщения: 19
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию

poli-smen, спасибо!

Проверил на двух машинках:
- недоменный ноут, Win7 x64, учетка админа, с правами админа - ответ пустой;
- доменный комп, Win7 x64, учетка админа, с правами админа - ответ есть!

Вот теперь вопрос перерос в "как это так?!"
Ответить с цитированием
  #8  
Старый 29.11.2013, 11:22
Lord_Vlad Lord_Vlad вне форума
Прохожий
 
Регистрация: 28.11.2013
Адрес: Москва
Сообщения: 19
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию

Нашел корень зла

Отключил Аваст, перезапустил журнал, все пошло!

Аваст - ***аст

Еще раз величайшее спасибо!))
Ответить с цитированием
  #9  
Старый 29.11.2013, 11:26
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Lord_Vlad
poli-smen, спасибо!

Проверил на двух машинках:
- недоменный ноут, Win7 x64, учетка админа, с правами админа - ответ пустой;
- доменный комп, Win7 x64, учетка админа, с правами админа - ответ есть!

Вот теперь вопрос перерос в "как это так?!"
У меня ситуация оказалась противоположная - вчера на домашнем Windows7 нормально работало, а сегодня на доменном (и Win7 и WinXP) выдаёт пустой ответ. В ходе экспериментов оказалось, что если в запросе перечислить только нужные поля (вместо выбора всех указанием символа "*"), то на Win7 (доменном) начинает работать (под админом естественно), а под WinXP (тоже доменным) всё также возвращает пусто. Нужно дальше копать...

p.s. Я уже давно заметил, что WMI весьма глючная вещь, но иногда без неё не обойтись. Например выключить или перезагрузить удалённый компьютер можно через API-функцию InitiateSystemShutdown, но я так и не нашёл как можно через API завершить сеанс пользователя (LogOff) на удалённом компьютере, а с WMI можно через класс "Win32_OperatingSystem" методом "Win32Shutdown(EWX_LOGOFF, 0)". Или например прочитать серийный номер BIOS на удалённом компьютере через класс "Win32_BIOS.SerialNumber" (у нас поставщик компьютеров вшивает в BIOS каждого компьютера уникальный серийный номер, что весьма помогает при инвентаризации).
Ответить с цитированием
  #10  
Старый 29.11.2013, 12:13
Lord_Vlad Lord_Vlad вне форума
Прохожий
 
Регистрация: 28.11.2013
Адрес: Москва
Сообщения: 19
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию

poli-smen, вот с инвентаризацией через серийник биос - это тема интересная и актуальная, надо бы и мне ее покурить будет.

Ну как ни странно, у меня все заработало, а почему именно WMI, я уже выше описывал Есть свои существенные плюсы, но и без минусов никуда, конечно...
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter