3

我在下面的代码中有两行 power-shell 命令。命令 1 启用邮箱,命令 2 禁用活动同步。

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

如何在单行中处理两个命令?

4

4 回答 4

7

如果您只是调用命令,我建议不要使用 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,您可以避免这种情况。

即使您完全控制参数,如果某些参数包含诸如“;”之类的字符,您仍然可能会遇到问题 而且您没有正确引用论点。

于 2013-09-24T22:00:55.950 回答
1

如果您将 AddScript(command2) 和 AddScript(command1) 添加到管道然后调用它们,它不起作用吗?

这应该强制powershell依次运行这两个命令......

于 2013-09-24T12:25:08.837 回答
1

对于 2.0 版

创建 c# 代码以调用 power shell 并执行第一个命令以创建邮箱,然后处置并编写另一组 c# 代码以调用和执行 Active sync 命令并处置。

注意:邮箱创建和活动同步的域控制器应该相同。

于 2013-10-07T05:58:34.257 回答
0

根据Enable-Mailbox命令上的文档,它不输出任何内容。忘记管子。将其更改为“;” 将两个语句分开。

于 2013-09-24T17:09:26.570 回答