Update #42: AD Migration

Refactor to target specific Domain Controllers, with failover.
This commit is contained in:
Gary Sharp
2014-04-21 21:43:13 +10:00
parent 43fc622121
commit 09c2a24222
98 changed files with 3808 additions and 3271 deletions
@@ -5,6 +5,7 @@ using System.Web;
using Disco.Data.Repository;
using Disco.Models.UI.Config.AuthorizationRole;
using Disco.Models.Services.Authorization;
using Disco.Web.Areas.API.Models.Shared;
namespace Disco.Web.Areas.Config.Models.AuthorizationRole
{
@@ -1,6 +1,6 @@
using Disco.Models.Services.Authorization;
using Disco.Models.Interop.ActiveDirectory;
using Disco.Models.UI.Config.AuthorizationRole;
using Disco.Web.Areas.API.Models.Shared;
using Disco.Web.Models.Shared;
using System;
using System.Collections.Generic;
@@ -1,25 +0,0 @@
using Disco.Models.Interop.ActiveDirectory;
namespace Disco.Web.Areas.Config.Models.AuthorizationRole
{
public class SubjectDescriptorModel
{
public bool IsGroup { get; set; }
public string Name { get; set; }
public string Id { get; set; }
public static SubjectDescriptorModel FromActiveDirectoryObject(IActiveDirectoryObject ADObject)
{
var item = new SubjectDescriptorModel()
{
Id = ADObject.NetBiosId,
Name = ADObject.DisplayName
};
if (ADObject is ActiveDirectoryGroup)
item.IsGroup = true;
return item;
}
}
}
@@ -5,6 +5,7 @@ using System.Web;
using System.Web.Mvc;
using Disco.Services.Plugins;
using Disco.Models.UI.Config.DeviceProfile;
using Disco.Services.Interop.ActiveDirectory;
namespace Disco.Web.Areas.Config.Models.DeviceProfile
{
@@ -15,6 +16,23 @@ namespace Disco.Web.Areas.Config.Models.DeviceProfile
public Disco.Models.BI.Config.OrganisationAddress DefaultOrganisationAddress { get; set; }
public List<Disco.Models.BI.Config.OrganisationAddress> OrganisationAddresses { get; set; }
public string FriendlyOrganisationalUnitName
{
get
{
if (string.IsNullOrEmpty(this.DeviceProfile.OrganisationalUnit))
{
var domain = ActiveDirectory.Context.PrimaryDomain;
return domain.FriendlyDistinguishedNamePath(domain.DefaultComputerContainer);
}
else
{
var domain = ActiveDirectory.Context.GetDomainFromDistinguishedName(this.DeviceProfile.OrganisationalUnit);
return domain.FriendlyDistinguishedNamePath(this.DeviceProfile.OrganisationalUnit);
}
}
}
public List<PluginFeatureManifest> CertificateProviders { get; set; }
public int DeviceCount { get; set; }
@@ -1,10 +1,7 @@
using Disco.Models.Interop.ActiveDirectory;
using Disco.Models.Services.Jobs.JobQueues;
using Disco.Models.Services.Jobs.JobQueues;
using Disco.Models.UI.Config.JobQueue;
using System;
using Disco.Web.Areas.API.Models.Shared;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Disco.Web.Areas.Config.Models.JobQueue
{
@@ -12,28 +9,7 @@ namespace Disco.Web.Areas.Config.Models.JobQueue
{
public IJobQueueToken Token { get; set; }
public List<SubjectDescriptor> Subjects { get; set; }
public class SubjectDescriptor
{
public bool IsGroup { get; set; }
public string Name { get; set; }
public string Id { get; set; }
public static SubjectDescriptor FromActiveDirectoryObject(IActiveDirectoryObject ADObject)
{
var item = new SubjectDescriptor()
{
Id = ADObject.NetBiosId,
Name = ADObject.DisplayName
};
if (ADObject is ActiveDirectoryGroup)
item.IsGroup = true;
return item;
}
}
public List<SubjectDescriptorModel> Subjects { get; set; }
public int OpenJobCount { get; set; }
public int TotalJobCount { get; set; }
@@ -41,6 +17,5 @@ namespace Disco.Web.Areas.Config.Models.JobQueue
public List<Disco.Models.Repository.JobType> JobTypes { get; set; }
public bool CanDelete { get; set; }
}
}
@@ -8,7 +8,6 @@ using System.Data.SqlClient;
using Disco.Data.Repository;
using Disco.Models.BI.Interop.Community;
using Disco.Services.Tasks;
using Disco.Models.Interop.ActiveDirectory;
using System.DirectoryServices.ActiveDirectory;
using Disco.Services.Interop.ActiveDirectory;
@@ -77,14 +76,14 @@ namespace Disco.Web.Areas.Config.Models.SystemConfig
#region Active Directory
[Display(Name="Search Entire Forest")]
public bool ADSearchEntireForest { get; set; }
[Display(Name="Search All Forest Servers")]
public bool ADSearchAllForestServers { get; set; }
public ActiveDirectoryDomain ADPrimaryDomain { get; set; }
public List<ActiveDirectoryDomain> ADAdditionalDomains { get; set; }
public ActiveDirectorySite ADSite { get; set; }
public List<Tuple<DirectoryServer, bool>> ADSiteServers { get; set; }
public List<Tuple<string, ActiveDirectoryDomain, string>> ADSearchContainers { get; set; }
public List<ADDomain> ADDomains { get; set; }
public ADDomain ADPrimaryDomain { get; set; }
public ADSite ADSite { get; set; }
public List<ADDomainController> ADServers { get; set; }
public List<Tuple<string, ADDomain, string>> ADSearchContainers { get; set; }
public List<string> ADForestServers { get; set; }
#endregion
@@ -119,28 +118,28 @@ namespace Disco.Web.Areas.Config.Models.SystemConfig
};
// AD
m.ADPrimaryDomain = ActiveDirectory.PrimaryDomain;
m.ADAdditionalDomains = ActiveDirectory.Domains.Where(d => d != m.ADPrimaryDomain).ToList();
m.ADSite = ActiveDirectory.Site;
m.ADSiteServers = m.ADSite.Servers.Cast<DirectoryServer>().Select(s => Tuple.Create(s, s.Reachable())).ToList();
m.ADDomains = ActiveDirectory.Context.Domains.ToList();
m.ADPrimaryDomain = ActiveDirectory.Context.PrimaryDomain;
m.ADSite = ActiveDirectory.Context.Site;
m.ADServers = ActiveDirectory.Context.Domains.SelectMany(d => d.DomainControllers).ToList();
var configSearchContainers = config.ActiveDirectory.SearchContainers;
m.ADSearchContainers = configSearchContainers == null ? null : configSearchContainers.SelectMany(d => d.Value, (k, c) =>
{
var domain = ActiveDirectory.GetDomainByDnsName(k.Key);
return Tuple.Create(c, domain, domain.GetFriendlyOrganisationalUnitName(c));
var domain = ActiveDirectory.Context.GetDomainByName(k.Key);
return Tuple.Create(c, domain, domain.FriendlyDistinguishedNamePath(c));
}).ToList();
var loadForestServersTask = ActiveDirectory.LoadForestServersAsync();
var loadForestServersTask = ADDiscoverForestServers.LoadForestServersAsync();
if (loadForestServersTask.Wait(TimeSpan.FromSeconds(1)))
{
m.ADForestServers = loadForestServersTask.Result;
var configValue = config.ActiveDirectory.SearchEntireForest ?? true;
m.ADSearchEntireForest = configValue && m.ADForestServers.Count <= ActiveDirectory.MaxForestServerSearch;
var configValue = config.ActiveDirectory.SearchAllForestServers ?? true;
m.ADSearchAllForestServers = configValue && m.ADForestServers.Count <= ActiveDirectory.MaxForestServerSearch;
}
else
{
m.ADForestServers = null;
m.ADSearchEntireForest = config.ActiveDirectory.SearchEntireForest ?? true;
m.ADSearchAllForestServers = config.ActiveDirectory.SearchAllForestServers ?? true;
}
return m;