Проблемы PowerShell Get-Winevent по ключевым словам и имени поставщика - PullRequest
0 голосов
/ 26 мая 2018

Я новичок в powershell и довольно много учусь.Но все еще впереди.Так что мой код не самый надежный.

Я создал инструмент поиска по журналу событий.Это позволяет мне выполнять поиск по идентификатору, уровню ошибки, ключевому слову и т. Д. По большей части это работает, за исключением ключевых слов и имени поставщика.

В настоящее время при попытке поиска в журналах по ключевому слову или набору ключевых слов сценарий выдает сообщение об ошибке:

Get-WinEvent: указанный файл изображения не содержитраздел ресурсов: C: \ Users \ Rob \ Google Drive \ Powershell \ Get-logs.ps1: 65 char: 9 + Get-WinEvent -FilterHashtable @ {Logname = $ Log} -ComputerName $ Computer |... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: NotSpecified: (:) [Get-WinEvent], EventLogException + FullyQualifiedErrorId: указанный файл изображения не содержит ресурсараздел Microsoft.PowerShell.Commands.GetWinEventCommand

Проблема в том, что я не понимаю символ ps1.65: 9 бит.Затем сценарий продолжается и получает из журнала старые нерелевантные данные.

Вот код для двух областей, которые у меня возникли.Полный код в конце.

Поиск по ключевому слову:

elseif ($Kwrd -gt "a"){
    foreach ($Kwrd in $Kwrd)
    {
        Get-WinEvent -FilterHashtable @{logname=$Log} -ComputerName $Computer | where-object  { $_.Message -like "*$Kwrd*" }  | Sort-Object TimeGenerated -Descending | Select-Object -First $Maxnum | Format-List  
        }
    }

Поиск имени поставщика:

elseif ($Prov.Length -gt 1){
        Get-WinEvent -FilterHashtable @{Logname=$Log} -ComputerName $Computer | Where-Object {($_.ProviderName -like "*$Prov*")}  | Sort-Object TimeGenerated -Descending|Select-Object -First $Maxnum | Format-List  
        }

Так, например, если я хотел найти в журнале приложений имя поставщика, Восстановление системы,(Который у меня там есть из приложения Revo, которое я недавно запускал), это то, что делает скрипт.

Enter Computer or EXIT to quit: office
Enter log set to retrieve: application
Enter Instance ID or leave blank: 
Enter number of logs to retrieve: 10
Enter error level or leave blank: 
Search logs by keyword or leave blank: 
Search by Provider or leave blank: System Restore
Get-WinEvent : The specified image file did not contain a resource section
At C:\Users\Rob\Google Drive\Powershell\Get-logs.ps1:65 char:9
+         Get-WinEvent -FilterHashtable @{Logname=$Log} -ComputerName $Computer |  ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Get-WinEvent], EventLogException
    + FullyQualifiedErrorId : The specified image file did not contain a resource section,Microsoft.PowerShell.Commands.GetWinEventCommand


PS C:\Users\Rob> 

Это та же проблема для поиска по ключевым словам.То же сообщение об ошибке.Разница лишь в том, что номер строки изменяется с 65 на 61, так как код находится на строке 61.

Это не идеально, но я учусь по ходу дела.Вот полный сценарий.Любая идея, как я могу получить информацию из журналов без ошибки?

Clear-Host

while (1 -ne 2){

$Computer = $Null
$IDNum = $Null
$Lvl = $Null
$Kwrd = $Null
$Prov = $Null


Write-Host ''
$Computer = Read-Host "Enter Computer or EXIT to quit"
if ($Computer -eq "EXIT") {exit;}

$Log = Read-Host "Enter log set to retrieve"
$IDNum = Read-Host "Enter Instance ID or leave blank"
$IDNum = $IDNum.Split(',')
$MaxNum = $MaxNum = Read-Host "Enter number of logs to retrieve"
$Lvl = Read-Host "Enter error level or leave blank"
$Lvl = $Lvl.Split(',')
$Kwrd = Read-Host "Search logs by keyword or leave blank"
$Kwrd = $Kwrd.Split(',')
$Prov = Read-Host "Search by Provider or leave blank"




if ($IDNum.Length -gt 1){

    foreach ($IDNum in $IDNum)
    {
        Get-WinEvent -FilterHashTable @{LogName=$Log; ID=$IDNum} -ComputerName $Computer | Where-Object { ($_.ID -eq "*$IDNum*")} |Sort-Object TimeGenerated -Descending | Select-Object -First $Maxnum| Format-List 
        }
    }

elseif ($Lvl -gt 1 ){
    foreach ($Lvl in $Lvl)
    {
        Get-WinEvent -FilterHashTable @{LogName=$Log;Level=$lvl} -ComputerName $Computer -MaxEvents $MaxNum |Select-Object -First $MaxNum | Sort-Object TimeGenerated -Descending  | Format-List 
        }
    }

elseif ($Kwrd -gt "a"){
    foreach ($Kwrd in $Kwrd)
    {
        Get-WinEvent -FilterHashtable @{logname=$Log} -ComputerName $Computer | where-object  { $_.Message -like "*$Kwrd*" }  | Sort-Object TimeGenerated -Descending | Select-Object -First $Maxnum | Format-List  
        }
    }
elseif ($Prov.Length -gt 1){
        Get-WinEvent -FilterHashtable @{Logname=$Log} -ComputerName $Computer | Where-Object {($_.ProviderName -like "*$Prov*")}  | Sort-Object TimeGenerated -Descending|Select-Object -First $Maxnum | Format-List  
        }

else {
         Get-WinEvent -LogName $Log -ComputerName $Computer  | Sort-Object TimeGenerated -Descending| Select-Object -First $MaxNum | Format-List 
     }



} else{

Clear-Host
$log = $IDNum = $MaxNum = $Lvl = $Kwrd = $Prov = $Null
continue
Write-Host ''
Write-Host ''
}

Спасибо.

1 Ответ

0 голосов
/ 26 мая 2018

Примечание: я запускаю ISE от имени администратора.

Пара комментариев

1) Я не могу воссоздать ошибку (ваш скрипт нормально работал на моей машине), но он ведет себя какхотя он пытается открыть / прочитать файл изображения (очень странно).

2) Я попытался запустить get-winevent без параметров, и я получил много ошибок get-winevent : The data is invalid.Когда я исследовал эту ошибку, я узнал, что get-winevent кажется ошибочным / проблемным / суетливым cmdlet.Итак, я предлагаю вам попробовать get-eventlog вместо

3) Вы вызываете Get-WinEvent внутри цикла, что заставляет программу работать намного дольше, чем необходимо.Я предлагаю вам выполнить Get-EventLog (см. Комментарий № 2 выше) один раз и направить вывод в out-gridview.Например:

Get-EventLog -LogName application | out-gridview -Title "App log events"

Затем используйте фильтры out-gridview, чтобы отобразить только тот вывод, который вы хотите увидеть.

Пример вывода для приведенной выше команды:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...