c# Exchange PowerShell pipeLine Invoke为空参数值引发CmdletInvocatio

本文关键字:参数 CmdletInvocatio Exchange PowerShell pipeLine Invoke | 更新日期: 2023-09-27 18:17:09

我试图获得一个简单的PowerShell命令输出到c#中,使用在System.Management.Automation命名空间中发现的功能。

我的机器上有Exchange控制台,并且可以从控制台成功地发出命令,但是从c#中我得到一个我不理解的错误。

下面是应该获得一些简单服务器信息的示例代码:
static void Main(string[] args)
{
    RunspaceConfiguration rsConfig = RunspaceConfiguration.Create();
    PSSnapInException snapInException = null;
    PSSnapInInfo info = rsConfig.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.E2010", out snapInException);
    using (Runspace myRunSpace = RunspaceFactory.CreateRunspace(rsConfig))
    {
        myRunSpace.Open();
        using (Pipeline pipeLine = myRunSpace.CreatePipeline())
        {
            Command serverCommand = new Command("Get-MailboxServer");
            pipeLine.Commands.Add(serverCommand);
            Collection<PSObject> server = pipeLine.Invoke();
            foreach (PSObject cmdlet in server)
            {
                string cmdletName = cmdlet.Properties["Name"].Value.ToString();
                Console.WriteLine(cmdletName);
            }
        }
    }
}

实际错误发生在pipeLine.Invoke()行:

System.Management.Automation。CmdletInvocationException未处理
值不能为空。
参数名称:parameters
源= System.Management.Automation

我已经尝试添加参数,例如服务器身份,但同样的事情发生:

using (Pipeline pipeLine = myRunSpace.CreatePipeline())
{
    Command serverCommand = new Command("Get-MailboxServer");
    serverCommand.Parameters.Add("Identity", mbServerName);
    pipeLine.Commands.Add(serverCommand);
    Collection<PSObject> server = pipeLine.Invoke();
}

c# Exchange PowerShell pipeLine Invoke为空参数值引发CmdletInvocatio

将这些行添加到您的app.config文件

<startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
</startup>

我用Get-Process替换了这个命令,它工作得很好。这似乎是一个问题,如何交换cmdlet工作(即使Get-Mailboxserver也有一个变种,不接受任何参数。)

这个线程讨论了这个问题,并提出了一个替代解决方案:http://social.technet.microsoft.com/Forums/en-US/exchangesvrdevelopment/thread/48da1346-f47e-4ba9-9747-428fe07b4492/