2013-08-20 28 views
1

我有這樣的代碼,其中I(在這種情況下從MS動態導航)加載管理單元:爲什麼PowerShell的類不加載管理單元

  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方法不起作用(請參閱註釋代碼)?看起來snapin沒有加載,因爲錯誤表示Get-NAVServerInstance cmdlet是未知的。 這應該如何工作?

我知道我可以用InitialSessionState創建一個運行空間,我已經在其上導入了管理單元。然後ps.AddCommand(「Get-NAVServerInstance」)正在工作。 但是,當我想創建一個遠程運行空間會話(使用WSManConnectionInfo)時,我無法找到提供initialSessionState的方法。

UPDATE: 如此看來,只有AddCommand可用於在運行空間被打開可用的cmdlet(或產生的?)。在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實例。

那麼我怎樣才能創建一個遠程連接與管理單元(安裝在遠程機器上)加載的運行空間?如何提供遠程連接的配置?

+0

你需要先導入一個模塊? – Colyn1337

+0

該cmdlet位於snapin中。 – Jaap

回答

3

我終於找到了一個提示如何配置遠程會話(請參閱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(); 
      } 
     } 
+0

)。通過Get-PSSessionConfiguration(在遠程計算機上),您可以看到哪些配置可用遠程會話 – Jaap

0

嘗試調用AddScript像這樣:

.AddScript("...", false) 

這將在全球範圍內,而不是一種新的局部範圍內執行命令。

我認爲正確的做法是使用RunspaceConfiguration類。它有一個AddPSSnapin方法。

+0

在我的代碼示例中使用AddScript可以正常工作。我的問題是爲什麼AddCommand不起作用(示例中的註釋代碼)。我會看看RunspaceConfiguration。 – Jaap

+0

正如我在我的問題中提到的,使用RunspaceConfiguration可以用於本地連接,與InitialSessionState一樣。問題是如何結合遠程連接指定它(使用WSManConnectionInfo。請參閱我的更新後的問題 – Jaap

相關問題