我正在使用以下代码从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获取所有用户。请帮助,因为我是初学者。
据我所知,用户仅具有属性department
,但没有departmentName
,您可以引用此document。
在您的代码中,当您执行“反序列化”操作时,需要让它知道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。
希望有帮助〜
我建议利用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
}));
}
}