1

スナップインをロードするこのコードがあります (この場合は MS Dynamics NAV から):

            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 コマンドレットが不明であるというエラーが表示されるため、スナップインが読み込まれていないようです。これはどのように機能するはずですか?

スナップインをインポートした InitialSessionState で実行空間を作成できることはわかっています。次に、 ps.AddCommand("Get-NAVServerInstance") が機能しています。しかし、(WSManConnectionInfo を使用して) リモート実行空間セッションを作成したい場合、initialSessionState を提供する方法が見つかりません。

更新: したがって、AddCommand は、実行空間が開かれた (または作成された) ときに使用できるコマンドレットにのみ使用できるようです。RunspaceFactory.CreateRunspace(...) で InitialSessionState または RunspaceConfiguration インスタンスを使用するとうまくいきます。したがって、このコードは機能します:

    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 インスタンスを指定できないことです。

では、スナップイン (リモート マシンにインストールされている) がロードされたリモート接続で実行空間を作成するにはどうすればよいでしょうか? リモート接続の構成を提供する方法は?

4

2 に答える 2

4

リモート セッションを構成する方法のヒントをようやく見つけました ( https://superuser.com/a/518567を参照)。

リモートコンピューターにセッション構成を登録する必要があります

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();
            }
        }
于 2013-08-21T11:26:39.830 に答える
0

次のように AddScript を呼び出してみてください。

.AddScript("...", false)

これにより、新しいローカル スコープではなく、グローバル スコープでコマンドが実行されます。

これを行う適切な方法は、RunspaceConfiguration クラスを使用することだと思います。AddPSSnapinメソッドがあります。

于 2013-08-20T18:21:29.947 に答える