2011-10-13 148 views
2

我有此PowerShell命令將成員添加到Exchange Online中的Distributon組。這在PS中正確工作。但我需要從C#應用程序中完成此操作。C#Powershell管道foreach-object

$arr | foreach-object{Add-DistributionGroupMember -Identity 'Test' -Member $_} 

我需要將包含成員的數組傳遞給PS中的$ arr並將其傳遞給foreach對象。我做了很多搜索,但所有的例子都只顯示瞭如何做單個命令。如何在C#中的PS命令?

代碼片段:

using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo)) 
     { 
      runspace.Open(); 

      using (PowerShell ps = PowerShell.Create()) 
      { 
       ps.Runspace = runspace; 

       string[] members = new string[] { "[email protected]", 
                "[email protected]",       
       }; 

       ps.Commands.AddParameter("Members").AddArgument(members); // ?? 
       ps.Commands.AddCommand("foreach-object"); // I'm stuck at this point 

       Collection<PSObject> results = ps.Invoke(); 
      } 
     } 

注:遠程腳本被阻擋在我們的PS我無法通過做到這一點AddScript。由於運行空間僅執行第一個管道,因此下面的操作不起作用。

foreach(string mem in members) 
{ 
Command command = new Command("Add-DistributionGroupMember"); 
command.Parameters.Add("Identity", "test"); 
command.Parameters.Add("Member", member); 
Pipeline pipeline = runspace.CreatePipeline(); 
pipeline.Commands.Add(command); 
pipeline.Invoke(); 
} 
+0

只是一個問題,你爲什麼要在C#中調用PowerShell,而不僅僅是DirectoryEntry(在System.DirectoryServices中)? – JPBlanc

+0

如何在沒有PowerShell的Exchange Online中創建通訊組?唯一的其他API是EWS託管API,它沒有任何功能來執行管理類型任務。 – preambleMe

+0

在Active-Directory中創建它們,則Microsoft Online Services目錄同步工具提供從本地Active Directory目錄服務到Microsoft Online Services的單向同步。 – JPBlanc

回答

1

是的文檔一直沒有。我鞭打下面。顯然不是最好的,但似乎工作在get-process(我不能嘗試與Add-DistributionGroupMember)。你也許可以提高在其上:

  using (PowerShell ps = PowerShell.Create()) 
      { 
       ps.Runspace = runspace; 
       var members = new[] 
            { 
             "[email protected]", 
             "[email protected]", 
            }; 
       var command1 = new Command("write-output"); 
       command1.Parameters.Add("InputObject", members); 
       ps.Commands.AddCommand(command1); 

       foreach (PSObject output in ps.Invoke()) 
       { 
        ps.Commands.Clear(); 
        var command2 = new Command("Add-DistributionGroupMember"); 
        ps.Commands.AddCommand(command2); 
        ps.Commands.AddParameter("Name", output); 
        ps.Commands.AddParameter("Identity", "test"); 
        foreach (PSObject output2 in ps.Invoke()) 
        { 
         Console.WriteLine(output2); 
        } 
       } 
      } 
+0

感謝您的回覆!你的代碼有效,但是我也發現我之前發佈的foreach循環也可以。我有一個不好的用戶,我沒有意識到這一點。反正這兩種方法都有效。 – preambleMe

0

要通過會員加入-DistributionGroupMember只是它們包括在調用()調用:

 using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo)) 
     { 
      runspace.Open(); 

      using (PowerShell ps = PowerShell.Create()) 
      { 
       ps.Runspace = runspace; 

       string[] members = new string[] { "[email protected]", "[email protected]" }; 

       Collection<PSObject> results = ps 
        .AddCommand("Add-DistributionGroupMember") 
        .AddParameter("Identity", "test") 
        .Invoke(members); 
      } 
     } 

注意,在PowerShell中你不需要做的foreach對象,你可以通過整個數組中:

$arr | Add-DistributionGroupMember -Identity "test" 

在這兩種情況下,如果你有一個不好的用戶來說,好的仍然會添加一個錯誤會顯示每個不好的評論。