0

我有一个简单的控制台应用程序,试图通过 PowerShell 在 Exchange 中创建一个通讯组并向其中添加一些成员。

class Program
{
    static void Main(string[] args)
    {
        string userName = "foo";
        string password = "pwd";

        // Encrypt password using SecureString class
        SecureString securePassword = new SecureString();

        foreach (char c in password)
        {
            securePassword.AppendChar(c);
        }

        PSCredential credential = new PSCredential(userName, securePassword);

        // Connection information object required to connect to the service
        WSManConnectionInfo connectionInfo = new WSManConnectionInfo(
            new Uri("https://ps.outlook.com/powershell"), 
            "http://schemas.microsoft.com/powershell/Microsoft.Exchange", 
            credential);

        connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Basic;
        connectionInfo.MaximumConnectionRedirectionCount = 2;



        // Create runspace on remote Exchange server
        using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo))
        {
            runspace.Open();

            using(PowerShell ps = PowerShell.Create())
            {
                ps.Runspace = runspace;

                Command newDG = new Command("New-DistributionGroup");
                newDG.Parameters.Add(new CommandParameter("Name", "Test"));
                ps.Commands.AddCommand(newDG);

                Command addDGMember1 = new Command("Add-DistributionGroupMember");
                addDGMember1.Parameters.Add(new CommandParameter("Identity", "Test"));
                addDGMember1.Parameters.Add(new CommandParameter("Member", "testuser1@somecompany.com"));
                ps.Commands.AddCommand(addDGMember1);

                Command addDGMember2 = new Command("Add-DistributionGroupMember");
                addDGMember2.Parameters.Add(new CommandParameter("Identity", "Test"));
                addDGMember2.Parameters.Add(new CommandParameter("Member", "testuser2@somecompany.com"));
                ps.Commands.AddCommand(addDGMember2);


                try
                {
                    // Invoke command and store the results in a PSObject
                    Collection<PSObject> results = ps.Invoke();

                    if (ps.Streams.Error.Count > 0)
                    {
                        foreach (ErrorRecord error in ps.Streams.Error)
                        {
                            Console.WriteLine(error.ToString());
                        }
                    }

                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                finally
                {
                    Console.WriteLine("Operation completed.");
                }

            }
        }

        Console.ReadKey();
    }
}

当我运行我的应用程序时,它会引发此错误:输入对象无法绑定到命令的任何参数,因为命令不接受管道输入,或者输入及其属性与接受管道输入的任何参数都不匹配。

但实际上是创建了通讯组。

另外,我注意到,当我注释掉创建新通讯组的命令并运行添加通讯组成员的命令时,只添加了第一个成员。我真的很困惑我应该如何处理这个问题,我有以下问题:

  1. 如何让我的代码成功运行所有命令?

  2. 执行多个远程 PowerShell 命令的最佳方法是什么?我是否分别运行每个命令,检查返回对象是否成功,然后继续执行下一个命令。有什么性能问题需要注意吗?

  3. 运行空间一次只运行一个命令吗?

当我尝试以下代码时,我遇到了这个错误: 这个运行空间不支持语法。这可能是因为它处于无语言模式。

using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo))
        {
            runspace.Open();

            using(PowerShell ps = PowerShell.Create())
            {
                ps.Runspace = runspace;

                Pipeline pipe = runspace.CreatePipeline();
                pipe.Commands.AddScript("New-DistributionGroup -Name Test2");

                try
                {
                    Collection<PSObject> results = pipe.Invoke();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
      }
4

1 回答 1

2

System.Management.Automation.Powershell:

提供用于创建命令管道并在运行空间内同步或异步调用这些命令的方法。此类还提供对包含在调用命令时生成的数据的输出流的访问。

重要的部分是 - create a pipeline。您正在做的是创建一个管道并使用 向它添加命令,ps.Commands.AddCommand并且由于您添加它们的方式以及您提供的其他参数,您会看到您看到的错误。因为New-DistributionGroup无法将输出对象馈送到Add-DistributionGroupMember等等。

如此有效地,管道中的第一个命令运行,而下一个命令失败,因为您通过管道传输的对象不兼容(尤其是在您添加参数之后)。因此,通讯组被创建,当您将其注释掉时,只会添加第一个成员。

您可以尝试的一件事是使用Powershell.AddScript

string script = "New-DistributionGroup -Name Test; Add-DistributionGroupMember -Identity Test -Member testuser1@somecompany.com";
ps.AddScript(script);
ps.Invoke();

否则我认为你将不得不添加一个命令,调用它,清除命令(ps.Commands.Clear())并添加下一个命令,调用它等等。

于 2011-10-10T03:10:15.503 回答