我有一个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.NET进程运行时,Invoke-Command永远不会触发,并且不会返回错误。
例如,请使用以下脚本:
"Start"
Invoke-Command -computername WinServer -Credential $credentials -ScriptBlock
{
"Test"
}
"Finish"
当我从服务器上的PS运行时,我得到响应“开始,测试,完成”,但是当我从ASP.NET运行它时,它只返回“开始,完成” - 脚本块永远不会运行。 / p>
是否有对脚本块未运行原因的解释,或者System.Management.Automation.Powershell中的一种方法是提升为admin或指定用户帐户来运行它?
答案 0 :(得分:1)
所以,最有可能发生的事情是,Invoke-Command
调用正在抛出异常。我最好的猜测是,由于各种身份验证问题,它会抛出异常。
对于一些小背景,PowerShell有多个&#34;流&#34;。你可能只看到发送到Output
流的数据,所以我们需要做的是捕获其他流,并将它们合并到输出流中,这样我们就可以检查任何警告,错误或其他信息。
您可以通过以下几种方式捕获&#34;错误,并检查它们:
Wait-Debugger
命令(需要PowerShell 5.0 ),然后使用Enter-PSHostProcess
-ErrorVariable
上的Invoke-Command
参数捕获错误,然后将其写入文件或输出流(使用Write-Output
)*>&1
实际上,我将脚本代码更新为:
"Start"
Invoke-Command -computername WinServer -Credential $credentials -ScriptBlock {
"Test"
} -Verbose *>&1
"Finish"
这应该导致所有错误,警告,详细输出等合并到输出流中,因此您应该能够看到脚本内部发生了什么。