Назад | Перейти на главную страницу

Почему Get-Winevent в параллельном рабочем процессе хочет использовать PSRemoting?

Я создаю сценарий оболочки для Get-Winevent для параллельного поиска в журналах событий нескольких компьютеров, используя несколько критериев поиска.

Я создаю XML-фильтр для Get-Winevent, а затем вызываю этот довольно простой рабочий процесс:

WorkFlow Get-ParallelEvent {

    Param(
        [string[]]$Computers,
        [string]$FilterXml
    )

    #Query computers
    ForEach -Parallel ($Computer in $Computers) {
            If (Test-Connection $Computer -Count 1 -ErrorAction SilentlyContinue) {
                Get-WinEvent -ComputerName  $Computer -FilterXml $FilterXml -ErrorAction SilentlyContinue
            }
    }
}

Но когда я запускаю скрипт, я получаю ошибку:

Не удалось найти параметр с именем ComputerName. Удаленное подключение в этой команде обрабатывается параметром «PSComputerName».

Однако я не хочу зависеть от PSRemoting (который не включен на всех наших серверах), а Get-Winevent абсолютно поддерживает запросы к удаленным системам, не прибегая к PSRemoting.

После долгих проб и ошибок я добавил фиктивный цикл ForEach всего за одну итерацию, используя переменную, не влияющую на выполнение. Это работает по назначению - PSRemoting не требуется (я могу использовать -ComputerName вместо -PSComputerName):

WorkFlow Get-ParallelEvent {

    Param(
        [string[]]$Computers,
        [string]$FilterXml
    )

    #Query computers
    @('dummy') | ForEach {
        ForEach -Parallel ($Computer in $Computers) {
            If (Test-Connection $Computer -Count 1 -ErrorAction SilentlyContinue) {
                Get-WinEvent -ComputerName  $Computer -FilterXml $FilterXml -ErrorAction SilentlyContinue
            }
        }
    }
}

Это не должно вызывать никаких накладных расходов, поэтому я могу жить с этим исправлением. Однако мне очень любопытно, почему Get-Winevent требует использования PSRemoting в исходном рабочем процессе и почему это изменяется путем вложения того же кода в цикл ForEach.

Спасибо.