系统管理自动化powershell运行管理
本文关键字:管理 运行 powershell 自动化 系统管理 | 更新日期: 2023-09-27 17:51:26
我有一个Powershell脚本,我想从ASP内触发在我的服务器上运行。NET MVC应用程序。我现在是这样做的:
var shell = PowerShell.Create();
shell.Commands.AddScript(_script);
_output = new PSDataCollection<PSObject>();
var input = new PSDataCollection<string>();
input.Complete();
shell.BeginInvoke(input, _output);
然而,脚本运行在与IIS应用程序相同的用户帐户下(很明显)。该帐户不具有脚本执行其工作所需的特权。我试过添加一个中间脚本,并使用带有授权帐户凭证的Invoke-Command来运行主脚本,但是从ASP运行时,Invoke-Command永远不会触发。. NET进程,并且不返回错误。
例如,使用以下脚本:
"Start"
Invoke-Command -computername WinServer -Credential $credentials -ScriptBlock
{
"Test"
}
"Finish"
当我从服务器上的PS运行这个时,我得到响应"开始,测试,完成",但是当我从ASP运行它时。. NET只返回"Start, Finish"——脚本块永远不会运行。
是否有一个解释为什么脚本块没有运行,或者在System.Management.Automation.Powershell中有一种方法可以提升到admin或指定一个用户帐户来运行它?
所以,最有可能发生的是Invoke-Command
调用抛出异常。我最好的猜测是,由于各种身份验证问题,它抛出了一个异常。
简单介绍一下,PowerShell有多个"流"。您可能只看到发送到Output
流的数据,所以我们需要做的是捕获其他流,并将它们合并到Output流中,这样我们就可以检查任何警告、错误或其他信息。
PowerShell流列表
- 输出
- 误差
- 信息(PowerShell version 5.0)
- 详细
捕获流
有几种不同的方法可以"捕获"错误,并检查它们:
- 在脚本中插入
Wait-Debugger
命令(需要PowerShell 5.0),然后使用Enter-PSHostProcess
远程附加到进程 - 使用
Invoke-Command
上的-ErrorVariable
参数捕获错误,然后将它们写入文件或输出流(使用Write-Output
) - 使用PowerShell重定向将所有流合并到输出流
*>&1
实际上,我会更新你的脚本代码,看起来像这样:
"Start"
Invoke-Command -computername WinServer -Credential $credentials -ScriptBlock {
"Test"
} -Verbose *>&1
"Finish"
这将导致所有错误、警告、详细输出等被合并到输出流中,因此您应该能够看到脚本内部发生了什么。