1

我知道如何使用下面的其余查询按类型过滤成员目录角色:

https://graph.microsoft.com/v1.0/me/memberOf/$/microsoft.graph.directoryRole

所以 MS Graph api 的响应只包含directoryRole对象。不确定如何使用 MS Graph .Net 客户端 SDK 完成此操作,因为我们没有指定任何 OData 关键字,例如SelectFilter在实际的 Rest 请求中。

请注意,我不想在客户端的内存中调用memberOf和过滤directoryRole类型响应,我希望此过滤器成为上面 URL 中查询的一部分,因此memberOf响应仅包含directoryRoles。

4

2 回答 2

1

Graph Net Client 没有直接支持您的要求。

但根据我的测试,我们可以尝试以下解决方法:

使用下面的代码获取带有 DirectoryRole 的列表,然后通过 DisplayName 过滤,然后检查角色模板 id(对于来自Me.MemberOf的 directoryRole ,如果 DisplayName 包含Administrator,基本上,我们是管理员角色。如果使用DirectoryRoles api ,我们可以迭代列表并检查角色模板 id):

// This will contains the group too, we need to filter it to get the directoryrole

    IUserMemberOfCollectionWithReferencesRequest builder = graphClient.Me.MemberOf.Request();
                    IUserMemberOfCollectionWithReferencesPage page = await builder.GetAsync();

    // This is all directoryrole in our tenant, we need to filter by DisplayName contains **Administrator**
                IGraphServiceDirectoryRolesCollectionRequest request = graphClient.DirectoryRoles.Request();
                IGraphServiceDirectoryRolesCollectionPage directoryRoles = await request.GetAsync();

Me.MemberOf的结果: DirectoryRoles在此处输入图像描述的 结果: 在此处输入图像描述

如果解决方法仍然不能满足您的要求,我建议您在uservoicegithub 问题上提交功能请求

补充答案:( 不幸的是,Microsoft Graph 中对目录资源的过滤通常非常有限。所以您现在可以使用客户端内存过滤器或提交功能请求):</p>

理论上,我们可以像这样使用rest api(当前不支持对引用属性查询的指定过滤器。

https://graph.microsoft.com/v1.0/me/memberOf/$/microsoft.graph.group?$filter=groupTypes/any(a:roleTemplateId eq  '62e90394-69f5-4237-9190-012177145e10')

在基于 Graph Client 的 C# 代码中

List<QueryOption> options = new List<QueryOption>
                {
                    new QueryOption("$filter", 
                      "groupTypes/any(a:roleTemplateId eq  '62e90394-69f5-4237-9190-012177145e10'")
                };   
IUserMemberOfCollectionWithReferencesRequest builder = graphClient.Me.MemberOf.Request(options); 

                    IGraphServiceDirectoryRolesCollectionRequest request = graphClient.DirectoryRoles.Request(options);
于 2018-09-07T12:56:59.070 回答
1

对于 SDK,过滤是应用于对象的功能。例如:

var users = await graphClient
    .Users
    .Request()
    .Filter("startswith(displayName,'A')")
    .GetAsync();

不幸的是,这对您没有帮助,因为/memberOf不支持$filter. 因此,您需要在客户端上进行过滤。

如果你正在检查一个特定的directoryRole,你可以从另一个方向来。/members端点确实支持按成员id过滤:

v1.0/directoryRoles/{role-id}/members?$filter=id eq '{user-id}'

需要注意的是这里/members不支持过滤,userPrincipalName支持实际id

于 2018-09-07T18:05:40.057 回答