【问题标题】:error Message: Unsupported or invalid query filter clause specified for property 'userType' of resource 'User'. Microsoft Graph SDK Filter()错误消息:为资源“用户”的属性“用户类型”指定了不受支持或无效的查询过滤器子句。 Microsoft Graph SDK 筛选器()
【发布时间】:2020-09-24 10:12:52
【问题描述】:

我是从 Azure Active Directory 检索用户的 Microsoft Graph API/SDK。我的 Filter() 函数给我错误消息:为资源 'User' 的属性 'userType' 指定了不受支持或无效的查询过滤器子句。

我的代码是:

var azureUsers = await graphClient
              .Users
              .Request().Filter("startsWith(userType, 'P')")
              .Select(x => new
              {
                x.Id,
                x.UserType,
                x.DisplayName,
                x.GivenName,
                x.Surname,
                x.UserPrincipalName,
                x.AccountEnabled,
                x.Identities,
                x.BusinessPhones,
                x.JobTitle,
                x.MobilePhone,
                x.OfficeLocation,
                x.PreferredLanguage,
                x.Mail,
                x.Extensions,
                x.CreatedDateTime
              })
              .GetAsync();

它完全适用于

.Filter("startsWith(mail, 'P')")

但与用户类型无关。

我的 Azure AD 中有这个属性 UserType

我们的访客用户大约有 700 人,我想在通话中排除他们。

它给了我正确的价值

        x.UserType,

但我想在通话中过滤这个。任何帮助将不胜感激。

【问题讨论】:

    标签: c# asp.net-mvc azure-active-directory microsoft-graph-api microsoft-graph-sdks


    【解决方案1】:

    您可以使用以下代码获取没有来宾用户的用户列表,并根据文档用户类型应该是成员或来宾。请参考document

     public static async Task ListUsers(GraphServiceClient graphClient)
                {
                    Console.WriteLine("Getting list of users...");
                    // Get all users (one page)
                    var result = await graphClient.Users
                        .Request()
                        .Select(e => new
                        {
                            e.DisplayName,
                            e.Id,
                            e.Identities
        
        
                        }).Filter($"usertype eq 'Member'")
                        .GetAsync();
        
                    foreach (var user in result.CurrentPage)
                    {
                        var directoryObject = await graphClient.DirectoryObjects[user.Id].Request()
                             
         .GetAsync();
                        Console.WriteLine(JsonConvert.SerializeObject(directoryObject));
                    }
        
                }
    

    【讨论】:

      【解决方案2】:

      您会看到此错误,因为 UserType 属性不支持此过滤器 - 正如错误消息所述。

      一般来说,userType 应该是 MemberGuest例外是当您同步一个 本地活动目录。由于userType 是 Azure AD 属性,因此同步用户的值为 null。

      如果您可以安全地假设您的本地用户不是来宾,则可以根据 Azure AD 用户是同步用户还是云原生用户来筛选这些用户。您可以通过查看 onPremisesSyncEnabled 属性来执行此操作。对于同步用户,这将是真的,对于云原生用户,它将为空。

      如果将其与userType 属性结合使用,则可以使用以下 $filter 有效地仅检索非访客用户:

      $filter=onPremisesSyncEnabled eq true OR userType eq 'Member'
      

      您可以查看 Marc 的相同答案 - How to filter users by userType = null?

      【讨论】:

      • 谢谢你,Harsha,实际上我在从 Azure Ad 获取数据后使用相同的方法执行此操作,我已根据 On Premises Sysnc Enabled 进行过滤。但是我很好奇这是否可以嵌入到调用过滤器方法中以减少调用的负载。我的意思是,如果它返回的数据更少,我等待结果的时间就会更少。
      • 不支持,这是我唯一能找到的方法。
      猜你喜欢
      • 2020-04-27
      • 1970-01-01
      • 2023-01-14
      • 2022-01-20
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      相关资源
      最近更新 更多