2013-09-24 89 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()允许您“批量”多个命令并仅调用一次调用。 –