Я создаю сценарий оболочки для 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.
Спасибо.