我需要在一组远程服务器上配置审核策略。我正在尝试使用Invoke-Command小命令在每台服务器上运行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获得了一些信息。根据{{3}} State = Completed的应该表示该操作已成功,但是我并不完全相信它确实可以了解auditpol操作是否成功。任何建议将不胜感激!
答案 0 :(得分:3)
要同步运行控制台程序,并使用其stdout和stderr输出可捕获,直接调用 -请勿使用{{1 }}(无论您是通过Start-Process
在本地还是远程运行该程序):
Invoke-Command
如果您还想捕获 stderr 输出,请将$out = Invoke-Command -ComputerName MyServer -ScriptBlock {
auditpol.exe /set /subcategory 'File System' /success:enable
}
附加到2>&1
调用中。
如果您的脚本块存储在本地变量auditpol.exe
中(作为$command
实例,而不是作为 string ),只需将其直接传递给[scriptblock]
:
-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
是 local 变量,远程执行脚本块看不到它,因此引用了未初始化的{{1 }}变量将有效产生$command
。
简而言之:您的$command
调用不执行任何操作并返回$null
。