2013-09-24 85 views
1

我在下面的代碼中有兩行power-shell命令。命令1啓用郵箱,命令2禁用活動同步。C#和powershell多個命令

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

對於版本2.0

創建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的V3,我會寫這樣的代碼:

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); 

寫這樣(不使用AddScript),可以避免腳本注入造成的一個可能的問題。如果任何參數可能來自惡意用戶,則可以構建一個關閉前面引號之一的參數,然後添加惡意腳本,然後使用管理員權限運行該腳本。使用AddCommand/AddParameter,你可以避免這種情況。

即使完全控制參數,如果它們包含像';'這樣的字符,仍然可能會遇到一些參數問題。而且你沒有適當地引用論據。

+0

+1這應該是公認的答案。 AddStatement()允許您「批量」多個命令並僅調用一次調用。 –