Get-DistributionGroup返回组名称为GUID的问题求助(附实现代码)
解决Exchange通讯组名称返回GUID的问题
你的代码逻辑可以获取通讯组的PrimarySmtpAddress和Name,但部分组返回GUID而非实际名称,核心原因是Exchange中部分通讯组的Name字段是内部标识符(可能是自动化创建时生成的GUID),并非面向用户的显示名称。
解决方案
- 优先使用
DisplayName字段:这是Exchange中展示给用户的正式组名称,几乎不会出现GUID的情况,更符合业务场景需求。 - 双字段兜底逻辑:若需保留
Name原始值,可同时获取Name和DisplayName,当Name为GUID时自动切换为DisplayName。
修改后的代码示例
public List<ExchangeGroup> GetDistributionGroup() { List<ExchangeGroup> exchangeGroups = new List<ExchangeGroup>(); ClearPowerShell(); // 同时获取DisplayName、Name和PrimarySMTPAddress powerShell.AddCommand("Get-DistributionGroup") .AddParameters(new Dictionary<string, object>() { { "ResultSize", "Unlimited" } }) .AddCommand("Select-Object") .AddArgument(new string[] { "PrimarySMTPAddress", "DisplayName", "Name" }); Collection<PSObject> results = powerShell.Invoke(); foreach (var result in results) { ExchangeGroup emailGroup = new ExchangeGroup(); var displayName = result.Properties.Where(w => w.Name == "DisplayName").Select(s => s.Value).FirstOrDefault(); var primaryEmail = result.Properties.Where(w => w.Name == "PrimarySmtpAddress").Select(s => s.Value).FirstOrDefault(); var rawName = result.Properties.Where(w => w.Name == "Name").Select(s => s.Value).FirstOrDefault(); // 判断原始Name是否为GUID,是则用DisplayName兜底 string groupName = IsGuid(rawName?.ToString()) ? displayName?.ToString() : rawName?.ToString(); emailGroup.ExchangeName = groupName; emailGroup.ExchangeEmail = primaryEmail?.ToString(); exchangeGroups.Add(emailGroup); } if (powerShell.HadErrors) { var exception = powerShell.Streams.Error.ElementAt(0).Exception; // 建议添加异常日志或抛出逻辑 } return exchangeGroups; } // 辅助方法:判断字符串是否为GUID格式 private bool IsGuid(string input) { return Guid.TryParse(input, out _); }
补充说明
- Exchange中
Name是组的唯一内部标识符,部分自动化创建流程会将其设为GUID;DisplayName是用户可见的友好名称,通常为人工设置值。 - 若业务必须使用
Name字段,可通过Exchange管理控制台或PowerShell命令批量修正组的Name属性。
内容的提问来源于stack exchange,提问作者Jefferson
相关产品推荐
相关产品推荐

