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

如何用C#的GraphServiceClient/GraphConnection查询租户角色及分配用户数

如何用C#通过Microsoft Graph查询租户角色及对应分配用户数

当然可以!用GraphServiceClient就能轻松搞定这个需求——GraphConnection其实是比较早期的API客户端,现在更推荐用微软官方维护的GraphServiceClient(属于Microsoft Graph SDK for .NET)来做这类租户角色管理的操作。

第一步:准备权限和依赖包

首先,你需要确保应用拥有对应的Microsoft Graph权限:

  • 如果你是后台服务(无用户交互),申请应用权限:Directory.Read.All 或更精准的 RoleManagement.Read.Directory
  • 如果你是用户登录的应用,申请委托权限:同样是Directory.Read.All或RoleManagement.Read.Directory,且登录用户需要有查看角色分配的权限

然后安装必要的NuGet包:

Install-Package Microsoft.Graph
Install-Package Azure.Identity

第二步:初始化GraphServiceClient

以后台服务场景为例,用ClientCredentialsProvider初始化客户端:

using Microsoft.Graph;
using Azure.Identity;

// 替换成你的租户ID、客户端ID和客户端密钥
var tenantId = "your-tenant-id";
var clientId = "your-client-id";
var clientSecret = "your-client-secret";

var scopes = new[] { "https://graph.microsoft.com/.default" };
var credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
var graphClient = new GraphServiceClient(credential, scopes);

第三步:查询角色及分配用户数

核心逻辑是先获取所有目录角色,再逐个查询每个角色的用户成员数量:

try
{
    // 获取租户内所有目录角色(包含内置和自定义角色)
    var allRoles = await graphClient.DirectoryRoles
        .Request()
        .GetAsync();

    foreach (var role in allRoles)
    {
        Console.WriteLine($"角色名称: {role.DisplayName}");
        Console.WriteLine($"角色ID: {role.Id}");
        
        // 获取该角色下的所有用户成员(过滤掉服务主体等非用户类型)
        var initialMembers = await graphClient.DirectoryRoles[role.Id]
            .Members
            .Request()
            .Filter("odata.type eq '#microsoft.graph.user'")
            .GetAsync();

        // 处理分页(如果成员数量超过100条,Graph默认只返回前100)
        int totalUserCount = 0;
        var pageIterator = PageIterator<DirectoryObject>.CreatePageIterator(
            graphClient,
            initialMembers,
            (member) =>
            {
                totalUserCount++;
                return true;
            });

        await pageIterator.IterateAsync();

        Console.WriteLine($"已分配用户数量: {totalUserCount}");
        Console.WriteLine("------------------------");
    }
}
catch (ServiceException ex)
{
    Console.WriteLine($"请求失败: {ex.Message}");
    if (ex.InnerException != null)
    {
        Console.WriteLine($"内部错误: {ex.InnerException.Message}");
    }
}

一些实用提示

  • 如果你只想查询内置角色,可以在获取角色时添加Filter:.Filter("isBuiltIn eq true")
  • 委托权限场景下,初始化客户端可以用InteractiveBrowserCredential等用户登录的凭据类型
  • 如果你需要更详细的用户信息(比如用户邮箱),可以在获取成员时选择需要的字段:.Select("id,displayName,mail")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:30:56