Update #42: AD Migration
Refactor to target specific Domain Controllers, with failover.
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user