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
。
我需要在一组远程服务器上配置审核策略。我正在尝试在每台服务器上使用 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
。