我有以下代码在其中加载管理单元(在这种情况下是从MS Dynamics导航):

            using (Runspace runspace = RunspaceFactory.CreateRunspace())
        {
            runspace.Open();

            using (var ps = PowerShell.Create())
            {
                ps.Runspace = runspace;

                ps.AddScript("Add-PSSnapin Microsoft.Dynamics.Nav.Management")
                  .AddScript("Get-NAVServerInstance");

                //This does not work. Says unknown cmdlet Get-NAVServerInstance
                //ps.AddCommand("Add-PSSnapin").AddArgument("Microsoft.Dynamics.Nav.Management")
                //  .AddCommand("Get-NAVServerInstance");

                var output = ps.Invoke();
            }
        }

当我使用代码中所示的AddScript方法时,此代码有效。
但是,为什么AddCommand方法不起作用(请参见注释的代码)?看起来好像没有加载管理单元,因为该错误表明Get-NAVServerInstance cmdlet是未知的。
这应该如何工作?

我知道我可以创建一个带有InitialSessionState的运行空间,并在该运行空间上导入了管理单元。然后ps.AddCommand(“Get-NAVServerInstance”)开始工作。
但是,当我想创建一个远程运行空间 session (使用WSManConnectionInfo)时,我找不到提供initialSessionState的方法。

UPDATE :
因此,似乎只有在运行空间打开(或创建?)时,AddCommand才能用于可用的cmdlet。可以将InitialSessionState或RunspaceConfiguration实例与RunspaceFactory.CreateRunspace(...)一起使用。因此,此代码有效:
    var config = RunspaceConfiguration.Create();
    PSSnapInException warning;
    config.AddPSSnapIn("Microsoft.Dynamics.Nav.Management", out warning);

    using (Runspace runspace = RunspaceFactory.CreateRunspace(config))
    {
        runspace.Open();

        using (var ps = PowerShell.Create())
        {
            ps.Runspace = runspace;
            ps.AddCommand("Get-NAVServerInstance");
            var output = ps.Invoke();
        }
    }

但是我的问题是那种情况,我无法指定WSManConnectionInfo实例。

那么,如何在加载了管理单元(安装在远程计算机上)的情况下通过远程连接创建运行空间?如何为远程连接提供配置?

最佳答案

我终于找到了有关如何配置远程 session 的提示(请参阅https://superuser.com/a/518567)。

您需要使用以下命令在远程计算机上注册 session 配置:

Register-PSSessionConfiguration -Name MyShell -StartupScript 'MyInitScript.ps1'

然后可以将WSManConnectionInfo的shellUri参数设置为http://schemas.microsoft.com/powershell/MyShell

通过这种方式创建的运行空间将具有由MyInitScript.ps1启动脚本导入的可用命令。

所以现在这段代码可以工作了:
        string shell = "http://schemas.microsoft.com/powershell/MyShell";
        var target = new Uri("https://myserver:port/wsman");
        var secured = new SecureString();
        foreach (char letter in "password")
        {
            secured.AppendChar(letter);
        }
        secured.MakeReadOnly();

        var credential = new PSCredential("username", secured);
        var connectionInfo = new WSManConnectionInfo(target, shell, credential);

        using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo))
        {
            runspace.Open();

            using (var ps = PowerShell.Create())
            {
                ps.Runspace = runspace;
                ps.AddCommand("Get-NAVServerInstance");
                var output = ps.Invoke();
            }
        }

08-07 17:05