如何从Exchange管理Shell枚举取值及在C#中获取AccessRights列表
问题1:如何从Exchange管理Shell创建的枚举中获取值?
- 单个枚举值:直接获取
PSObject的Properties["枚举属性名"].Value,再强转为对应的Exchange枚举类型(如MailboxRights)。 - 枚举集合:遍历返回的
PSObject集合,对每个元素提取Value后转换为目标枚举类型,或通过PSObject.BaseObject获取原始枚举实例再转换。
问题2:C#中获取指定身份的AccessRights列表
问题分析
直接强转obj.Properties["AccessRights"].Value为MailboxRights[]失败,是因为PowerShell返回的权限集合被包装为PSObject集合或非数组类型,无法直接匹配目标数组类型。
解决代码(适配.NET Framework 2.0)
String execCommand = "Get-MailboxPermission -Identity \"{OBJECT_GUID}\""; results = executeCommand(execCommand, ref errString); foreach (PSObject obj in results) { var accessRightsValue = obj.Properties["AccessRights"].Value; List<Microsoft.Exchange.Management.RecipientTasks.MailboxRights> accessRights = new List<Microsoft.Exchange.Management.RecipientTasks.MailboxRights>(); // 处理可枚举的权限集合 if (accessRightsValue is IEnumerable enumerableRights) { foreach (var item in enumerableRights) { if (item is PSObject psItem) { // 从PSObject中提取原始枚举实例 var right = (Microsoft.Exchange.Management.RecipientTasks.MailboxRights)psItem.BaseObject; accessRights.Add(right); } else if (item is Enum enumItem) { // 直接转换为目标枚举类型 var right = (Microsoft.Exchange.Management.RecipientTasks.MailboxRights)enumItem; accessRights.Add(right); } } } // 使用获取到的权限列表 foreach (var right in accessRights) { // 示例:输出权限名称 Console.WriteLine(right.ToString()); } }
关键说明
- 类型兼容处理:先判断权限值是否为可枚举类型,遍历每个元素并分别处理
PSObject包装的枚举和直接的枚举实例。 - 程序集引用:确保项目已引用Exchange管理程序集
Microsoft.Exchange.Management.RecipientTasks.dll,否则MailboxRights类型无法识别。 - .NET 2.0适配:使用
List<T>替代泛型集合的其他高级特性,符合.NET 2.0语法规范。
内容的提问来源于stack exchange,提问作者Manoj A
相关产品推荐
相关产品推荐

