2016-11-16 67 views
0

我想要在運行Power Shell會話的某些網頁代碼中創建運行空間。我希望在用戶打開該頁面並保持打開狀態時創建此運行空間直到它關閉。因此,例如下面的代碼是一個按鈕點擊。但每次我運行一個電源外殼命令的時間我需要運行.net(C#)中的持久運行空間

"$S = new-pssesession -configurationname micros......" 

這需要幾秒鐘,剛剛建立的會議,我在哪裏可以創建運行空間和PowerShell對象,這樣我可以從任何調用它每次我想使用它時,在代碼中都不得不重新創建它。在一個控制檯應用程序我會板着臉在「主」類,但它似乎網頁/應用程序具有不同的結構

protected void Button1_Click(object sender, EventArgs e) 
    { 

     var runspace = RunspaceFactory.CreateRunspace(); 
     runspace.Open(); 

     var powershell = PowerShell.Create(); 
     //{ 
     powershell.Runspace = runspace; 


     powershell.AddScript("Set-ExecutionPolicy Unrestricted ; $s=new-pssession -configurationname microsoft.exchange -connectionuri http://server.com/powershell -authentication kerberos ; import-pssession $s"); 
     powershell.Invoke(); 
     powershell.AddScript("get-dynamicdistributiongroup"); 
     Collection<PSObject> resultsL = powershell.Invoke(); 


     // close the runspace 
     runspace.Close(); 

     Input.Items.Clear(); 
     foreach (var dlist in resultsL) 
     { 
      Input.Items.Add(dlist.ToString()); 
     } 

     Input.DataBind(); 

我所提出的解決方案

所以我想我會盡量讓建立一個靜態的對象,我可以撥打電話。我認爲通過創建一個靜態調用,我第一次調用它會運行「static powers()」構造,但是任何進一步的調用只會調用方法中的代碼段。然而,不知道我是否完全正確。

public static class powers 
    { 

     static public Runspace runspace = RunspaceFactory.CreateRunspace(); 
     static public PowerShell powershell = PowerShell.Create(); 

     static powers() 
     { 

      runspace.Open(); 
      powershell.Runspace = runspace; 
      powershell.AddScript("Set-ExecutionPolicy Unrestricted ; $s=new-pssession -configurationname microsoft.exchange -connectionuri http://exchangeserver.com/powershell -authentication kerberos ; import-pssession $s"); 
      var resultL = powershell.Invoke(); 

     } 

     static public Collection<PSObject> glist() 
     { 


      powershell.AddScript("get-dynamicdistributiongroup"); 
      Collection<PSObject> resultL = powershell.Invoke(); 
      return resultL; 

     } 

     static public Collection<PSObject> gmembers(string listn) 
     { 

      string GetMembers = "$FTE = Get-DynamicDistributionGroup '" + listn + "'"; 
      powershell.AddScript(GetMembers); 
      powershell.Invoke(); 
      powershell.AddScript("Get-Recipient -RecipientPreviewFilter $FTE.RecipientFilter"); 
      Collection<PSObject> resultM = powershell.Invoke(); 
      return resultM; 

     } 
    } 

回答

1

我已經建立了幾個其他的應用程序,我已經存儲了會話中的東西並使用屬性來訪問它們。類似的東西可能適合你。

public static Runspace runspace 
{ 
    get 
    { 
    //if not exist, create, open and store 
    if (Session["runspace"] == null){ 
     Runspace rs = RunspaceFactory.CreateRunspace(); 
     rs.Open(); 
     Session["runspace"] = rs; 
    } 

    //return from session 
    return (Runspace)Session["runspace"]; 
    } 
} 

然後,您可以簡單地將它作爲事件處理程序中的靜態屬性進行訪問。

+0

我正在嘗試做類似的事情,但不確定它是否還有。乾杯 – DevilWAH

+0

當我嘗試這個我得到「名稱會話」不存在於當前的上下文「任何指針我做錯了什麼? – DevilWAH

+0

排序它,只是我做一個類型大聲笑所有工作很好現在謝謝你 – DevilWAH