2013-11-23 142 views
1

我試圖在同一臺機器上使用C#在powershell中執行AD命令行程序。這工作正常。在C#中運行AD命令行程序時發生錯誤#

static void Main(string[] args) 
     { 
      InitialSessionState iss = InitialSessionState.CreateDefault(); 
      iss.ImportPSModule(new string[] { "activedirectory" }); 
      Runspace myRunSpace = RunspaceFactory.CreateRunspace(iss); 
      myRunSpace.Open(); 

      Pipeline pipeLine = myRunSpace.CreatePipeline(); 
      Command myCommand = new Command("Get-ADUser"); 
      myCommand.Parameters.Add("Filter", "sAMAccountName -eq 'user1'"); 
      //myCommand.Parameters.Add("IncludeDeletedObjects"); 

      pipeLine.Commands.Add(myCommand); 

      //Command restoreCommand = new Command("Restore-ADObject"); 
      //pipeLine.Commands.Add(restoreCommand); 

      Console.WriteLine("Before Invoke"); 
      Collection<PSObject> commandResults = pipeLine.Invoke(); 
      Console.WriteLine("After Invoke"); 

      foreach (PSObject cmdlet in commandResults) 
      { 
       //Console.WriteLine("Inside foreach"); 
       string cmdletName = cmdlet.BaseObject.ToString(); 
       System.Diagnostics.Debug.Print(cmdletName); 
       Console.WriteLine(cmdletName); 
      } 

      Console.ReadLine(); 
     } 

不過,雖然嘗試遠程運行相同的命令使用Invoke命令它給人的錯誤The term 'Get-ADUser' is not recognized as the name of a cmdlet, function, script file, or operable program.

以下是我的程序:

static void Main(string[] args) 
    { 

     string shellUri = "http://schemas.microsoft.com/powershell/Microsoft.PowerShell"; 
     string userName = "Domain\\Administrator"; 
     string password = "Password"; 
     SecureString securePassword = new SecureString(); 

     foreach (char c in password) 
     { 
      securePassword.AppendChar(c); 
     } 
     PSCredential credential = new PSCredential(userName, securePassword); 
     WSManConnectionInfo connectionInfo = new WSManConnectionInfo(false, "machinename", 5985, "/wsman", shellUri, credential); 
     using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo)) 
     { 

      runspace.Open(); 
      using (PowerShell powershell = PowerShell.Create()) 
      { 
       powershell.Runspace = runspace; 
       PSCommand new1 = new PSCommand(); 
       new1.AddCommand("Get-ADUser"); 
       new1.AddParameter("identity", "CN=user1,DC=example,DC=com"); 
       powershell.Commands = new1; 
       Collection<PSObject> results = powershell.Invoke(); 
       foreach (PSObject obj in results) 
       { 
       PSMemberInfoCollection<PSPropertyInfo> propInfos = obj.Properties; 
       Console.WriteLine("********************"); 
       foreach (PSPropertyInfo propInfo in propInfos) 
       { 
        string propInfoValue = (propInfo.Value == null) ? "" : propInfo.Value.ToString(); 
        Console.WriteLine("{0} --> {1}", propInfo.Name, propInfoValue); 
       } 


      } 

      } 
     } 
    } 
  1. 我如何能實現呼叫AD commandlets遠程?
  2. 有沒有辦法使用InitialSessionState而不是WSManConnectionInfo遠程調用命令。
  3. 如果我使用invoke-command -computername $DC -ScriptBlock {Remove-ADUser -identity "user1"} -credential $cred - 我收到錯誤The term 'Remove-ADUser' is not recognized as the name of a cmdlet, function, script file, or operable program

但是可以使用命令Remove-ADUser -identity "user1" -server $DC -credential $cred。如何從C#客戶端直接在powershell中執行AD命令?

+0

您是否驗證了ActiveDirectory的模塊安裝在目標計算機上的AD命令之前導入的ActiveDirectory模塊遠程運行空間? –

回答

5

您需要執行例如爲:

powershell.Commands.AddCommand("Import-Module").AddArgument("ActiveDirectory"); 
powershell.Invoke(); 
powershell.Commands.Clear(); 
+0

謝謝。它與添加上述步驟一起工作。 –

相關問題