首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Graph只从AAD组中获取“User”类型成员的计数

问使用Graph只从AAD组中获取“User”类型成员的计数
EN

Stack Overflow用户
提问于 2022-09-25 06:56:44
回答 2查看 199关注 0票数 1

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

​

​

此组包含3个类型为“User”的成员。是否有一个图API只得到这个计数,即3?或者,我是否应该从组中获取所有成员并进行一些筛选,以获得“User”类型的成员,如下所示,并找出计数:

代码语言:javascript
复制
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;
                }
            }
}
EN

回答 2

Stack Overflow用户

发布于 2022-09-25 08:15:00

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

代码语言:javascript
复制
GET https://graph.microsoft.com/v1.0/groups/<group_id>/members/microsoft.graph.user/$count

我尝试在我的环境中复制相同的结果,并得到了以下结果:

我创建了一个Azure广告组,其成员类型不同,如下所示:

​

​

我通过User图资源管理器( Graph )运行了以下查询,并成功地获得了以下类型成员的计数:

代码语言:javascript
复制
GET https://graph.microsoft.com/v1.0/groups/<group_id>/members/microsoft.graph.user/$count

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

响应:

​

​

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

​

​

代码示例在C#中

代码语言:javascript
复制
GraphServiceClient graphClient = new GraphServiceClient( authProvider );

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

Stack Overflow用户

发布于 2022-09-26 06:15:57

首先,让我们看看图api示例,它与您的需求是相同的。它需要/members/microsoft.graph.user,但是Graph目前不支持通过派生类型进行筛选,这是一个已知的问题,参见本期。所以我们需要使用这样的代码:

代码语言:javascript
复制
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在请求中追加microsoft.graph.user,它对我起了作用。

​

​

顺便说一句,您可能也想添加/$count。因此代码应该如下所示:

代码语言:javascript
复制
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客户端手动发送get请求,但它与图形SDK无关。不管怎样,我会在这里分享代码。

代码语言:javascript
复制
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);

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

​

​

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73842602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档