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

如何识别不属于特定AD组的Exchange邮箱及Graph SDK相关问题

问题1:识别(间接)不属于任何区域组的邮箱

核心逻辑是先获取所有区域组的全层级间接成员(包含嵌套组内的用户),再从所有邮箱用户中排除这些成员,剩余对象即为目标。具体实现步骤:

  1. 批量获取区域组的间接成员
    利用Microsoft Graph的transitiveMembers关系获取每个区域组的所有层级成员(自动处理嵌套组),需注意Graph API的分页限制,循环拉取全部数据:
    // 提前准备10个区域组的ID集合
    var regionGroupIds = new List<string> { "group-id-1", "group-id-2", ... };
    var allRegionMemberIds = new HashSet<string>();
    
    foreach (var groupId in regionGroupIds)
    {
        var membersPage = await graphClient.Groups[groupId].TransitiveMembers.GetAsync(config =>
        {
            config.QueryParameters.Select = new[] { "id" }; // 仅获取用户ID,减少数据量
        });
    
        while (membersPage != null)
        {
            // 仅收集用户类型的成员,过滤嵌套组本身
            foreach (var member in membersPage.Value.Where(m => m is User))
            {
                allRegionMemberIds.Add(((User)member).Id);
            }
    
            // 处理分页,拉取下一页数据
            if (!string.IsNullOrEmpty(membersPage.OdataNextLink))
            {
                membersPage = await graphClient.Groups[groupId].TransitiveMembers.WithUrl(membersPage.OdataNextLink).GetAsync();
            }
            else
            {
                break;
            }
        }
    }
    
  2. 筛选非区域组成员的邮箱
    从你的数据库表中,筛选ExternalDirectoryObjectId不在allRegionMemberIds集合中的记录;若直接从Graph获取邮箱用户,可先通过$filter=mail ne null筛选出带邮箱的用户,再对比ID集合。

问题2:通过Graph SDK获取所有邮箱列表

完全可以替代Get-EXOMailbox -ResultSize Unlimited,利用Graph API的/users端点或Exchange专用端点实现,需处理分页以获取全量数据:

方案1:获取带邮箱的基础用户信息

适用于只需用户核心字段(如ID、邮箱、用户名)的场景,通过筛选mail属性过滤:

var allMailboxUsers = new List<User>();
var usersPage = await graphClient.Users.GetAsync(config =>
{
    // 按需选择需要的字段,减少返回数据量
    config.QueryParameters.Select = new[] { "id", "mail", "displayName", "userPrincipalName" };
    config.QueryParameters.Filter = "mail ne null";
});

while (usersPage != null)
{
    allMailboxUsers.AddRange(usersPage.Value);

    // 处理分页
    if (!string.IsNullOrEmpty(usersPage.OdataNextLink))
    {
        usersPage = await graphClient.Users.WithUrl(usersPage.OdataNextLink).GetAsync();
    }
    else
    {
        break;
    }
}

方案2:获取邮箱的Exchange配置详情

若需要类似Get-EXOMailbox的邮箱配置信息(如邮箱类型、归档状态),可调用Graph的mailboxSettings端点(需Exchange Online权限):

// 示例:获取单个用户的邮箱配置
var mailboxSettings = await graphClient.Users["user-id"].MailboxSettings.GetAsync();

注意:使用Graph SDK需在Azure AD应用注册中授予对应权限,如User.Read.All(读取用户信息)、Group.Read.All(读取组成员),权限需根据实际需求配置。


内容的提问来源于stack exchange,提问作者Chris Fellows

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:42:26