问题描述
我是Microsoft Graph API / SDK,用于从Azure Active Directory检索用户。我的Filter()函数给我错误消息:为资源“用户”的属性“用户类型”指定的查询过滤子句不受支持或无效。
我的代码是:
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,
但是我想在Call中过滤它。任何帮助将不胜感激。
解决方法
您可以使用以下代码获取没有来宾用户的用户列表,并且根据文档用户类型应该是member或guest。请参考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));
}
}
,
您看到此错误,因为UserType
属性不支持此过滤器-如错误消息所述。
根据一般经验,userType
应该是Member
或Guest
。 例外是当您正在同步本地Active Directory 。由于userType
是Azure AD属性,因此已同步用户的值将为null。
如果可以安全地认为本地用户不是访客,则可以基于Azure AD用户的同步对象或云本地用户对其进行筛选。您可以通过查看onPremisesSyncEnabled
属性来实现。对于同步用户,这将是真实的,对于云原生用户,它将为null。
如果将此属性与userType
属性结合使用,则可以使用以下$ filter有效地仅检索非访客用户:
$filter=onPremisesSyncEnabled eq true OR userType eq 'Member'
您可以在同一页上查看马克的答案-How to filter users by userType = null?