如何使用Azure AD Graph API查询所有直接报告?

时间:2017-08-22 15:32:41

标签: azure-active-directory azure-ad-graph-api

我一直在查询经理的所有直接报告:

var users = activeDirectoryClient.Users
    .Expand(x => x.DirectReports)
    .Where(d => d.ObjectId == objectId);

var foundUsers = users.ExecuteAsync().Result;
foreach (var foundUser in foundUsers.CurrentPage)
{
    IUser user = foundUser as User;
    int directReportsCount = user.DirectReports.CurrentPage.Count; // 19

    // ...

    Console.WriteLine(user.DirectReports.MorePagesAvailable); // false
}

我刚刚发现这些结果不完整。我看到一个Manager有31个直接报告的情况,但我的代码只返回19.此外,DirectReports.MorePagesAvailablefalse

如果我单独查询未包含在直接报告集合中的其他用户并展开其管理器,我可以看到管理器是预期的管理器,因此Azure AD图中存在正确的关系。

然后,我尝试使用我关心的经理查询所有用户,但以下代码无效:

var users = activeDirectoryClient.Users
    .Where(d => d.Manager.ObjectId == objectId);

我收到以下错误:

  

System.ArgumentNullException:'值不能为null。   参数名称:key'

使用 Microsoft.Azure.ActiveDirectory.GraphClient 查询用户的所有直接下属报告的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

  

我看到一个Manager有31个直接报告的情况,但我的代码只返回19.

根据代码,您从ObjectId等于objectId的用户检索直接下属。请确保用户是您提到的经理。

  

使用Microsoft.Azure.ActiveDirectory.GraphClient查询用户的所有直接报告的正确方法是什么?

Azure AD Graph使用分页功能也是如此。与上面的代码一样,我们应该检查MorePagesAvailable属性并使用GetNextPageAsync()获取下一页。

这是一段代码,通过分页结果打印来自经理的直接报告。您可以将managerId替换为该经理的objectId:

    public void PrintDirectReports()
    {
        String managerId="";
        int pageSize=2;
        ActiveDirectoryClient client = GraphHelper.CreateGraphClient();
        int pageIndex = 1;
        var directoryRecports = client.Users[managerId].DirectReports.Take(pageSize).ExecuteAsync().Result;
        Console.WriteLine($"Page{pageIndex++}:");
        foreach (var report in directoryRecports.CurrentPage)
        {
            Console.WriteLine(report.ObjectId);
        }

        while (directoryRecports.MorePagesAvailable)
        {
            Console.WriteLine($"Page{pageIndex++}:");
            directoryRecports = directoryRecports.GetNextPageAsync().Result;
            foreach (var report in directoryRecports.CurrentPage)
            {
                Console.WriteLine(report.ObjectId);
            }
        }
    }