Estou criando um script de wrapper para o Get-Winevent para pesquisar vários logs de eventos de computadores em paralelo, usando vários critérios de pesquisa.
Estou criando um filtro XML para o Get-Winevent e, em seguida, chamo esse fluxo de trabalho bastante simples:
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
}
}
}
Mas quando eu executo o script, recebo o erro:
Could not find a parameter named 'ComputerName'. Remote connectivity in this command is handled by the 'PSComputerName' parameter.
No entanto, eu não quero depender do PSRemoting (que não está habilitado em todos os nossos servidores), e o Get-Winevent absolutamente suporta a consulta de sistemas remotos sem recorrer ao PSRemoting.
Após muita tentativa e erro, adicionei um ForEach-loop fictício com apenas uma iteração, usando uma variável que não afeta a execução. Isso funciona como planejado - PSRemoting não é necessário (eu posso usar -ComputerName em vez de -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
}
}
}
}
Isso não deve causar sobrecarga, portanto, posso viver com essa correção. No entanto, estou muito curioso para saber porque o Get-Winevent requer o uso de PSRemoting no fluxo de trabalho original, e por que isso muda aninhando o mesmo código em um ForEach-loop.
Obrigado.