如何在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
相关产品推荐
相关产品推荐

