【问题标题】:C# and powershell multiple commandC# 和 powershell 多命令
【发布时间】:2013-09-29 15:16:49
【问题描述】:

我在下面的代码中有两行 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)。

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

【问题讨论】:

    标签: c# powershell activesync


    【解决方案1】:

    对于 2.0 版

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

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

    【讨论】:

    • 您可以使用 AddStatement() 将命令批处理到单个调用中。请参阅下面@JasonShirks 的答案。
    【解决方案2】:

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

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

    【讨论】:

    • +1 这应该是公认的答案。 AddStatement() 允许您“批处理”多个命令并只调用一次。
    【解决方案3】:

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

    【讨论】:

    • 对于';'我执行了第一个命令,而第二个没有执行
    【解决方案4】:

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

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

    【讨论】:

    • 对不起,我试过用“|”和“;”而对于“|”脚本未执行,对于“;”我创建了邮箱,但活动同步命令不起作用。
    • 我的意思是你不应该将两个命令合二为一,然后将其传递给 powershell,而是尝试使用 AddScript 将两个脚本分别添加到 powershell,然后调用它们。你试过了吗?
    猜你喜欢
    • 2010-12-28
    • 1970-01-01
    • 2010-11-08
    • 2016-05-18
    • 1970-01-01
    • 2023-04-06
    • 2017-02-05
    • 2011-03-02
    • 2012-05-21
    相关资源
    最近更新 更多