我有以下代码在其中加载管理单元(在这种情况下是从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();
}
}