public Task<ADUserPagingModel> GetUsersAsync(ADUserPagingModel filter) { var searchList = filter.Search.SplitBySpaces().ToList(); var users = adUsers.Where(x => !searchList.Any() || searchList.All(s => x.Email.Contains(s, StringComparison.InvariantCultureIgnoreCase) || x.FirstName.Contains(s, StringComparison.InvariantCultureIgnoreCase) || x.LastName.Contains(s, StringComparison.InvariantCultureIgnoreCase))) .OrderBy(filter.OrderProperty, filter.IsDesc).GetPage(new Page(filter.PageNumber,filter.PageSize)).ToList(); filter.SetResult(users, users.Count, users.GetPageCount(filter.PageSize)); return Task.FromResult(filter); }
public Task <ADUserPagingModel> GetUsersAsync(ADUserPagingModel filter) { return(Task.Run(() => { var search = Microsoft.Security.Application.Encoder.LdapFilterEncode(filter.Search); var searchList = search.SplitBySpaces(); searchList = searchList.Any() ? searchList.Select(x => $"*{x}*").ToList() : new List <string>() { "*" }; var searchAd = string.Join("", searchList.Select(x => $"(givenName={x})(sn={x})(mail={x})")); var searcher = new DirectorySearcher(_directoryEntry) { Filter = $"(&(objectClass=user)(|{searchAd}))" }; if (filter.PageSize > 0) { searcher.VirtualListView = new DirectoryVirtualListView(0, filter.PageSize, filter.PageSize * (filter.PageNumber - 1)); } //searcher.SizeLimit = sizeLimit; searcher.PropertiesToLoad.Add("givenName"); // first name searcher.PropertiesToLoad.Add("sn"); // last name searcher.PropertiesToLoad.Add("mail"); // smtp mail address searcher.PropertiesToLoad.Add("userAccountControl"); // state of user searcher.PropertiesToLoad.Add("telephoneNumber"); // phone searcher.PropertiesToLoad.Add("sAMAccountName"); // userName searcher.Sort.Direction = filter.IsDesc ? SortDirection.Descending : SortDirection.Ascending; var orderProperty = typeof(ADUser).GetPropertyByName(filter.OrderProperty); if (orderProperty != null) { switch (orderProperty.Name) { case nameof(ADUser.Email): searcher.Sort.PropertyName = "mail"; break; case nameof(ADUser.FirstName): searcher.Sort.PropertyName = "givenName"; break; case nameof(ADUser.LastName): searcher.Sort.PropertyName = "sn"; break; case nameof(ADUser.Phone): searcher.Sort.PropertyName = "telephoneNumber"; break; case nameof(ADUser.Username): searcher.Sort.PropertyName = "sAMAccountName"; break; } } var resultCollection = searcher.FindAll(); var adUsers = new List <ADUser>(); foreach (SearchResult o in resultCollection) { var adUser = new ADUser() { Email = FirstOrDefault(o.Properties["mail"]) as string, FirstName = FirstOrDefault(o.Properties["givenName"]) as string, LastName = FirstOrDefault(o.Properties["sn"]) as string, Phone = FirstOrDefault(o.Properties["telephoneNumber"]) as string, Username = FirstOrDefault(o.Properties["sAMAccountName"]) as string, IsActive = IsUserActive(o.GetDirectoryEntry()) }; if (!string.IsNullOrEmpty(adUser.Email)) { adUsers.Add(adUser); } } var users = adUsers.OrderBy(x => x.FirstName).ThenBy(x => x.LastName).ThenBy(x => x.Email).ToList(); var totalItems = searcher.VirtualListView.ApproximateTotal; filter.SetResult(users, totalItems, filter.PageSize > 0 ? (int)Math.Ceiling((double)totalItems / filter.PageSize) : 1); return filter; })); }