无法获得部门名称,经理名称,并且仅获得有限的用户作为响应(在Microsoft Graph API C#中

问题描述 投票:1回答:2

我正在使用以下代码从Active Directory中获取所有用户:

     static async Task Main(string[] args)

    {
        int Flag = 0;


        //  var message = await result;

        try
        {


            var tenantId = "XXXXX.onmicrosoft.com";
            string searchCriteria = "";
            string searchString = "";

            string tokenUrl = $"https://login.microsoftonline.com/XXXXX.onmicrosoft.com/oauth2/v2.0/token";
            var tokenRequest = new HttpRequestMessage(HttpMethod.Post, tokenUrl);

            //I am Using client_credentials as It is mostly recommended
            tokenRequest.Content = new FormUrlEncodedContent(new System.Collections.Generic.Dictionary<string, string>
            {
                ["grant_type"] = "client_credentials",
                ["client_id"] = "XXX9",
                ["client_secret"] = "XXXXXX",
                ["scope"] = "https://graph.microsoft.com/.default"
            });

            dynamic json;
            AccessTokenClass results = new AccessTokenClass();


            //New Block For Accessing Data from Microsoft Graph Rest API
            HttpClient client = new HttpClient();
            var tokenResponse = await client.SendAsync(tokenRequest);
            json = await tokenResponse.Content.ReadAsStringAsync();
            results = JsonConvert.DeserializeObject<AccessTokenClass>(json);

            HttpClient _client = new HttpClient();

            string urlGraphUsers = "https://graph.microsoft.com/v1.0/users?$top=999";
            // odata_nextlink
            do
            {
                HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, string.Format(urlGraphUsers));
                //Passing Token For this Request
                request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", results.access_token);
                //unable to get department name in response

                HttpResponseMessage response = await _client.SendAsync(request);
                string responseBody = await response.Content.ReadAsStringAsync();

                dynamic objGpraphUserList = JsonConvert.DeserializeObject<dynamic>(await response.Content.ReadAsStringAsync());


                var apiResponse = await response.Content.ReadAsStringAsync();


                var data = JsonConvert.DeserializeObject<jsonModel>(apiResponse);
                urlGraphUsers = data.odata_nextLink;




                foreach (valueModel r in data.value.ToList())

                {
                   //Print all the fields ,but unable to get Reporting Manager name and Department 
                   Console.WriteLine(r.displayName);
                    Console.WriteLine(r.mail);
                }

                if (Flag == 0)
                {
                    await context.PostAsync($"No Search results found! Please Try again");

                }
            }
            while (urlGraphUsers != null);

        }


        catch
        {
            await context.PostAsync($"Unknown Exception Occurred. Unable to search results!");
            context.Done(true);
        }

        Console.WriteLine(Flag);
        Console.WriteLine("Flag");
        context.Done(true);

    }


     public class jsonModel
    {
        public string @odata_context { get; set; }
        public string @odata_nextLink { get; set; }
        public List<valueModel> value { get; set; }
    }
    public class valueModel
    {
        public List<string> businessPhones { get; set; }
        public string displayName { get; set; }
        public string givenName { get; set; }
        public string jobTitle { get; set; }
        public string mail { get; set; }
        public string mobilePhone { get; set; }
        public string officeLocation { get; set; }
        public string preferredLanguage { get; set; }
        public string surname { get; set; }
        public string userPrincipalName { get; set; }
        public string id { get; set; }
    }

我无法获得部门名称作为响应。显然,r.departmentName之类的东西在这里不起作用。

而且我只获得100个用户,即使我在循环时使用odata.nextlink。这种do while循环仅运行一次,仅显示100个用户。 data.odata_nextLink的值;在第一个循环中本身为null。

如何使用分页以及部门名称和经理名称或directReports获取所有用户。请帮助,因为我是初学者。

c# azure-active-directory microsoft-graph
2个回答
1
投票

据我所知,用户仅具有属性department,但没有departmentName,您可以引用此documententer image description here

在您的代码中,当您执行“反序列化”操作时,需要让它知道json响应中的odata_nextLink指向@odata.nextLink字段。因此,请如下修改您的代码:

public class jsonModel
{
    [JsonProperty("@odata.context")]
    public string odata_context { get; set; }

    [JsonProperty("@odata.nextLink")]
    public string odata_nextLink { get; set; }

    public List<valueModel> value { get; set; }
}

之后,您的代码将正常工作,data.odata_nextLink将不会为null。

希望有帮助〜


1
投票

我建议利用Microsoft .NET SDK来避免重新发明轮子。使用Microsoft.Graph.Beta nuget package应该可以使用。到期的MS图V1 not supporting user manager expands

 private static async Task PrintUsersWithManager()
        {
            var app = ConfidentialClientApplicationBuilder.Create(clientId)
                .WithAuthority(AzureCloudInstance.AzurePublic, tenantId)
                .WithClientSecret(clientSecret)
                .Build();

            var token = await app.AcquireTokenForClient(new[] { ".default" }).ExecuteAsync();

            var graphServiceClient = new GraphServiceClient(
                new DelegateAuthenticationProvider(
                    async (message) =>
                    {
                        var result = await app.AcquireTokenForClient(new[] { ".default" }).ExecuteAsync();
                        message.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", result.AccessToken);
                    }
                    )
                );

            var page = await graphServiceClient.Users.Request()
                .Expand(u => u.Manager)
                .GetAsync();

            var users = new List<User>();

            users.AddRange(page);

            while (page.NextPageRequest != null)
            {
                page = await page.NextPageRequest
                    .Expand(u => u.Manager)
                    .GetAsync();

                users.AddRange(page);
            }

            foreach (var item in users)
            {
                Console.WriteLine(JsonConvert.SerializeObject(new
                {
                    item.Id,
                    item.DisplayName,
                    item.Department,
                    Manager = item.Manager != null ? new
                    {
                        item.Manager.Id,
                        displayName = ((User)item.Manager).DisplayName
                    } : null
                }));
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.