using SecurityApi.Core.Models;
using SecurityApi.Core.Repositories;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.DirectoryServices.AccountManagement;
using System.Threading.Tasks;
using SecurityApi.EntityFramework;
using System.DirectoryServices;
namespace SecurityApi.Repositories
[Export(typeof(IADUserRepository))]
public class ADUserRepository : IADUserRepository
private Object etlLock = new Object();
public async Task<List<Core.Models.ADUser>> GetADUsersFromAD(string domainName)
var domainId = await new DomainRepository().GetDomainId(domainName);
var adUsers = new ConcurrentBag<Core.Models.ADUser>();
var adGroups = new ConcurrentBag<Core.Models.ADGroup>();
return await Task.Run(() =>
using (var context = new PrincipalContext(ContextType.Domain, domainName))
var up = new UserPrincipal(context);
var ps = new PrincipalSearcher(up);
new ParallelOptions() { MaxDegreeOfParallelism = Environment.ProcessorCount },
if (!result.DistinguishedName.Contains("OU=Users")) return;
var userPrincipal = result as UserPrincipal;
Core.Models.ADUser adUser;
adUser.Name = userPrincipal.Name;
adUser.FirstName = userPrincipal.GivenName;
adUser.LastName = userPrincipal.Surname;
var directoryEntry = result.GetUnderlyingObject() as DirectoryEntry;
adUser.UserPrincipalName = directoryEntry.Properties["UserPrincipalName"].Value?.ToString();
adUser.EmployeeId = directoryEntry.Properties["EmployeeId"].Value?.ToString();