System.Management.Automation.Powershell RunAs Admin

时间:2016-06-28 09:05:12

标签: c# asp.net-mvc powershell

我有一个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或指定用户帐户来运行它?

1 个答案:

答案 0 :(得分:1)

所以,最有可能发生的事情是,Invoke-Command调用正在抛出异常。我最好的猜测是,由于各种身份验证问题,它会抛出异常。

对于一些小背景,PowerShell有多个&#34;流&#34;。你可能只看到发送到Output流的数据,所以我们需要做的是捕获其他流,并将它们合并到输出流中,这样我们就可以检查任何警告,错误或其他信息。

PowerShell流列表

  • 输出
  • 警告
  • 错误
  • 信息(PowerShell 5.0版)
  • 冗长
  • 调试

捕获流

您可以通过以下几种方式捕获&#34;错误,并检查它们:

  • 在脚本中插入Wait-Debugger命令(需要PowerShell 5.0 ),然后使用Enter-PSHostProcess
  • 远程附加到流程
  • 使用-ErrorVariable上的Invoke-Command参数捕获错误,然后将其写入文件或输出流(使用Write-Output
  • 使用PowerShell重定向将所有流合并到输出流*>&1

实际上,我将脚本代码更新为:

"Start"
Invoke-Command -computername WinServer -Credential $credentials -ScriptBlock {
  "Test"
} -Verbose *>&1
"Finish"

这应该导致所有错误,警告,详细输出等合并到输出流中,因此您应该能够看到脚本内部发生了什么。