You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中获取PowerShell返回的Mailbox对象全部属性?

在C#中获取PowerShell返回的Mailbox对象属性的方法

你看到的ToString()返回邮箱名称只是因为该PSObject的默认字符串表示被设置为名称,实际返回的不是字符串,而是包装了Mailbox对象的PSObject实例。可以通过以下几种方式获取其他属性:

方法1:直接通过PSObject的属性集合访问

PSObject的Properties属性包含了所有PowerShell对象的属性,你可以通过属性名索引获取对应的值,也可以使用PSObject的索引器简化写法:

using System.Management.Automation;
using System.Collections.ObjectModel;

// 初始化PowerShell实例并执行命令
using (PowerShell ps = PowerShell.Create())
{
    ps.AddCommand("Get-Mailbox")
      .AddParameter("Identity", "test@test.com");
    
    Collection<PSObject> results = ps.Invoke();

    foreach (PSObject mailboxObj in results)
    {
        // 通过Properties属性访问
        string name = mailboxObj.Properties["Name"].Value?.ToString();
        string alias = mailboxObj.Properties["Alias"].Value?.ToString();
        
        // 使用索引器简化访问(等价于Properties[Key].Value)
        string primarySmtp = mailboxObj["PrimarySmtpAddress"]?.ToString();
        bool isArchiveEnabled = (bool?)mailboxObj["ArchiveEnabled"] ?? false;

        // 输出属性值
        Console.WriteLine($"名称: {name}, 别名: {alias}, 主邮箱: {primarySmtp}, 归档启用: {isArchiveEnabled}");
    }
}

方法2:强转为底层的.NET Mailbox对象

如果你的项目能引用Exchange管理程序集(通常在Exchange服务器的C:\Program Files\Microsoft\Exchange Server\V15\Bin目录下),可以将PSObject的BaseObject强转为Mailbox类型,直接访问强类型属性:

首先添加对Microsoft.Exchange.Data.Directory.Management.dll的引用,然后编写代码:

using System.Management.Automation;
using System.Collections.ObjectModel;
using Microsoft.Exchange.Data.Directory.Management;

using (PowerShell ps = PowerShell.Create())
{
    ps.AddCommand("Get-Mailbox")
      .AddParameter("Identity", "test@test.com");
    
    Collection<PSObject> results = ps.Invoke();

    foreach (PSObject mailboxObj in results)
    {
        // 强转为Mailbox类型
        Mailbox mailbox = (Mailbox)mailboxObj.BaseObject;

        // 直接访问强类型属性
        Console.WriteLine($"名称: {mailbox.Name}, 别名: {mailbox.Alias}");
        Console.WriteLine("邮箱地址列表:");
        foreach (var address in mailbox.EmailAddresses)
        {
            Console.WriteLine($"  - {address}");
        }
    }
}

注意事项

  • 方法2仅适用于本地运行Exchange管理命令的场景,或者远程PowerShell会话中已加载对应Exchange类型的情况;如果是跨机器的远程调用,BaseObject可能是动态类型,此时方法1更通用。
  • 访问属性时注意空值判断,避免NullReferenceException。

内容的提问来源于stack exchange,提问作者user3844416

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:12:58