スナップインをロードするこのコードがあります (この場合は 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 インスタンスを指定できないことです。
では、スナップイン (リモート マシンにインストールされている) がロードされたリモート接続で実行空間を作成するにはどうすればよいでしょうか? リモート接続の構成を提供する方法は?