使用c#在Powershell远程会话中导入模块

时间:2014-07-07 15:27:54

标签: c# session powershell exchange-server

我正面临一个令我头痛的问题(字面意思),我希望你能帮助我:

鉴于我的Powershell在我的应用程序之外的其他服务器上,在c#中,您可以创建一个" Powershell远程会话"通过定义WSManConnectionInfo并在" runspace"中使用它创建

像:

var runspace = RunspaceFactory.CreateRunspace(WSManConnectionInfo);

但问题是:

当我们使用远程会话时,我们只能使用一些命令(并非所有命令都可用)。因此,您无法使用"导入模块"直接在远程会话中命令。

所以我问你是否可以帮我在c#(或只是一些提示)中找到解决方案,以便在远程会话中使用导入的模块。

我知道那里有很多解决方案(Pure Powershell命令),但我还不足以在c#中转换这些解决方案。

1 个答案:

答案 0 :(得分:0)

嗯,我能够在远程会话中使用Import-Module,例如:

var connectionInfo = new WSManConnectionInfo(new Uri("http://foo.acme.com:5985"));
var runspace = RunspaceFactory.CreateRunspace(connectionInfo);
runspace.Open();

using (var powershell = PowerShell.Create())
{
    powershell.Runspace = runspace;
    powershell.AddScript("Import-Module PSCX");
    var results = powershell.Invoke();
    powershell.AddScript("Get-Uptime | Out-String");
    results = powershell.Invoke();
    foreach (var result in results)
    {
        Console.WriteLine(result);
    }

    runspace.Close();
}

输出:

Uptime                                   LastBootUpTime
------                                   --------------
10.20:21:06.6432615                      6/26/2014 6:29:00 PM

您的模块是否可能是特定于位的,可能是仅加载到x86 PowerShell会话中的32位模块?默认会话将为64位(假设远程OS为64位)。如果事实证明您的模块是特定于32位的,请连接到Microsoft.Powershell32端点。

var connectionInfo = new WSManConnectionInfo(new Uri("http://foo.acme.com:5985"), "http://schemas.microsoft.com/powershell/Microsoft.PowerShell32", PSCredential.Empty);