PS Get-WinEvent бросить "Дескриптор недействителен"

У меня есть список имен хостов, из которых я хотел бы извлечь все журналы событий, связанные с AppLocker, особенно те, которые содержат предупреждение об уровне и / или ошибку. Я создал этот скрипт:

$ComputersToCheck = Get-Content 'X:\ListWithTheNames.txt'
foreach($OneHost in $ComputersToCheck)
{
try
{
    $EventCollection = Get-WinEvent -LogName "Microsoft-Windows-AppLocker/EXE and DLL" -ComputerName $OneHost -Credential $CredentialFromUser
    foreach ($SingelEvent in $EventCollection)
    {
        if($SingelEvent.LevelDisplayName -ne "Information")
        {
            $pathtosaveto = 'SomeFileName.txt'
            $ResultString += $SingelEvent | Select Message,MachineName,UserId | Export-Csv -Path $pathtosaveto -Append                
            }
        }
    }
catch 
{
    //handling exceptions
 }    
}

Это работает какое-то время, но через некоторое время я получил ошибку:

Get-WinEvent : The remote procedure call failed
At X:\FileName.ps1:22 char:28
+         $EventCollection = Get-WinEvent -LogName "Microsoft-Windows-AppLocker/EX ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [Get-WinEvent], EventLogException
+ FullyQualifiedErrorId : The remote procedure call failed,Microsoft.PowerShell.Commands.GetWinEventCommand

И сразу после того, как скрипт начинает выдавать ошибки вроде этого:

Get-WinEvent : The handle is invalid
At X:\FileName.ps1:22 char:28
+         $EventCollection = Get-WinEvent -LogName "Microsoft-Windows-AppLocker/EX ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [Get-WinEvent], EventLogException
+ FullyQualifiedErrorId : The handle is invalid,Microsoft.PowerShell.Commands.GetWinEventCommand

Сначала я подумал, что это связано с хостом, к которому пытается обратиться скрипт, но следующий в списке тот же тип (Os, даже та же модель), что и предыдущий.

Я запускал скрипт 3 раза, и каждый раз выходной размер был разным (вероятно, потому что не одни и те же хосты были в сети с одинаковым количеством журналов). Сценарий должен работать с более чем 700 хостами, которым требуется специальная учетная запись, которую я запрашиваю с помощью Get-Credential, сохраняю в переменной и передаю в качестве параметра Get-WinEvent.

Честно говоря, я застрял с этой проблемой, не совсем уверен, что является причиной этого и почему.

Если у кого есть идея, пожалуйста, поделитесь со мной:)

1 ответ

Попробуйте попробовать перехватить ссылки на неудачные хосты и пустые объекты. Вы можете написать полученное исключение, но я не включил его в это, чтобы сделать файл failhosts простым для чтения. Надеюсь, я понял это правильно, так как у меня есть крылья, и у меня нет реальных оснований для проверки.

$ComputersToCheck = Get-Content 'X:\ListWithTheNames.txt'
foreach($OneHost in $ComputersToCheck) {
try {
    $EventCollection = Get-WinEvent -LogName "Microsoft-Windows-AppLocker/EXE and DLL" -ComputerName $OneHost -Credential $CredentialFromUser -ErrorAction Stop

    if($EventCollection) { 
        foreach ($SingelEvent in $EventCollection) {
            if($SingelEvent.LevelDisplayName -ne "Information") {
                $pathtosaveto = 'SomeFileName.txt'
                $ResultString += $SingelEvent | Select Message,MachineName,UserId | Export-Csv -Path $pathtosaveto -Append                
                }
            }
        } else {
            Out-File -InputObject $($OneHost + " Empty Event Collection") -FilePath "C:\FailedHosts.txt" -Append -Encoding ascii 
        }
    } 
catch {
    Out-File -InputObject $($OneHost + " Failed Connection") -FilePath "C:\FailedHosts.txt" -Append -Encoding ascii 
 }    
}
Другие вопросы по тегам