如何用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
相关产品推荐
相关产品推荐

