2016-01-19 80 views
0

我想構建一個ASP.Net,c#應用程序,通過Web界面爲分佈式管理組公開一些與IIS管理相關的活動。Powershell調用方法既不拋出異常也不返回結果

我正在使用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:獲取服務到位的獲取,WebApplication的工作原理是在機器上返回的服務列表提供精絕。

+1

空結果可能是有效的結果。那麼,你有沒有在本地服務器上的任何Web應用程序?並做了你的檢查內容的'shell.Streams.Error'? – PetSerAl

+0

是的,本地服務器上的應用程序很少。感謝您指向Streams.Error屬性。發現以下異常消息**檢索具有CLSID {688EEEE5-6A7E-422F-B2E1-6AF00DC944A6}的組件的COM類工廠失敗,原因如下:80040154類未註冊(異常來自HRESULT:0x80040154(REGDB_E_CLASSNOTREG))。 ** –

+0

此cmdlet是否在PowerShell控制檯中工作? x32 **和** x64? – PetSerAl

回答

0

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); 
        } 
       } 
      } 
     } 
    } 
} 

如果你編譯這個應用程序的32倍,它仍然會運行64位系統上使用64位進程外Runspace的。

相關問題