Powershell - 从远程计算机上的 Invoke-Command 运行 exe 捕获输出

Powershell - capture output from Invoke-Command running exe on remote machine

我需要在一组远程服务器上配置审核策略。我正在尝试在每台服务器上使用 Invoke-Command commandlet 运行 auditpol.exe。问题是我似乎无法捕获 auditpol 命令的任何输出。

我尝试了显而易见的方法(将 Invoke-Command 的结果分配给一个字符串):

> $command =  "Start-Process -FilePath `"auditpol.exe`" -ArgumentList `"/set`", `"/subcategory`", `"```"File System```"`", `"/success:enable`""
> $command
"auditpol.exe" -ArgumentList "/set", "/subcategory", "`"File System`"", "/success:enable"

> $out = Invoke-Command -ComputerName MyServer -ScriptBlock {$command}
> $out
>

但是 $out 是空的。

我还使用 Wait-Job 和 Receive-Job 尝试了 this MSDN blog 中详述的方法。结果有些希望,但尚无定论:

> $command =  "Start-Process -FilePath `"auditpol.exe`" -ArgumentList `"/set`", `"/subcategory`", `"```"File System```"`", `"/success:enable`""
> $command
"auditpol.exe" -ArgumentList "/set", "/subcategory", "`"File System`"", "/success:enable"
> $job = Invoke-Command -ComputerName MyServer -ScriptBlock {$command} -AsJob
> Wait-Job $job

Id              Name            State      HasMoreData     Location             Command                  
--              ----            -----      -----------     --------             -------                  
3               Job3            Completed  True            MyServer  $command

> $output = Receive-Job $job
> $output
>

我希望能够使用 Receive-Job 从 auditpol.exe 捕获实际输出,但如上所述,情况似乎并非如此。

我确实从 Wait-Job 那里得到了一些信息。根据 Microsoft documentation of Wait-Job State=Completed should 表明操作成功,但我不完全相信它真的可以看到 auditpol 操作是否成功或不。任何建议将不胜感激!

到运行一个控制台程序同步并且它的stdout和stderr输出可用于捕获调用它直接 - 不要使用Start-Process(无论你是运行本地程序还是远程程序,通过Invoke-Command):

$out = Invoke-Command -ComputerName MyServer -ScriptBlock {
  auditpol.exe /set /subcategory 'File System' /success:enable
}

如果您还想捕获 stderr 输出,请将 2>&1 附加到 auditpol.exe 调用。


如果您的脚本块存储在局部变量 $command 中(作为 [scriptblock] 实例,而不是 string),只需将其直接传递给-ScriptBlock:

# Create a script block (a piece of code that can be executed on demand later)
# and store it in a (local) variable.
# Note that if you were to use any variable references inside the block,
# they would refer to variables on the remote machine if the block were to be
# executed remotely.
$command = { auditpol.exe /set /subcategory 'File System' /success:enable }

# Pass the script block to Invoke-Command for remote execution.
$out = Invoke-Command -ComputerName MyServer -ScriptBlock $command

至于你试过的

$out = Invoke-Command -ComputerName MyServer -ScriptBlock {$command}

您正在传递一个脚本块文字 ({ ... }),当它在目标计算机上执行时,它引用一个名为 $command.

的变量

通常,简单地引用一个变量输出它的值 - 它不会执行任何东西。

然而,更重要的是,$command是一个本地变量,远程执行脚本块看不到,所以引用未初始化的 $command 变量将有效地产生 $null.

简而言之:您的 Invoke-Command 调用什么都不做,returns $null