using AutoMapper; using DigitalData.Core.Contracts.Application; using System.DirectoryServices; using System.Diagnostics.CodeAnalysis; using System.DirectoryServices.AccountManagement; namespace DigitalData.Core.Application { public class DirectoryService : ServiceBase, IDirectoryService { protected IMapper _mapper; protected readonly DirectorySearcher _groupSearcher; [SuppressMessage("Interoperability", "CA1416:Validate platform compatibility", Justification = "")] public DirectoryService(IMapper mapper) { _mapper = mapper; _groupSearcher = new() { Filter = "(&(objectClass=group) (samAccountName=*))", SearchScope = SearchScope.Subtree, SizeLimit = 5000 }; } [SuppressMessage("Interoperability", "CA1416:Validate platform compatibility", Justification = "")] public IServiceResult> ReadAllGroupAsCollection() { List list = new(); foreach (SearchResult result in _groupSearcher.FindAll()) { ResultPropertyCollection rpc = result.Properties; list.Add(rpc); } return Successful>(list); } [SuppressMessage("Interoperability", "CA1416:Validate platform compatibility", Justification = "")] public IServiceResult>> ReadGroupByPropertyName(string propertyName) { List> list = new(); foreach (SearchResult result in _groupSearcher.FindAll()) { var value = result.Properties[propertyName]; if (value is not null) list.Add(new Dictionary() { [propertyName] = value }); } return Successful>>(list); } [SuppressMessage("Interoperability", "CA1416:Validate platform compatibility", Justification = "")] public IServiceResult> ReadUserByGroup(string groupIdentityValue, IdentityType groupIdentityType = IdentityType.Name, bool recursive = true) { List upDTOs = new(); using PrincipalContext context = new(ContextType.Domain); using GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(context, groupIdentityType, groupIdentityValue); using PrincipalSearchResult principalSearchResult = groupPrincipal.GetMembers(recursive); foreach (Principal principal in principalSearchResult) { if (principal is UserPrincipal userPrincipal) { var upDto = _mapper.MapOrThrow(userPrincipal); upDTOs.Add(upDto); } } return Successful>(upDTOs); } } }