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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:40:07