2013-10-22 127 views
0

我們開發了一個新的基於Web的應用程序,通過C#調用Citrix XenApp Powershell cmdlet。 Web應用程序託管在Citrix服務器上(這已經在服務器場中),我們認爲它足以訪問Citrix場中的所有服務器。代碼在從Visual Studio IDE運行時提供輸出。 但是,當我在IIS上創建虛擬目錄並通過瀏覽器訪問它時。C#Citrix到Powershell

在System.Management.Automation.Internal.PipelineProcessor.SynchronousExecuteEnumerate(對象輸入,哈希表errorResults,布爾歷數)在System.Management.Automation.Runspaces.LocalPipeline.InvokeHelper()在System.Management.Automation.Runspaces。 LocalPipeline.InvokeThreadProc()

以下是代碼

protected void Page_Load(object sender, EventArgs e) 
{ 
    string usrname = ""; 
    string svrname = ""; 
    string appname = ""; 
    string clntnme = ""; 
    string clntip=""; 
    string farm = ""; 

    Runspace rsp = RunspaceFactory.CreateRunspace(); 
    //rsp.ApartmentState = System.Threading.ApartmentState.STA; 
    //rsp.ThreadOptions = PSThreadOptions.UseCurrentThread; 
    rsp.Open(); 
    PSSnapInException exp; 
    rsp.RunspaceConfiguration.AddPSSnapIn("Citrix.XenApp.Commands", out exp); 
    try 
    { 
     PowerShell ps3 = PowerShell.Create().AddCommand("Get-XAFarm"); 
     ps3.Runspace = rsp; 
     foreach (PSObject pss in ps3.Invoke()) 
     { 
      farm = pss.Properties["FarmName"].Value.ToString(); 
     } 
     Response.Write("<DIV align=" + "center" + " style=" + "width:100%;height:100%" + ">" + farm + "<TABLE style=" + "width:100%" + ">"); 
     Response.Write("<TR><TH>User</TH><TH>Server</TH><TH>Application</TH><TH>Address</TH><TH>Client Name</TH></TR>"); 
     PowerShell sessions = PowerShell.Create().AddCommand("Get-XASession").AddParameter("Full").AddCommand("where-object").AddParameter("FilterScript", ScriptBlock.Create("{$_.BrowserName -ne $null }")); 

     sessions.Runspace = rsp; 
     foreach (PSObject psr in sessions.Invoke()) 
     { 
      //IPAddress.Parse(psr.Properties["ClientAddress"].Value.ToString()); 
      usrname = psr.Properties["AccountName"].Value.ToString(); 
      svrname = psr.Properties["ServerName"].Value.ToString(); 
      appname = psr.Properties["BrowserName"].Value.ToString(); 
      clntnme = psr.Properties["ClientName"].Value.ToString(); 
      //if (psr.Properties["ClientAddress"].Value != null) 
      //{ 
       clntip = psr.Properties["ClientAddress"].Value.ToString(); 
      //} 
      //clntip = psr.Properties["ClientIPV4"].Value.ToString(); 
      Response.Write("<TR><TD>" + usrname + "</TD><TD>" + svrname + "</TD><TD>" + appname + "</TD><TD>" + clntip + "</TD><TD>" + clntnme + "</TD></TR>"); 
     } 
     Response.Write("</TABLE>"); 
    } 
    catch (Exception ex) 
    { 
     Response.Write(ex.StackTrace.ToString()); 
    } 
    finally 
    { 
     rsp.Close(); 
    } 
}** 

請讓我知道如果任何變化都在IIS工作要做,以使我成功地訪問了aspx頁面。

+0

我已經想通了。我已將應用程序池標識更改爲本地系統,以便在IIS中運行該應用程序,現在它正在工作。感謝您的幫助 –

+0

爲什麼要創建多個PowerShell實例?只需在命令調用之間執行'PowerShell.Commands.Clear()'。另外,如果你使用的是PowerShell v3,它使用DLR,這樣你可以簡化你的foreach循環,例如'foreach(ps3.Invoke()中的動態pss){farm = pss.FarmName; }'。 –

+0

謝謝..我根據你的觀察結果改變了代碼。 –

回答

0

該應用程序需要以在XenApp場中具有足夠管理權限的用戶身份運行。您可以創建一個專用的服務帳戶,並將其作爲XenApp場中的管理員。要按照您的示例列出服務器場狀態,它只需要是「僅查看」XenApp管理員。然後將IIS配置爲以該服務帳戶運行。