diff --git a/Disco.Data/Configuration/Modules/ActiveDirectoryConfiguration.cs b/Disco.Data/Configuration/Modules/ActiveDirectoryConfiguration.cs index 280a376b..2c7b8487 100644 --- a/Disco.Data/Configuration/Modules/ActiveDirectoryConfiguration.cs +++ b/Disco.Data/Configuration/Modules/ActiveDirectoryConfiguration.cs @@ -16,11 +16,11 @@ namespace Disco.Data.Configuration.Modules get { return "ActiveDirectory"; } } - public List SearchContainers + public Dictionary> SearchContainers { get { - return GetFromJson>(null); + return GetFromJson>>(null); } set { diff --git a/Disco.Services/Interop/ActiveDirectory/Internal/ADInterop.cs b/Disco.Services/Interop/ActiveDirectory/Internal/ADInterop.cs index 60fc8016..79675600 100644 --- a/Disco.Services/Interop/ActiveDirectory/Internal/ADInterop.cs +++ b/Disco.Services/Interop/ActiveDirectory/Internal/ADInterop.cs @@ -84,12 +84,10 @@ namespace Disco.Services.Interop.ActiveDirectory.Internal } // Search Containers - List searchContainersAll = Database.DiscoConfiguration.ActiveDirectory.SearchContainers; + var searchContainersAll = Database.DiscoConfiguration.ActiveDirectory.SearchContainers; List searchContainers = null; - if (searchContainersAll != null && searchContainersAll.Count > 0) - searchContainers = Database.DiscoConfiguration.ActiveDirectory.SearchContainers.Where(c => c.EndsWith(defaultNamingContext, StringComparison.InvariantCultureIgnoreCase)).ToList(); - else + if (searchContainersAll == null || searchContainersAll.Count == 0 || !searchContainersAll.TryGetValue(d.Name.ToLower(), out searchContainers)) searchContainers = new List() { defaultNamingContext }; // No search constraints set - search entire tree return new ActiveDirectoryDomain(d.Name, netBiosName, defaultNamingContext, searchContainers); @@ -97,16 +95,26 @@ namespace Disco.Services.Interop.ActiveDirectory.Internal public static void UpdateSearchContainers(DiscoDataContext Database, IEnumerable Containers) { + Dictionary> searchContainers = null; + if (Containers != null) { - var distinctContainers = Containers + searchContainers = Containers .Where(c => !string.IsNullOrWhiteSpace(c)) - .Distinct().ToList(); - - Containers = distinctContainers.Where(c => !distinctContainers.Any(s => (c != s) && (c.EndsWith(s)))); + .Distinct() + .Select(c => + { + ActiveDirectoryDomain d; + if (TryGetDomainByDistinguishedName(c, out d)) + return Tuple.Create(d, c); + else + return null; + }).Where(i => i != null) + .GroupBy(i => i.Item1) + .ToDictionary(g => g.Key.DnsName.ToLower(), g => g.Select(i => i.Item2).ToList()); } - if (Containers == null || Containers.Count() == 0) + if (searchContainers == null || searchContainers.Count == 0) { Database.DiscoConfiguration.ActiveDirectory.SearchContainers = null; @@ -115,9 +123,16 @@ namespace Disco.Services.Interop.ActiveDirectory.Internal } else { - Database.DiscoConfiguration.ActiveDirectory.SearchContainers = Containers.ToList(); + Database.DiscoConfiguration.ActiveDirectory.SearchContainers = searchContainers; - Domains.ForEach(d => { d.UpdateSearchContainers(Containers.Where(c => c.EndsWith(d.DistinguishedName, StringComparison.InvariantCultureIgnoreCase))); }); + Domains.ForEach(d => + { + List domainContainers; + if (searchContainers.TryGetValue(d.DnsName.ToLower(), out domainContainers)) + d.UpdateSearchContainers(domainContainers); + else + d.UpdateSearchContainers(Enumerable.Empty()); + }); } } diff --git a/Disco.Web/Areas/Config/Models/SystemConfig/IndexModel.cs b/Disco.Web/Areas/Config/Models/SystemConfig/IndexModel.cs index cb28f570..ac97b6c8 100644 --- a/Disco.Web/Areas/Config/Models/SystemConfig/IndexModel.cs +++ b/Disco.Web/Areas/Config/Models/SystemConfig/IndexModel.cs @@ -124,10 +124,10 @@ namespace Disco.Web.Areas.Config.Models.SystemConfig m.ADSite = ActiveDirectory.Site; m.ADSiteServers = m.ADSite.Servers.Cast().Select(s => Tuple.Create(s, s.Reachable())).ToList(); var configSearchContainers = config.ActiveDirectory.SearchContainers; - m.ADSearchContainers = configSearchContainers == null ? null : configSearchContainers.Select(c => + m.ADSearchContainers = configSearchContainers == null ? null : configSearchContainers.SelectMany(d => d.Value, (k, c) => { - var d = ActiveDirectory.GetDomainByDistinguishedName(c); - return Tuple.Create(c, d, d.GetFriendlyOrganisationalUnitName(c)); + var domain = ActiveDirectory.GetDomainByDnsName(k.Key); + return Tuple.Create(c, domain, domain.GetFriendlyOrganisationalUnitName(c)); }).ToList(); var loadForestServersTask = ActiveDirectory.LoadForestServersAsync();