簡體   English   中英

Microsoft Graph SDK .NET - 獲取具有管理器和額外字段的用戶

[英]Microsoft Graph SDK .NET - get users with managers and extra fields

我想在我的 ASP.NET Core 2.2 應用程序中獲取所有圖形用戶及其經理和一些非默認字段。 為此,我編寫了以下代碼:

        graphServiceClient = new GraphServiceClient(new DelegateAuthenticationProvider(async request =>
        {
            request.Headers.Authorization = new AuthenticationHeaderValue("bearer", await tokenProvider.GetToken());
        }));

        var page = await graphServiceClient.Users
            .Request()
            .Expand(e => e.Manager)
            .Select(e => new
            {
                e.Department,
                e.OfficeLocation,
                e.JobTitle,
                e.UserPrincipalName,
                e.Mail,
                e.GivenName,
                e.DisplayName,
                e.Surname,
                e.MobilePhone,
                e.Id,
                e.EmployeeId
            })
            .GetAsync();

在針對每個用戶的此請求之后, ManagerEmployeeId字段均為空值。 我可以使用 /manager 和 /user 端點和 /?select=extension_88b64915d0de49799c8e36460702b34d_employeeNumber 參數直接從 API 獲取這些信息,但我想使用 SDK 並發出單個請求。

如何在使用 SDK 的一個請求中執行此操作?

我一直在尋找Microsoft Graph SDK類和方法,但運氣不佳。 無論如何,如果在您的Microsoft Graph SDK類和方法中,一次操作都找不到為您執行此操作的任何事情,這是因為SDK和API中的方法是要承擔單一責任的(如果某個方法獲得了用戶,它將不會做任何事情否則就請其經理)。 我還閱讀到,SDK始終落后於API當前狀態,如果要訪問最新功能,則應使用httpClient。

解決方案 :使用所需的邏輯實現自己的方法,並使用當前的SDK方法或使用httpClient調用Graph API來填充所需的信息

我發現了一些您可能熟悉的示例: https : //developer.microsoft.com/en-us/graph/graph-explorer

不幸的是,目前不支持通過單個請求來檢索用戶和管理者,但是可以考慮采用以下方法:

a)提交第一個請求,以通過List users端點檢索用戶

b)構造並提交一個批處理請求,以通過List manager端點檢索用戶的管理List manager

POST https://graph.microsoft.com/v1.0/$batch
Accept: application/json
Content-Type: application/json

{
  "requests": [
    {
      "id": "1",
      "method": "GET",
      "url": "/users/{id1 | userPrincipalName1}/manager"
    },
    {
      "id": "2",
      "method": "GET",
      "url": "/users/{id2 | userPrincipalName2}/manager"
    },
    //...
   ]
}

這是msgraph-sdk-dotnet的示例:

//1. get user properties 
var users = await graphClient.Users
     .Request()
     .Select(e => new
                {
                    e.Department,
                    e.OfficeLocation,
                    e.JobTitle,
                    e.UserPrincipalName,
                    e.Mail,
                    e.GivenName,
                    e.DisplayName,
                    e.Surname,
                    e.MobilePhone,
                    e.Id,
                    e.EmployeeId
                })
      .GetAsync();


//2 get user's managers
var batchRequest = new BatchRequest();
foreach (var user in users)
{             
    batchRequest.AddQuery(graphClient.Users[user.UserPrincipalName].Manager.Request(), typeof(Microsoft.Graph.User));
}
var managers = await graphClient.GetBatchAsync(batchRequest);
foreach(var manager in managers)
{
   if (manager != null)
   {
       //...
   }
}

其中BatchRequest class是實現對JSON批處理的支持的自定義類。

你可以試試這個。

 var users = await client.Users.Request()
                .Expand(u=>u.Manager)
                .Filter("accountEnabled eq true")
                .Select(u=>new 
                {
                    u.Id,
                    u.GivenName,
                    u.Surname,
                    u.DisplayName,
                    u.Mail,
                    u.JobTitle,
                    u.Department,
                    u.EmployeeId,
                    u.EmployeeType,
                    u.BusinessPhones,
                    u.MobilePhone,
                    u.Photo,
                    u.AccountEnabled,

                    u.Manager
                })
                .GetAsync();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM