Bug Fix: Avoid unnecessary AD queries
In multi-domains, parent domains were searched for child containers.
This commit is contained in:
@@ -16,11 +16,11 @@ namespace Disco.Data.Configuration.Modules
|
|||||||
get { return "ActiveDirectory"; }
|
get { return "ActiveDirectory"; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<string> SearchContainers
|
public Dictionary<string, List<string>> SearchContainers
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return GetFromJson<List<string>>(null);
|
return GetFromJson<Dictionary<string, List<string>>>(null);
|
||||||
}
|
}
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -84,12 +84,10 @@ namespace Disco.Services.Interop.ActiveDirectory.Internal
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Search Containers
|
// Search Containers
|
||||||
List<string> searchContainersAll = Database.DiscoConfiguration.ActiveDirectory.SearchContainers;
|
var searchContainersAll = Database.DiscoConfiguration.ActiveDirectory.SearchContainers;
|
||||||
List<string> searchContainers = null;
|
List<string> searchContainers = null;
|
||||||
|
|
||||||
if (searchContainersAll != null && searchContainersAll.Count > 0)
|
if (searchContainersAll == null || searchContainersAll.Count == 0 || !searchContainersAll.TryGetValue(d.Name.ToLower(), out searchContainers))
|
||||||
searchContainers = Database.DiscoConfiguration.ActiveDirectory.SearchContainers.Where(c => c.EndsWith(defaultNamingContext, StringComparison.InvariantCultureIgnoreCase)).ToList();
|
|
||||||
else
|
|
||||||
searchContainers = new List<string>() { defaultNamingContext }; // No search constraints set - search entire tree
|
searchContainers = new List<string>() { defaultNamingContext }; // No search constraints set - search entire tree
|
||||||
|
|
||||||
return new ActiveDirectoryDomain(d.Name, netBiosName, defaultNamingContext, searchContainers);
|
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<string> Containers)
|
public static void UpdateSearchContainers(DiscoDataContext Database, IEnumerable<string> Containers)
|
||||||
{
|
{
|
||||||
|
Dictionary<string, List<string>> searchContainers = null;
|
||||||
|
|
||||||
if (Containers != null)
|
if (Containers != null)
|
||||||
{
|
{
|
||||||
var distinctContainers = Containers
|
searchContainers = Containers
|
||||||
.Where(c => !string.IsNullOrWhiteSpace(c))
|
.Where(c => !string.IsNullOrWhiteSpace(c))
|
||||||
.Distinct().ToList();
|
.Distinct()
|
||||||
|
.Select(c =>
|
||||||
Containers = distinctContainers.Where(c => !distinctContainers.Any(s => (c != s) && (c.EndsWith(s))));
|
{
|
||||||
|
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;
|
Database.DiscoConfiguration.ActiveDirectory.SearchContainers = null;
|
||||||
|
|
||||||
@@ -115,9 +123,16 @@ namespace Disco.Services.Interop.ActiveDirectory.Internal
|
|||||||
}
|
}
|
||||||
else
|
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<string> domainContainers;
|
||||||
|
if (searchContainers.TryGetValue(d.DnsName.ToLower(), out domainContainers))
|
||||||
|
d.UpdateSearchContainers(domainContainers);
|
||||||
|
else
|
||||||
|
d.UpdateSearchContainers(Enumerable.Empty<string>());
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -124,10 +124,10 @@ namespace Disco.Web.Areas.Config.Models.SystemConfig
|
|||||||
m.ADSite = ActiveDirectory.Site;
|
m.ADSite = ActiveDirectory.Site;
|
||||||
m.ADSiteServers = m.ADSite.Servers.Cast<DirectoryServer>().Select(s => Tuple.Create(s, s.Reachable())).ToList();
|
m.ADSiteServers = m.ADSite.Servers.Cast<DirectoryServer>().Select(s => Tuple.Create(s, s.Reachable())).ToList();
|
||||||
var configSearchContainers = config.ActiveDirectory.SearchContainers;
|
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);
|
var domain = ActiveDirectory.GetDomainByDnsName(k.Key);
|
||||||
return Tuple.Create(c, d, d.GetFriendlyOrganisationalUnitName(c));
|
return Tuple.Create(c, domain, domain.GetFriendlyOrganisationalUnitName(c));
|
||||||
}).ToList();
|
}).ToList();
|
||||||
|
|
||||||
var loadForestServersTask = ActiveDirectory.LoadForestServersAsync();
|
var loadForestServersTask = ActiveDirectory.LoadForestServersAsync();
|
||||||
|
|||||||
Reference in New Issue
Block a user