0

我尝试通过 c# 使用此 PowerShell 命令获取交换服务器中特定用户的电子邮件列表

"get-mailbox -Identity username -resultsize unlimited | select Name -expand EmailAddresses | Select SmtpAddress"

这项工作在 powershell 控制台中

但是如果我在 PowerShell 上调用Invoke没有返回 PsObject 有没有办法解决这个问题?

我试着只调用这个脚本"get-mailbox -Identity user"我有一个 PSObject 但我必须这样做

    Collection<PSObject> getInfo = new Collection<PSObject>();
    getInfo = runExchCmd(Pscmd); // runExchCmd just a function to invoke PowerShellCommand to be execute and return Collection PSObject
    PSMemberInfo psobjEmail = getInfo[0].Members["EmailAddresses"];
    object obj = psobjEmail.Value;

但是,是的,该值是某种长字符串,所有电子邮件都与用户相关联,将每封电子邮件提取到数组中看起来很痛苦,有什么帮助吗?

4

1 回答 1

1

根据我在 C# 中运行 powershell 和 Microsoft Exchange 代码的经验,可能有点棘手。这是我必须做的:

在像这样App.Config添加useLegacyV2RuntimeActivationPolicy="true"到启动标记中(您不必拥有 .net 4.5)这允许 Microsoft.Exchange.Management.PowerShell.Admin 正确加载(您必须在本地计算机上安装 Exchange 工具跑步)。:

  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>

然后,假设您已将System.Management.Automation引用添加到项目中,您可以在 C# 中像这样构建 Powershell 查询:

    string username = "username";

    using (PowerShell PowerShellInstance = PowerShell.Create())
    {
        PowerShellInstance.AddScript("param ([string]$user); add-pssnapin 'Microsoft.Exchange.Management.PowerShell.Admin';" +
            "get-mailbox -Identity $user -resultsize unlimited | select Name -expand EmailAddresses | Select SmtpAddress;");

        PowerShellInstance.AddParameter("user", username);
        Collection<PSObject> PSOutput = PowerShellInstance.Invoke();
        if (PowerShellInstance.Streams.Error.Count > 0)
        {
            foreach (var error in PowerShellInstance.Streams.Error)
            {
                //for reading errors in debug mode
                StringBuilder sb = new StringBuilder();
                sb.AppendLine(error.Exception.Message);
                sb.AppendLine(error.Exception.InnerException.Message);
                sb.AppendLine(error.CategoryInfo.Category.ToString());
                sb.AppendLine(error.CategoryInfo.Reason);
                sb.AppendLine(error.ErrorDetails.Message);
                sb.AppendLine(error.ErrorDetails.RecommendedAction);
                Console.WriteLine(sb.ToString());
            }
        }
        if (PSOutput.Count > 0)
        {
            foreach (var item in PSOutput)
            {
                Console.WriteLine(item);
            }
        }
    }

我还必须更改我的项目以构建为 x64,因为 Exchange 的 powershell 插件是 64 位的。

于 2015-10-28T18:35:11.160 回答