2011-10-13 8 views
2

이 PowerShell 명령을 사용하여 Exchange Online의 Distributon 그룹에 구성원을 추가 할 수 있습니다. 이것은 PS에서 올바르게 작동합니다. 하지만 C# 응용 프로그램에서이 작업을 수행해야합니다.C# Powershell 파이프 라인 foreach-object

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

구성원을 포함하는 배열을 PS의 $ arr에 전달하고 foreach-object로 파이프해야합니다. 나는 많은 검색을 해왔지만 모든 예제는 단일 명령을 수행하는 방법 만 보여줍니다. 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을이 작업을 수행 할 수 없습니다. 또한 runspace가 첫 번째 파이프 라인 만 실행하기 때문에 아래와 같은 작업을 수행 할 수 없습니다.

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

그냥 System.DirectoryServices의 DirectoryEntry가 아닌 C#에서 PowerShell을 호출하는 이유는 무엇입니까? – JPBlanc

+0

PowerShell없이 Exchange Online에서 메일 그룹을 어떻게 만듭니 까? 유일한 다른 API는 관리 유형 작업을 수행 할 수있는 기능이없는 EWS Managed API입니다. – preambleMe

+0

Active Directory에서 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에서 당신은 작업을 수행 할 필요가 없습니다하는 것으로 당신이 나쁜 사용자가 있다면 좋은 사람이 여전히 추가됩니다, 두 경우 모두

$arr | Add-DistributionGroupMember -Identity "test" 

및 오류가 나쁜 사람마다 표시됩니다 : foreach는 객체, 당신은 단지 전체 배열에 전달할 수 있습니다.

관련 문제