Exchange Online中Get-DistributionGroupMember无法获取Initials的问题问询
问题:执行
Get-DistributionGroupMember无法返回Initials,求解决方案 执行PowerShell命令Get-DistributionGroupMember时,无法获取用户的Initials(中间名缩写),请问是不是漏了什么配置?有没有更高效的实现方式?
public List<EmailGroup> GetDistributionGroupMember(string distributionAddress, string displayName) { ClearPowerShell(); List<EmailGroup> EmailGroups = new List<EmailGroup>(); powerShell.AddCommand("get-distributiongroupmember") .AddParameter("Identity", distributionAddress) .AddParameters(new Dictionary<string, object>() { { "ResultSize", "Unlimited" } }) .AddCommand("Select-Object") .AddArgument(new string[] { "PrimarySMTPAddress", "DisplayName", "FirstName", "Initials", "LastName" }); Collection<PSObject> results = powerShell.Invoke(); foreach (var result in results) { var propertyName = result.Properties.Where(w => w.Name == "DisplayName").Select(s => s.Value).FirstOrDefault(); var propertyEmail = result.Properties.Where(w => w.Name == "PrimarySmtpAddress").Select(s => s.Value).FirstOrDefault(); var FirstName = result.Properties.Where(w => w.Name == "FirstName").Select(s => s.Value).FirstOrDefault(); var Initials = result.Properties.Where(w => w.Name == "Initials").Select(s => s.Value).FirstOrDefault(); var LastName = result.Properties.Where(w => w.Name == "LastName").Select(s => s.Value).FirstOrDefault(); EmailGroup emailGroup = new EmailGroup(); emailGroup.Email = (string)propertyEmail; string fullName = string.Format("{0},{1},{2}", LastName, FirstName, Initials); emailGroup.FullName = fullName; emailGroup.GroupName = displayName; EmailGroups.Add(emailGroup); } if (powerShell.HadErrors) { var exception = powerShell.Streams.Error.ElementAt(0).Exception; } return EmailGroups; }
更新
目前只能通过调用Get-contact来获取Initials,但这种方式运行速度极慢:
public List<EmailGroup> GetDistributionGroupMember(string distributionAddress, string displayName) { ClearPowerShell(); List<EmailGroup> EmailGroups = new List<EmailGroup>(); Console.WriteLine(distributionAddress); powerShell.AddCommand("get-distributiongroupmember") .AddParameter("Identity", distributionAddress) .AddParameters(new Dictionary<string, object>() { { "ResultSize", "Unlimited" } }); Collection<PSObject> results = powerShell.Invoke(); foreach (PSObject result in results) { ClearPowerShell(); string propertyEmail = result.Properties.Where(w => w.Name == "PrimarySmtpAddress").Select(s => s.Value).FirstOrDefault().ToString(); Console.WriteLine(propertyEmail); powerShell.AddCommand("Get-contact") .AddParameter("Identity", propertyEmail) .AddCommand("Select-Object") .AddArgument(new string[] { "FirstName", "Initials", "LastName" }); Collection<PSObject> contact = powerShell.Invoke(); if (contact.Count != 0) { var FirstName = contact[0].Properties.Where(w => w.Name == "FirstName").Select(s => s.Value).FirstOrDefault(); var Initials = contact[0].Properties["Initials"].Value; var LastName = contact[0].Properties.Where(w => w.Name == "LastName").Select(s => s.Value).FirstOrDefault(); EmailGroup emailGroup = new EmailGroup(); emailGroup.Email = propertyEmail; string fullName = string.Format("{0},{1},{2}", LastName, FirstName, Initials); emailGroup.FullName = fullName; emailGroup.GroupName = displayName; EmailGroups.Add(emailGroup); } } if (powerShell.HadErrors) { var exception = powerShell.Streams.Error.ElementAt(0).Exception; } return EmailGroups; }
解决方案
问题原因
Get-DistributionGroupMember默认只返回组成员的核心标识属性(比如PrimarySMTPAddress、DisplayName),像Initials、FirstName这类属于用户/联系人的扩展属性,不在默认返回的属性集中,所以直接用Select-Object指定也拿不到。
高效实现方式
直接在Get-DistributionGroupMember命令中通过-Properties参数指定需要获取的扩展属性,一次性拉取所有需要的数据,避免循环调用Get-Contact带来的性能损耗。
修改后的C#代码示例:
public List<EmailGroup> GetDistributionGroupMember(string distributionAddress, string displayName) { ClearPowerShell(); List<EmailGroup> EmailGroups = new List<EmailGroup>(); powerShell.AddCommand("get-distributiongroupmember") .AddParameter("Identity", distributionAddress) .AddParameter("Properties", new string[] { "Initials", "FirstName", "LastName" }) // 新增指定扩展属性 .AddParameters(new Dictionary<string, object>() { { "ResultSize", "Unlimited" } }) .AddCommand("Select-Object") .AddArgument(new string[] { "PrimarySMTPAddress", "DisplayName", "FirstName", "Initials", "LastName" }); Collection<PSObject> results = powerShell.Invoke(); foreach (var result in results) { var propertyEmail = result.Properties["PrimarySmtpAddress"]?.Value as string; var firstName = result.Properties["FirstName"]?.Value as string; var initials = result.Properties["Initials"]?.Value as string; var lastName = result.Properties["LastName"]?.Value as string; EmailGroup emailGroup = new EmailGroup(); emailGroup.Email = propertyEmail; string fullName = string.Format("{0},{1},{2}", lastName, firstName, initials); emailGroup.FullName = fullName; emailGroup.GroupName = displayName; EmailGroups.Add(emailGroup); } if (powerShell.HadErrors) { var exception = powerShell.Streams.Error.ElementAt(0).Exception; // 这里可以添加异常处理逻辑 } return EmailGroups; }
补充说明
- 如果组内成员包含外部联系人和内部邮箱用户,
-Properties参数依然能覆盖这两类对象的Initials属性,无需区分处理。 - 之前循环调用
Get-Contact速度慢的原因是每个成员都单独发起一次PowerShell请求,网络和命令执行的开销被放大,一次性批量获取才是最优方案。
内容的提问来源于stack exchange,提问作者Jefferson
相关产品推荐
相关产品推荐

