繁体   English   中英

使用图表 API 从 AAD 组中仅获取“用户”类型的成员数

[英]Get ONLY the count of members of 'User' type from an AAD group using Graph API

是否有图表 API 可以从 AAD 组中获取特定类型的成员数量? 例如,考虑以下 AAD 组:

在此处输入图像描述

该组包含 3 个“用户”类型的成员。 是否有图表 API 只能获得该计数,即 3? 或者我应该从组中获取所有成员并进行一些过滤以获取“用户”类型的成员,如下所示并找出计数:

var users = new List<Guid>();
var response = await graphClient
           .Groups[groupId]
           .TransitiveMembers
           .Request()           
           .GetAsync();

users.AddRange(ToUsers(response));

private IEnumerable<Guid> ToUsers(IEnumerable<DirectoryObject> members)
{
            foreach (var directoryObj in fromGraph)
            {
                switch (directoryObj)
                {                    
                    case User user:
                        yield return Guid.Parse(user.Id);
                        break;
                    default:
                        break;
                }
            }
}

要从 AAD 组中获取特定类型的成员数,您可以使用以下查询:

GET https://graph.microsoft.com/v1.0/groups/<group_id>/members/microsoft.graph.user/$count

我试图在我的环境中重现相同的结果并得到以下结果:

我创建了一个Azure AD 组,其中包含不同类型的成员,如下所示:

在此处输入图像描述

我通过Graph Explorer运行了以下查询,并成功获取了User类型的成员数,如下所示:

GET https://graph.microsoft.com/v1.0/groups/<group_id>/members/microsoft.graph.user/$count

确保在运行查询时添加ConsistencyLevel: Eventual请求 header。

回复:

在此处输入图像描述

您可以通过选择代码片段选项卡来获取任何语言的代码,如下所示:

在此处输入图像描述

C# 中的代码示例

GraphServiceClient graphClient = new GraphServiceClient( authProvider );

var int32 = await graphClient.Groups["groupID"].Members.$count
.Request()
.Header("ConsistencyLevel","Eventual")
.GetAsync();

首先,让我们看一下与您的要求相同的图表api 示例 它需要/members/microsoft.graph.user ,但 Graph SDK 目前不支持按派生类型进行过滤,这是一个已知问题,请参阅此问题 所以我们需要使用这样的代码:

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

var groupUrl = graphClient.Groups["group_id"].Members.AppendSegmentToRequestUrl("microsoft.graph.user");
var groupRequest = await new GraphServiceGroupsCollectionRequest(groupUrl, graphClient, null).GetAsync();
var userCount = groupRequest.Count;

我们需要在请求中使用AppendSegmentToRequestUrl to append microsoft.graph.user它对我有用。

在此处输入图像描述

顺便说一句,您可能还想 append /$count 使代码应如下所示:

var requestOptions = new List<HeaderOption>()
{
    new HeaderOption("ConsistencyLevel", "eventual")
};
var groupUrl = graphClient.Groups["group_id"].Members.AppendSegmentToRequestUrl("microsoft.graph.user/$count");
var groupRequest = await new GraphServiceGroupsCollectionRequest(groupUrl, graphClient, requestOptions).GetAsync();

但它会抛出异常,因为响应是一个数字而不是Group 所以我们不能使用它,除非我们使用 http 客户端手动发送获取请求,但它与图形 SDK 无关。 无论如何,我会在这里分享代码。

var clientSecretCredential = new ClientSecretCredential(
    tenantId, clientId, clientSecret);
var tokenRequestContext = new TokenRequestContext(scopes);
var token = clientSecretCredential.GetTokenAsync(tokenRequestContext).Result.Token;
httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token );
var groupUrl = graphClient.Groups["group_id"].Members.AppendSegmentToRequestUrl("microsoft.graph.user/$count");
HttpResponseMessage response = await _httpClient.GetAsync(groupUrl);

最后,请看下面的截图。 所以图形资源管理器生成的代码片段是错误的。

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM