2013-09-24 3 views
1

아래 코드에는 두 줄의 power-shell 명령이 있습니다. 명령 1은 사서함을 활성화하고 명령 2는 활성 동기화를 비활성화합니다.C# 및 powershell multiple 명령

PSCommand psCmd = new PSCommand(); 

command2 ="Enable-Mailbox -Identity \""+ ExchangeIdentity 
    +"\" -Database \""+ExchangeDBName+ "\" -DomainController \"" 
    +ExchangeDC+"\" -primarysmtpaddress \""+ExchangePrimarySMTPAddress +"\""; 

command1 = "Set-CASMailbox -Identity \"" +ExchangePrimarySMTPAddress 
    +"\" -ActiveSyncEnabled "+ActiveSync_Status; 

allcommand = command2 + " |" + command1; 

runspace.Open(); 

powershell.AddScript(allcommand); 

powershell.Runspace = runspace; 
ICollection<PSObject> iobj = powershell.Invoke(); 

추가 스크립트에서 명령 1을 단독 실행하려고하면 사서함이 성공적으로 만들어집니다. 두 번째와 결합하면 사서함 만 만들어 지지만 활성 동기화는 비활성화되지 않습니다 (값을 false로 전달하면).

한 줄로 두 명령을 처리하는 방법은 무엇입니까?

답변

1

파워 쉘을 호출하고 사서함 생성을위한 1 명령을 실행 한 후 폐기 및 호출하고 실행 활성 동기화 명령을하고 처리하는 C# 코드의 또 다른 세트를 작성하는 C# 코드를 생성합니다.

참고 : 도메인 컨트롤러는 사서함 만들기 및 Active sync에 대해 동일해야합니다.

+0

AddStatement()를 사용하여 명령을 단일 호출로 일괄 처리 할 수 ​​있습니다. 아래의 @ JasonShirks의 답변을 참조하십시오. –

1

AddScript (command2) 및 AddScript (command1)를 파이프 라인에 연결 한 다음 호출하면 작동하지 않습니까?

이 서로 후 순서대로 두 명령을 실행하는 데 PowerShell을 강제해야한다 ...

+0

죄송합니다. "|"및 ";" "|" 스크립트는 실행되지 않았으며 ";" 사서함을 만들었지 만 활성 동기화 명령이 작동하지 않습니다. – GPR

+1

필자는 두 명령을 하나로 결합한 다음 powershell에 전달하지 말고 대신에 두 스크립트를 모두 PowerShell에 별도로 추가하려고 시도한 다음 호출하도록하십시오. 너 그거 해봤 니? – MichaC

0

Enable-Mailbox 명령에 문서에 따르면, 그것은 아무것도 출력하지 않습니다. 파이프는 잊어 버려. 그것을 ';'로 변경하십시오. 두 문장을 분리합니다.

+0

';' 나는 첫 번째 명령을 실행 시켰고 두 번째 명령은 실행하지 않았다. – GPR

3

방금 ​​명령을 호출하는 경우 AddScript를 사용하지 않는 것이 좋습니다. (

powershell.AddCommand("Enable-Mailbox") 
    .AddParameter("Identity", ExchangeIdentity) 
    .AddParameter("Database", ExchangeDBName) 
    .AddParameter("DomainController", ExchangeDC) 
    .AddParameter("PrimarySmtpAddress ", ExchangePrimarySMTPAddress); 
// AddStatement - like adding a ';' in a script - V3 only 
powershell.AddStatement(); 
powershell.AddCommand("Set-CASMailbox") 
    .AddParameter("Identity", ExchangePrimarySMTPAddress) 
    .AddParameter("ActiveSyncEnabled", ActiveSync_Status); 

이런 식으로 글 :

당신이 명령하지만 두 번째로 처음부터하지 파이프 결과를 모두 호출 할 가정하면, 당신은 PowerShell을 V3를 사용하는 가정이 같은 코드를 작성합니다 AddScript를 사용하지 않는 경우) 스크립트 주입과 관련된 문제를 피할 수 있습니다. 인수 중 하나라도 악의적 인 사용자가 올 수있는 경우 이전 견적 중 하나를 닫은 다음 악의적 인 스크립트를 추가하고 관리자 권한으로 해당 스크립트를 실행하는 인수를 구성 할 수 있습니다. AddCommand/AddParameter를 사용하면이 상황을 피할 수 있습니다.

인수를 완전히 제어하더라도 ';'와 같은 문자가 포함 된 경우 일부 인수로 문제가 발생할 수 있습니다. 당신은 논쟁을 적절하게 인용하지 않았습니다. 버전 2.0

를 들어

+0

+1 이것은 받아 들여진 대답이어야한다. AddStatement()를 사용하면 여러 명령을 "일괄 처리"하고 invoke를 한 번만 호출 할 수 있습니다. –