![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Доброго времени суток, форумчане
Давно читаю форум, многим помогали ответы в темах. Однако сейчас я вынужден задать вопрос. По долгу рабочему столкнулся с задачей чтения журнала событий 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
|
||||
|
||||
|
Цитата:
|
|
#3
|
|||
|
|||
|
Цитата:
Да, стандартными я тоже читал, через ReadEventLog(). Однако там я так и не смог придумать, как отличить события: - создание файла; - чтение файла (или атрибутов файла); - перемещение файла; - удаление файла. А через WMI оно читается через "InsertionStrings" записи журнала, которые через API недоступны Если же есть опыт подобного отслеживания через API, буду премного благодарен, если поделитесь ![]() |
|
#4
|
||||
|
||||
|
Цитата:
Но конечно же только с правами администратора - без прав администратора возвращает пустой ответ - похоже как раз твой случай. |
|
#5
|
|||
|
|||
|
Прости, мы говорим о запуске из-под администратора?
Запускаю из-под учетки админа, даже от имени админа - ответ пустой именно в разделе Security. Остальные разделы - нормально ![]() |
|
#6
|
||||
|
||||
|
Цитата:
|
|
#7
|
|||
|
|||
|
poli-smen, спасибо!
Проверил на двух машинках: - недоменный ноут, Win7 x64, учетка админа, с правами админа - ответ пустой; - доменный комп, Win7 x64, учетка админа, с правами админа - ответ есть! Вот теперь вопрос перерос в "как это так?!" ![]() |
|
#8
|
|||
|
|||
|
Нашел корень зла
Отключил Аваст, перезапустил журнал, все пошло! Аваст - ***аст Еще раз величайшее спасибо!)) |
|
#9
|
||||
|
||||
|
Цитата:
p.s. Я уже давно заметил, что WMI весьма глючная вещь, но иногда без неё не обойтись. Например выключить или перезагрузить удалённый компьютер можно через API-функцию InitiateSystemShutdown, но я так и не нашёл как можно через API завершить сеанс пользователя (LogOff) на удалённом компьютере, а с WMI можно через класс "Win32_OperatingSystem" методом "Win32Shutdown(EWX_LOGOFF, 0)". Или например прочитать серийный номер BIOS на удалённом компьютере через класс "Win32_BIOS.SerialNumber" (у нас поставщик компьютеров вшивает в BIOS каждого компьютера уникальный серийный номер, что весьма помогает при инвентаризации). |
|
#10
|
|||
|
|||
|
poli-smen, вот с инвентаризацией через серийник биос - это тема интересная и актуальная, надо бы и мне ее покурить будет.
Ну как ни странно, у меня все заработало, а почему именно WMI, я уже выше описывал Есть свои существенные плюсы, но и без минусов никуда, конечно... |