系统管理自动化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或指定一个用户帐户来运行它?

系统管理自动化powershell运行管理

所以,最有可能发生的是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"

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