2013-10-22 6 views
0

우리는 C#을 통해 Citrix XenApp Powershell cmdlet을 호출하는 새로운 웹 기반 응용 프로그램을 개발했습니다. 웹 응용 프로그램은 Citrix 팜 (Citrix 팜의 모든 서버에 액세스 할 수 있다고 생각되는 Citrix 서버)에서 호스팅됩니다.이 코드는 Visual Studio IDE에서 실행될 때 출력을 제공합니다. 그러나 IIS에서 가상 디렉터리를 만들고 브라우저를 통해 액세스 할 때.C# Citrix to Powershell

System.Management.Automation.Runspaces.LocalPipeline.InvokeHelper에서 System.Management.Automation.Internal.PipelineProcessor.SynchronousExecuteEnumerate (개체 입력 해시 테이블 errorResults 부울 열거) (AT)에 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(); 
    } 
}** 

어떤 변화가 저를 성공적으로 aspx 페이지에 액세스 할 수 있도록 IIS에서 수행 할 필요가 있으면 알려 주시기 바랍니다 코드를입니다.

+0

나는 그것을 알아 냈습니다. IIS에서 응용 프로그램의 풀 ID를 로컬 시스템으로 변경했으며 현재 작동 중입니다. 도움을 주셔서 감사합니다 –

+0

왜 PowerShell의 여러 인스턴스를 만드나요? 명령 호출간에'PowerShell.Commands.Clear()'를 실행하기 만하면됩니다. 또한 PowerShell v3을 사용하는 경우 DLR을 사용하므로 foreach 루프를 단순화 할 수 있습니다. 'foreach (ps3.Invoke()에서 동적 인 ps) {farm = pss.FarmName; }'. –

+0

감사합니다. 귀하의 관찰에 따라 코드를 변경했습니다. –

답변

0

응용 프로그램을 XenApp 팜에서 충분한 관리 권한을 가진 사용자로 실행해야합니다. 전용 서비스 계정을 만들어 XenApp 팜의 관리자로 만들 수 있습니다. 샘플이 수행 할 때 팜 상태를 나열하려면 '보기 전용'XenApp 관리자 만 있으면됩니다. 그런 다음 해당 서비스 계정으로 실행되도록 IIS를 구성합니다.