我正在尝试构建一个ASP.Net,c#应用程序,通过Web界面为分布式Admin组公开一些与IIS管理相关的活动。
我正在使用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:取代Get-WebApplication的Get-Service通过返回机器上可用的服务列表完全正常。
答案 0 :(得分: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);
}
}
}
}
}
}
如果您将此应用程序编译为x32,它仍将在x64操作系统上使用x64进程Runspace
。