如何识别不属于特定AD组的Exchange邮箱及Graph SDK相关问题
问题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; } } } - 筛选非区域组成员的邮箱
从你的数据库表中,筛选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
相关产品推荐
相关产品推荐

