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);
        }
Пример #2
0
        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;
            }));
        }