Невозможно получить Название отдела, Имя руководителя и получить только ограниченное количество пользователей в ответ В Microsoft Graph API C# - PullRequest
1 голос
/ 24 февраля 2020

Я использую приведенный ниже код для получения всех пользователей из 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, а l oop. Это происходит, пока l oop запускается только один раз и показывает только 100 пользователей. Значение data.odata_nextLink; в первом l oop сам по себе равен нулю.

Как выбрать всех пользователей, используя нумерацию страниц, а также имя отдела и имя менеджера или directReports. Пожалуйста, помогите, так как я начинающий.

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Я рекомендую использовать Microsoft. NET SDK, чтобы не изобретать велосипед. Это должно работать с использованием Microsoft.Graph.Beta nuget package . В связи с этим MS Graph V1, не поддерживающий диспетчер пользователей, расширяется .

 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
                }));
            }
        }
1 голос
/ 25 февраля 2020

Насколько я знаю, у пользователя просто есть свойство department, но нет departmentName, вы можете обратиться к этому документу . enter image description here

В вашем коде, когда вы выполняете операцию "десериализации", вы должны сообщить ей, что odata_nextLink относится к полю @odata.nextLink в ответе json. Поэтому, пожалуйста, измените ваш код следующим образом:

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 не будет нулевым.

Надеюсь, это поможет ~

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...