为什么并行工作流中的 Get-Winevent 要使用 PSRemoting?

为什么并行工作流中的 Get-Winevent 要使用 PSRemoting?

我正在为 Get-Winevent 构建一个包装脚本,以便使用多个搜索条件并行搜索多台计算机的事件日志。

我正在为 Get-Winevent 构建一个 XML 过滤器,然后调用这个相当简单的工作流程:

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 循环中嵌套相同的代码来改变这种情况。

谢谢。

相关内容