YuS_2
Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору LevT Цитата: Когда зудит, надо на это обратить внимание шутка Сходу не совсем понял, вечерком, в спокойной обстановке гляну... Но, кстати, скрипт мой немного не то выводит, что требовалось,судя по скрину отсюда: 18-02-2019 т.е. переделывать надо. Освобожусь - попробую перековырять... хотя уже из головы вылетело, чего я там мудрил. Добавлено: LevT 18-02-2019 Цитата: твой скрипт у меня тоже зудит | Нет, фильтр составляется неверно, если не выбран один или сразу оба аргумента (EventID или Levels), если же присутствуют оба, то фильтр работает. Добавлено: Вот, перелопаченный скрипт: Код: # Идея: https://blogs.technet.microsoft.com/ashleymcglone/2013/08/28/powershell-get-winevent-xml-madness-getting-details-from-event-logs/ # Version 2.0.1.005 # Date 27.02.2019 #requires -v 5.0 #requires -runas # Все значения, заданные в параметрах, приведены для примера, их лучше удалить и задавать в параметрах скрипта # Примеры использования: # .\script.ps1 -logname 'Microsoft-Windows-Diagnostics-Performance/Operational' -arg '^(boottime|start|bootstart|bootend)' -max 50 -eventid 100,103 -data # .\script.ps1 -logname 'Microsoft-Windows-Diagnostics-Performance/Operational' -arg '^(boottime|start|bootstart|bootend)' -max 50 -eventid 100 -data|ft # .\script.ps1 -logname 'Microsoft-Windows-Diagnostics-Performance/Operational' -arg '.' -max 50 -eventid 100,103 -data|out-gridview # .\script.ps1 -listl '*'|out-gridview # .\script.ps1 -listl '*intel*' <# Level 0 - всегда записывать; 1 - Критический; 2 - Ошибка; 3 - Предупреждение; 4 - Сведения; 5 - Подробности (Verbose). #> [cmdletbinding()] param ( [string]$computername, # Имя компьютера с которого получаем данные журналов $credential, # Ввод учетных данных [string[]]$logname, #= "Microsoft-Windows-Diagnostics-Performance/Operational", # Наименование лога (пути с именем журнала) [string[]]$listlog, # Получение списка указанных журналов событий, все журналы - * [string[]]$listprovider, # Получение списка указанных поставщиков [int64]$maxevents, #= 30, # Число событий для отчета [switch]$force, # Дополнительное получение аналитических и отладочных журналов, если используются символы подстановки [switch]$oldest, # Формирование списка от наиболее старого к новому [string[]]$path, # Путь к указанным файлам логов, поддерживаются .evt, .evtx, .etl расширения [string[]]$providername, # Получение событий, записанных указанными поставщиками (поддерживаются подстановочные знаки) [string]$arguments = '.', #'^(boottime|start|bootstart|bootend)', # Шаблон для отбора элементов из узлов EventData [int[]]$level, #= (4), # Уровни для отбора событий [int[]]$eventid, #= (100,103,108) # ID событий для отбора [switch]$data #= $true # Переключатель для получения дополнительных данных из узлов Data в отобранных событиях ) # Формируем простой фильтр XPath, если указаны $level или $eventid function map_prefix ($prefix, $var){ if ($var){ '('+ (($var|%{"{0}{1}" -f $prefix,"$_"}) -join ' or ') + ')' } } $levels = map_prefix 'Level=' $level $eventids = map_prefix 'EventID=' $eventid $arr = $eventids,$levels if ($arr -ne $null) {$flt = "*[System[$(($arr -ne $null) -join ' and ')]]"} # Формируем строку параметров командлета $pars = @{} if($computername){$pars.computername="$computername"} if($logname){$pars.logname="$logname"} if($computername -and $credential){$pars.credential = Get-Credential -cred $credential} if($listlog){$pars.listlog=$listlog} if($listprovider){$pars.listprovider=$listprovider} if($maxevents){$pars.maxevents=$maxevents} if($oldest){$pars.oldest=$true} if($force){$pars.force=$true} if($path){$pars.path=$path} if($providername){$pars.providername=$providername} if($flt){$pars.filterxpath="$flt"} if ($data){ # Получаем результат работы командлета $events = get-winevent @pars # Фильтр элементов в событиях по шаблону $elname = ([xml[]]$events.toxml()).event.eventdata.data.name $sel = if (($a = $elname -match $arguments) -eq $true){$elname} else {$a|sort -uni} $z=-1 # Добавляем свойства к объектам foreach ($event in $events){ $xml = [xml]$event.toxml() if ($xml.event.eventdata.data.count){ for ($i=0;$i -lt $xml.event.eventdata.data.count;$i++){ if($xml.event.eventdata.data[$i].name){ $name = $xml.event.eventdata.data[$i].name $val = $xml.event.eventdata.data[$i].'#text' } else { $name = 'Data' + "$i" if ($i -gt $z) {[array]$darr += $name;$z = $i} $val = $xml.event.eventdata.data[$i] } $val = if([datetime]::tryparse($val,[ref](get-date))){get-date $val} else {$val} add-member -inp $event -mem noteproperty -force -name $name -val $val } } } # Формируем строку отбираемых свойств $head = 'timecreated','id','level','leveldisplayname' if($darr){ # Фильтруем созданные свойства DataN, у которых не было аргументов $fdarr = if(($b = $darr -match $arguments) -eq $true){$darr} else {$b} if ($sel){ $sel = $head + $fdarr + $sel + '*' } else {$sel = $head + $fdarr + '*' } } elseif ($sel) { $sel = $head + $sel + '*' } else {$sel = $head + '*'} # Выводим результат $obj = try {$events|select $sel -ea 0} catch {continue} $obj|select * } else { get-winevent @pars } | Отбор параметров происходит по шаблону $arguments, с регулярными выражениями. Вывод скрипта можно откорректировать до полного вывода всех свойств (в последней строке). Выводит все доступные командлету get-winevent свойства событий, плюс дополнительно отобранные по шаблону значения узлов Data (именованных и не именованных тоже) Добавлено: история | Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 15:10 19-02-2019 | Исправлено: YuS_2, 09:36 30-01-2020 |
|