如何在具有导航属性的一次调用中检索已分配给服务主体的所有用户
How can I retrieve all users that have been assigned to a Service Principal in one call with navigation properties
如何使用 Microsoft Graph API 在尽可能少的调用中检索具有导航属性(例如经理)和属性(例如全名)的服务主体中的所有用户?
我正在使用 Microsoft.Graph 包并且我试过了:
尝试 1:
await graphClient.ServicePrincipals["objectId"].AppRoleAssignedTo.Request().GetAsync();
但这只给了我 ID,也就是 'okay' 但是我必须分别获取所有用户,这将对图表进行大量调用 API。
我可以使用 DirectoryObjects 一次获取所有用户,但这不允许我扩展管理器 属性。
例如:
var users = await graphClient.DirectoryObjects.GetByIds(principals.Select(p => p.PrincipalId.ToString()), new string[1] { "User" }).Request().Expand("manager").PostAsync();
给我一个错误:
Could not find a property named 'manager' on type 'microsoft.graph.directoryObject'.
尝试 2:
我也尝试过使用过滤器来吸引用户
await graphClient.Users.Request().Filter("appRoleAssignments/any(u:u/principalId eq objectId)").Expand(u => u.Manager).GetAsync();
但这给了我一个错误:
Request_UnsupportedQuery
你可以这样写代码:
var user = await graphClient.Users.Request().Filter("id in ('{objectId1}', '{objectId2}', ..., '{objectIdn}')").Expand(u => u.Manager).Select("displayName").GetAsync();
理想情况下,这将只调用一次 return 您需要的数据。
BUT 基于“in as few as possible calls”的需求,我们将不得不面对一个问题,即我们需要将所有的object id放入请求,可能会导致请求过长,最终失败。
我没有测试这个场景,这只是一个可能有帮助的方向。
我还是建议你使用loop来获取信息。
如何使用 Microsoft Graph API 在尽可能少的调用中检索具有导航属性(例如经理)和属性(例如全名)的服务主体中的所有用户?
我正在使用 Microsoft.Graph 包并且我试过了:
尝试 1:
await graphClient.ServicePrincipals["objectId"].AppRoleAssignedTo.Request().GetAsync();
但这只给了我 ID,也就是 'okay' 但是我必须分别获取所有用户,这将对图表进行大量调用 API。
我可以使用 DirectoryObjects 一次获取所有用户,但这不允许我扩展管理器 属性。
例如:
var users = await graphClient.DirectoryObjects.GetByIds(principals.Select(p => p.PrincipalId.ToString()), new string[1] { "User" }).Request().Expand("manager").PostAsync();
给我一个错误:
Could not find a property named 'manager' on type 'microsoft.graph.directoryObject'.
尝试 2:
我也尝试过使用过滤器来吸引用户
await graphClient.Users.Request().Filter("appRoleAssignments/any(u:u/principalId eq objectId)").Expand(u => u.Manager).GetAsync();
但这给了我一个错误:
Request_UnsupportedQuery
你可以这样写代码:
var user = await graphClient.Users.Request().Filter("id in ('{objectId1}', '{objectId2}', ..., '{objectIdn}')").Expand(u => u.Manager).Select("displayName").GetAsync();
理想情况下,这将只调用一次 return 您需要的数据。
BUT 基于“in as few as possible calls”的需求,我们将不得不面对一个问题,即我们需要将所有的object id放入请求,可能会导致请求过长,最终失败。
我没有测试这个场景,这只是一个可能有帮助的方向。
我还是建议你使用loop来获取信息。