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

AD组筛选异常:含Admin的组无法匹配及System.NullReferenceException排查

问题原因分析
  • 空引用异常根源:TransitiveMemberOf返回的是全类型目录对象(用户、组、设备等都包含),并非只有组。你把这些对象全部转成AzureADGroupInfo时,非组对象的DisplayName大概率是null,调用Contains("Admin")直接触发空引用异常。
  • 筛选结果为空的原因:
    1. 非组对象被强行转成AzureADGroupInfo,导致集合里混了一堆无效数据,干扰筛选逻辑。
    2. 序列化再反序列化的操作会丢失Graph API返回对象的类型信息,没法精准识别真正的组,可能直接把目标组的信息搞乱了。
修复方案

1. 先筛出真正的Group对象

利用Graph API返回对象的类型,用OfType<Group>直接过滤出组:

// 调用Graph API拿所有传递成员身份对象
var directoryObjects = await graphClient.Me.TransitiveMemberOf
    .Request()
    .Header("ConsistencyLevel", "eventual")
    .GetAsync();

// 只保留Group类型的对象
var groups = directoryObjects.OfType<Group>();

2. 手动映射到自定义类型,别用序列化绕弯

直接把Graph的Group对象属性映射到你的AzureADGroupInfo,避免类型不匹配:

IEnumerable<AzureADGroupInfo> allADGroups = groups.Select(g => new AzureADGroupInfo
{
    DisplayName = g.DisplayName,
    // 其他需要的属性比如Id、Description也在这里映射
});

3. 筛选时先判空,避免异常

在筛选前先检查DisplayName不为空,再执行包含判断:

IEnumerable<AzureADGroupInfo> relevantADGroups = allADGroups
    .Where(t => !string.IsNullOrEmpty(t.DisplayName) && t.DisplayName.Contains("Admin"));

完整修复代码

// Makes a call to Microsoft Graph
var directoryObjects = await graphClient.Me.TransitiveMemberOf
    .Request()
    .Header("ConsistencyLevel", "eventual")
    .GetAsync();

// 筛选组并映射到自定义类型
IEnumerable<AzureADGroupInfo> allADGroups = directoryObjects.OfType<Group>()
    .Select(g => new AzureADGroupInfo
    {
        DisplayName = g.DisplayName,
        // 补充其他属性映射
    });

// 安全筛选目标组
IEnumerable<AzureADGroupInfo> relevantADGroups = allADGroups
    .Where(t => !string.IsNullOrEmpty(t.DisplayName) && t.DisplayName.Contains("Admin"));

this.SetUserCompany(relevantADGroups);
额外提醒

Graph API默认分页返回结果,如果你的组数量超过一页(一般是200条),要处理分页才能拿到所有组:

var allDirectoryObjects = new List<DirectoryObject>();
var page = await graphClient.Me.TransitiveMemberOf
    .Request()
    .Header("ConsistencyLevel", "eventual")
    .GetAsync();

allDirectoryObjects.AddRange(page);
while (page.NextPageRequest != null)
{
    page = await page.NextPageRequest.GetAsync();
    allDirectoryObjects.AddRange(page);
}

var groups = allDirectoryObjects.OfType<Group>();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 20:12:55