【问题标题】:Powershell Invoke method neither throwing exception nor returning resultPowershell Invoke 方法既不抛出异常也不返回结果
【发布时间】:2016-01-21 17:17:38
【问题描述】:

我正在尝试构建一个 ASP.Net、c# 应用程序,以通过 Web 界面为分布式管理员组公开一些与 IIS 管理相关的活动。

我正在使用 System.Management.Automation V3.0 库来包装 power shell 命令。作为第一步,我想通过调用 Get-WebApplication 命令列出当前在本地 IIS 上启动并运行的所有 Web 应用程序。 这就是我面临的问题。方法调用既不抛出任何异常也不返回结果。有谁知道这个问题的根本原因?请分享您使用 System.Management.Automation.dll 构建此类界面的经验。

 var shell = PowerShell.Create();              
          shell.Commands.AddScript("Get-WebApplication | Out-String");
          try
          {
              var results = shell.Invoke();
              if (results.Count > 0)
              {
                  var builder = new StringBuilder();
                  foreach (var psObject in results)
                  {                          
                      builder.Append(psObject.BaseObject.ToString() + "\r\n");
                  }
              }

          }                  
          catch(Exception ex)
          {
              throw;
          }

PS:Get-Service 代替 Get-WebApplication 可以通过返回机器上可用的服务列表来完全正常工作。

【问题讨论】:

  • 空结果可以是有效结果。那么,您在本地服务器上有任何 Web 应用程序吗?你检查shell.Streams.Error的内容了吗?
  • 是的,本地服务器上的应用程序很少。感谢您指向 Streams.Error 属性。我发现以下异常消息检索具有 CLSID {688EEEE5-6A7E-422F-B2E1-6AF00DC944A6} 的组件的 COM 类工厂失败,原因是以下错误:80040154 未注册类(来自 HRESULT 的异常:0x80040154(REGDB_E_CLASSNOTREG)) .
  • 此 cmdlet 是否在 PowerShell 控制台中工作? x32 x64?
  • 它在 x64 中工作正常,但在 x32 中给出错误消息。错误信息与我在代码中收到的相同。
  • 你的应用是 x32 的?

标签: powershell automation


【解决方案1】:

PowerShell.Create() 不会创建新的 PowerShell 进程。如果您没有为它指定Runspace,那么它将创建新的进程内Runspace。由于它在您的进程中运行,它将与您的进程位数相匹配,您无法更改它。要创建具有不同位数的Runspace,您需要创建进程外Runspace。这是一个示例控制台应用程序,它演示了如何做到这一点:

using System;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
public static class TestApplication {
    public static void Main() {
        Console.WriteLine(Environment.Is64BitProcess);
        using(PowerShellProcessInstance pspi = new PowerShellProcessInstance()) {
            string psfn = pspi.Process.StartInfo.FileName;
            psfn=psfn.ToLowerInvariant().Replace("\\syswow64\\", "\\sysnative\\");
            pspi.Process.StartInfo.FileName=psfn;
            using(Runspace r = RunspaceFactory.CreateOutOfProcessRunspace(null, pspi)) {
                r.Open();
                using(PowerShell ps = PowerShell.Create()) {
                    ps.Runspace=r;
                    ps.AddScript("[Environment]::Is64BitProcess");
                    foreach(PSObject pso in ps.Invoke()) {
                        Console.WriteLine(pso);
                    }
                }
            }
        }
    }
}

如果您将此应用程序编译为 x32,它仍将在 x64 操作系统上使用 x64 进程外Runspace

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 2014-05-20
    • 2016-11-09
    相关资源
    最近更新 更多