我们开发了一个新的基于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
页面。
我已经想通了。我已将应用程序池标识更改为本地系统,以便在IIS中运行该应用程序,现在它正在工作。感谢您的帮助 –
为什么要创建多个PowerShell实例?只需在命令调用之间执行'PowerShell.Commands.Clear()'。另外,如果你使用的是PowerShell v3,它使用DLR,这样你可以简化你的foreach循环,例如'foreach(ps3.Invoke()中的动态pss){farm = pss.FarmName; }'。 –
谢谢..我根据你的观察结果改变了代码。 –