support active directory trust relationships
This commit is contained in:
@@ -1,5 +1,7 @@
|
|||||||
using Disco.Data.Repository;
|
using Disco.Data.Repository;
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
|
||||||
namespace Disco.Data.Configuration.Modules
|
namespace Disco.Data.Configuration.Modules
|
||||||
{
|
{
|
||||||
@@ -24,12 +26,36 @@ namespace Disco.Data.Configuration.Modules
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Obsolete("User SearchAllServers instead"), EditorBrowsable(EditorBrowsableState.Never)]
|
||||||
public bool? SearchAllForestServers
|
public bool? SearchAllForestServers
|
||||||
{
|
{
|
||||||
get { return Get<bool?>(null); }
|
get { return Get<bool?>(null); }
|
||||||
set { Set(value); }
|
set { Set(value); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool? SearchAllServers
|
||||||
|
{
|
||||||
|
get {
|
||||||
|
var value = Get<bool?>(null);
|
||||||
|
|
||||||
|
/// migrate <see cref="SearchAllForestServers"/>
|
||||||
|
#pragma warning disable CS0618 // Type or member is obsolete
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
value = SearchAllForestServers;
|
||||||
|
if (value != null)
|
||||||
|
{
|
||||||
|
SearchAllForestServers = null;
|
||||||
|
SearchAllServers = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#pragma warning restore CS0618 // Type or member is obsolete
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
set { Set(value); }
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// If true LDAP filters contain wildcards only at the end of the search term.
|
/// If true LDAP filters contain wildcards only at the end of the search term.
|
||||||
/// This greatly improves performance in very large AD environments (ie: EDU001/EDU002)
|
/// This greatly improves performance in very large AD environments (ie: EDU001/EDU002)
|
||||||
|
|||||||
+31
-33
@@ -7,37 +7,37 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace Disco.Services.Interop.ActiveDirectory
|
namespace Disco.Services.Interop.ActiveDirectory
|
||||||
{
|
{
|
||||||
public class ADDiscoverForestServers : ScheduledTask
|
public class ADDiscoverServers : ScheduledTask
|
||||||
{
|
{
|
||||||
public override string TaskName { get { return "Active Directory - Discover Forest Servers"; } }
|
public override string TaskName { get { return "Active Directory - Discover Servers"; } }
|
||||||
public override bool SingleInstanceTask { get { return true; } }
|
public override bool SingleInstanceTask { get { return true; } }
|
||||||
public override bool CancelInitiallySupported { get { return false; } }
|
public override bool CancelInitiallySupported { get { return false; } }
|
||||||
internal static List<string> ForestServers { get; set; }
|
internal static List<string> AllServers { get; set; }
|
||||||
private static object _scheduleLock = new object();
|
private static object _scheduleLock = new object();
|
||||||
|
|
||||||
protected override void ExecuteTask()
|
protected override void ExecuteTask()
|
||||||
{
|
{
|
||||||
var forestServers = DiscoverForestServers();
|
var allServers = DiscoverAllServers();
|
||||||
ADDiscoverForestServers.ForestServers = forestServers;
|
AllServers = allServers;
|
||||||
|
|
||||||
// Restrict Searching Entire Forest if to many servers
|
// Restrict Searching Entire Directory if to many servers
|
||||||
using (DiscoDataContext Database = new DiscoDataContext())
|
using (DiscoDataContext Database = new DiscoDataContext())
|
||||||
{
|
{
|
||||||
var searchEntireForest = Database.DiscoConfiguration.ActiveDirectory.SearchAllForestServers;
|
var searchAllServers = Database.DiscoConfiguration.ActiveDirectory.SearchAllServers;
|
||||||
|
|
||||||
// Check explicitly configured: No
|
// Check explicitly configured: No
|
||||||
if (!searchEntireForest.HasValue || searchEntireForest.Value)
|
if (!searchAllServers.HasValue || searchAllServers.Value)
|
||||||
{
|
{
|
||||||
// Not Configured, or explicitly configured: Yes
|
// Not Configured, or explicitly configured: Yes
|
||||||
if (forestServers.Count > ActiveDirectory.MaxForestServerSearch)
|
if (allServers.Count > ActiveDirectory.MaxAllServerSearch)
|
||||||
{
|
{
|
||||||
// Update Database
|
// Update Database
|
||||||
Database.DiscoConfiguration.ActiveDirectory.SearchAllForestServers = false;
|
Database.DiscoConfiguration.ActiveDirectory.SearchAllServers = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Default
|
// Default
|
||||||
Database.DiscoConfiguration.ActiveDirectory.SearchAllForestServers = true;
|
Database.DiscoConfiguration.ActiveDirectory.SearchAllServers = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Database.SaveChanges();
|
Database.SaveChanges();
|
||||||
@@ -47,69 +47,67 @@ namespace Disco.Services.Interop.ActiveDirectory
|
|||||||
|
|
||||||
internal static ScheduledTaskStatus ScheduleNow()
|
internal static ScheduledTaskStatus ScheduleNow()
|
||||||
{
|
{
|
||||||
var taskStatus = ScheduledTasks.GetTaskStatuses(typeof(ADDiscoverForestServers)).Where(ts => ts.IsRunning).FirstOrDefault();
|
var taskStatus = ScheduledTasks.GetTaskStatuses(typeof(ADDiscoverServers)).Where(ts => ts.IsRunning).FirstOrDefault();
|
||||||
if (taskStatus != null)
|
if (taskStatus != null)
|
||||||
return taskStatus;
|
return taskStatus;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
lock (_scheduleLock)
|
lock (_scheduleLock)
|
||||||
{
|
{
|
||||||
taskStatus = ScheduledTasks.GetTaskStatuses(typeof(ADDiscoverForestServers)).Where(ts => ts.IsRunning).FirstOrDefault();
|
taskStatus = ScheduledTasks.GetTaskStatuses(typeof(ADDiscoverServers)).Where(ts => ts.IsRunning).FirstOrDefault();
|
||||||
if (taskStatus != null)
|
if (taskStatus != null)
|
||||||
return taskStatus;
|
return taskStatus;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var t = new ADDiscoverForestServers();
|
var t = new ADDiscoverServers();
|
||||||
return t.ScheduleTask();
|
return t.ScheduleTask();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<string> LoadForestServersBlocking()
|
public static List<string> LoadAllServersSync()
|
||||||
{
|
{
|
||||||
if (ADDiscoverForestServers.ForestServers != null)
|
if (AllServers != null)
|
||||||
return ADDiscoverForestServers.ForestServers;
|
return AllServers;
|
||||||
|
|
||||||
ScheduledTaskStatus status;
|
ScheduledTaskStatus status;
|
||||||
lock (_scheduleLock)
|
lock (_scheduleLock)
|
||||||
{
|
{
|
||||||
if (ADDiscoverForestServers.ForestServers != null)
|
if (AllServers != null)
|
||||||
return ADDiscoverForestServers.ForestServers;
|
return AllServers;
|
||||||
|
|
||||||
status = ADDiscoverForestServers.ScheduleNow();
|
status = ScheduleNow();
|
||||||
}
|
}
|
||||||
|
|
||||||
status.CompletionTask.Wait();
|
status.CompletionTask.Wait();
|
||||||
return ForestServers;
|
return AllServers;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Task<List<string>> LoadForestServersAsync()
|
public static Task<List<string>> LoadAllServersAsync()
|
||||||
{
|
{
|
||||||
if (ADDiscoverForestServers.ForestServers != null)
|
if (AllServers != null)
|
||||||
return Task.FromResult(ADDiscoverForestServers.ForestServers);
|
return Task.FromResult(AllServers);
|
||||||
|
|
||||||
ScheduledTaskStatus status;
|
ScheduledTaskStatus status;
|
||||||
lock (_scheduleLock)
|
lock (_scheduleLock)
|
||||||
{
|
{
|
||||||
if (ADDiscoverForestServers.ForestServers != null)
|
if (AllServers != null)
|
||||||
return Task.FromResult(ADDiscoverForestServers.ForestServers);
|
return Task.FromResult(AllServers);
|
||||||
|
|
||||||
status = ADDiscoverForestServers.ScheduleNow();
|
status = ScheduleNow();
|
||||||
}
|
}
|
||||||
|
|
||||||
return status.CompletionTask.ContinueWith(t =>
|
return status.CompletionTask.ContinueWith(t =>
|
||||||
{
|
{
|
||||||
return ADDiscoverForestServers.ForestServers;
|
return AllServers;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<string> DiscoverForestServers()
|
private static List<string> DiscoverAllServers()
|
||||||
{
|
{
|
||||||
using (var computerDomain = Domain.GetComputerDomain())
|
return ActiveDirectory.Context.Domains
|
||||||
{
|
.SelectMany(d => d.Domain.FindAllDomainControllers().Cast<DomainController>().Select(dc => dc.Name)).ToList();
|
||||||
return computerDomain.Forest.Domains.Cast<Domain>().SelectMany(d => d.FindAllDomainControllers().Cast<DomainController>()).Select(dc => dc.Name).ToList();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -67,7 +67,7 @@ namespace Disco.Services.Interop.ActiveDirectory
|
|||||||
var ldapFilter = string.Format(ldapFilterTemplate, ADHelpers.EscapeLdapQuery(deviceSamAccountName));
|
var ldapFilter = string.Format(ldapFilterTemplate, ADHelpers.EscapeLdapQuery(deviceSamAccountName));
|
||||||
IEnumerable<ADDomainController> domainControllers;
|
IEnumerable<ADDomainController> domainControllers;
|
||||||
|
|
||||||
if (context.SearchAllForestServers)
|
if (context.SearchAllServers)
|
||||||
domainControllers = deviceDomain.GetAllReachableDomainControllers();
|
domainControllers = deviceDomain.GetAllReachableDomainControllers();
|
||||||
else
|
else
|
||||||
domainControllers = deviceDomain.GetReachableSiteDomainControllers();
|
domainControllers = deviceDomain.GetReachableSiteDomainControllers();
|
||||||
@@ -122,7 +122,7 @@ namespace Disco.Services.Interop.ActiveDirectory
|
|||||||
|
|
||||||
// Determine Domain Controllers to Query
|
// Determine Domain Controllers to Query
|
||||||
IEnumerable<Tuple<ADDomain, ADDomainController, List<string>>> serverQueries;
|
IEnumerable<Tuple<ADDomain, ADDomainController, List<string>>> serverQueries;
|
||||||
if (context.SearchAllForestServers)
|
if (context.SearchAllServers)
|
||||||
serverQueries = domainQueries.SelectMany(q => q.Item1.GetAllReachableDomainControllers(), (q, dc) => Tuple.Create(q.Item1, dc, q.Item2));
|
serverQueries = domainQueries.SelectMany(q => q.Item1.GetAllReachableDomainControllers(), (q, dc) => Tuple.Create(q.Item1, dc, q.Item2));
|
||||||
else
|
else
|
||||||
serverQueries = domainQueries.SelectMany(q => q.Item1.GetReachableSiteDomainControllers(), (q, dc) => Tuple.Create(q.Item1, dc, q.Item2));
|
serverQueries = domainQueries.SelectMany(q => q.Item1.GetReachableSiteDomainControllers(), (q, dc) => Tuple.Create(q.Item1, dc, q.Item2));
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ namespace Disco.Services.Interop.ActiveDirectory
|
|||||||
{
|
{
|
||||||
public const int SingleSearchResult = 1;
|
public const int SingleSearchResult = 1;
|
||||||
public const int DefaultSearchResultLimit = 30;
|
public const int DefaultSearchResultLimit = 30;
|
||||||
public const int MaxForestServerSearch = 30;
|
public const int MaxAllServerSearch = 30;
|
||||||
public const int DomainControllerUnavailableMinutes = 10;
|
public const int DomainControllerUnavailableMinutes = 10;
|
||||||
|
|
||||||
private static ActiveDirectoryContext context;
|
private static ActiveDirectoryContext context;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Disco.Data.Repository;
|
using Disco.Data.Repository;
|
||||||
|
using Disco.Services.Logging;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.DirectoryServices.ActiveDirectory;
|
using System.DirectoryServices.ActiveDirectory;
|
||||||
@@ -15,24 +16,24 @@ namespace Disco.Services.Interop.ActiveDirectory
|
|||||||
public List<ADDomain> Domains { get; private set; }
|
public List<ADDomain> Domains { get; private set; }
|
||||||
public ActiveDirectoryManagedGroups ManagedGroups { get; private set; }
|
public ActiveDirectoryManagedGroups ManagedGroups { get; private set; }
|
||||||
|
|
||||||
public List<string> ForestServers
|
public List<string> AllServers
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return ADDiscoverForestServers.LoadForestServersBlocking();
|
return ADDiscoverServers.LoadAllServersSync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool _SearchAllForestServers { get; set; }
|
private bool searchAllServers { get; set; }
|
||||||
public bool SearchAllForestServers
|
public bool SearchAllServers
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
var fs = ADDiscoverForestServers.ForestServers;
|
var fs = ADDiscoverServers.AllServers;
|
||||||
if (fs != null && fs.Count > ActiveDirectory.MaxForestServerSearch)
|
if (fs != null && fs.Count > ActiveDirectory.MaxAllServerSearch)
|
||||||
return false; // Never
|
return false; // Never
|
||||||
|
|
||||||
return _SearchAllForestServers;
|
return searchAllServers;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,8 +51,8 @@ namespace Disco.Services.Interop.ActiveDirectory
|
|||||||
|
|
||||||
private void Initialize(DiscoDataContext Database)
|
private void Initialize(DiscoDataContext Database)
|
||||||
{
|
{
|
||||||
// Search Entire Forest (default: true)
|
// Search Entire Directory (default: true)
|
||||||
_SearchAllForestServers = Database.DiscoConfiguration.ActiveDirectory.SearchAllForestServers ?? true;
|
searchAllServers = Database.DiscoConfiguration.ActiveDirectory.SearchAllServers ?? true;
|
||||||
|
|
||||||
// Set Search LDAP Filters
|
// Set Search LDAP Filters
|
||||||
InitializeWildcardSearchSufixOnly(Database.DiscoConfiguration.ActiveDirectory.SearchWildcardSuffixOnly);
|
InitializeWildcardSearchSufixOnly(Database.DiscoConfiguration.ActiveDirectory.SearchWildcardSuffixOnly);
|
||||||
@@ -62,11 +63,52 @@ namespace Disco.Services.Interop.ActiveDirectory
|
|||||||
|
|
||||||
// Determine Domains
|
// Determine Domains
|
||||||
var computerDomain = Domain.GetComputerDomain();
|
var computerDomain = Domain.GetComputerDomain();
|
||||||
Domains = computerDomain.Forest.Domains
|
var domains = computerDomain.Forest.Domains
|
||||||
.Cast<Domain>()
|
.Cast<Domain>()
|
||||||
.Select(d => new ADDomain(this, d))
|
.Select(d => new ADDomain(this, d))
|
||||||
.ToList();
|
.ToList();
|
||||||
PrimaryDomain = Domains.Where(d => d.Name == computerDomain.Name).First();
|
|
||||||
|
// Try adding forest trust relationships
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var trustRelationships = computerDomain.Forest.GetAllTrustRelationships();
|
||||||
|
|
||||||
|
foreach (TrustRelationshipInformation trustRelationship in trustRelationships)
|
||||||
|
{
|
||||||
|
var sourceDomain = trustRelationship.SourceName;
|
||||||
|
if (!domains.Any(d => string.Equals(d.Name, sourceDomain, StringComparison.OrdinalIgnoreCase)))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var domain = Domain.GetDomain(new DirectoryContext(DirectoryContextType.Domain, sourceDomain));
|
||||||
|
domains.Add(new ADDomain(this, domain));
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
SystemLog.LogException($"ActiveDirectory Initialize Trust Domain: [{sourceDomain}]", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var targetDomain = trustRelationship.TargetName;
|
||||||
|
if (!domains.Any(d => string.Equals(d.Name, targetDomain, StringComparison.OrdinalIgnoreCase)))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var domain = Domain.GetDomain(new DirectoryContext(DirectoryContextType.Domain, targetDomain));
|
||||||
|
domains.Add(new ADDomain(this, domain));
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
SystemLog.LogException($"ActiveDirectory Initialize Trust Domain: [{targetDomain}]", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
SystemLog.LogException("ActiveDirectory Initialize Trust Domains", ex);
|
||||||
|
}
|
||||||
|
PrimaryDomain = domains.Where(d => d.Name == computerDomain.Name).First();
|
||||||
|
Domains = domains;
|
||||||
|
|
||||||
// Determine Search Scope Containers
|
// Determine Search Scope Containers
|
||||||
ReinitializeSearchContainers(Database.DiscoConfiguration.ActiveDirectory.SearchContainers);
|
ReinitializeSearchContainers(Database.DiscoConfiguration.ActiveDirectory.SearchContainers);
|
||||||
@@ -180,7 +222,7 @@ namespace Disco.Services.Interop.ActiveDirectory
|
|||||||
|
|
||||||
#region Searching
|
#region Searching
|
||||||
|
|
||||||
public IEnumerable<ADSearchResult> SearchEntireForest(string LdapFilter, string[] LoadProperties, int? ResultLimit = null)
|
public IEnumerable<ADSearchResult> SearchEntireDirectory(string LdapFilter, string[] LoadProperties, int? ResultLimit = null)
|
||||||
{
|
{
|
||||||
var queries = Domains.Select(d => Tuple.Create(d, d.DistinguishedName));
|
var queries = Domains.Select(d => Tuple.Create(d, d.DistinguishedName));
|
||||||
|
|
||||||
@@ -249,27 +291,27 @@ namespace Disco.Services.Interop.ActiveDirectory
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool UpdateSearchAllForestServers(DiscoDataContext Database, bool SearchAllForestServers)
|
public bool UpdateSearchAllServers(DiscoDataContext Database, bool SearchAllServers)
|
||||||
{
|
{
|
||||||
if (SearchAllForestServers == false)
|
if (SearchAllServers == false)
|
||||||
{
|
{
|
||||||
Database.DiscoConfiguration.ActiveDirectory.SearchAllForestServers = false;
|
Database.DiscoConfiguration.ActiveDirectory.SearchAllServers = false;
|
||||||
_SearchAllForestServers = false;
|
searchAllServers = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var forestServers = ADDiscoverForestServers.LoadForestServersBlocking();
|
var allServers = ADDiscoverServers.LoadAllServersSync();
|
||||||
if (forestServers.Count <= ActiveDirectory.MaxForestServerSearch)
|
if (allServers.Count <= ActiveDirectory.MaxAllServerSearch)
|
||||||
{
|
{
|
||||||
Database.DiscoConfiguration.ActiveDirectory.SearchAllForestServers = true;
|
Database.DiscoConfiguration.ActiveDirectory.SearchAllServers = true;
|
||||||
_SearchAllForestServers = true;
|
searchAllServers = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Database.DiscoConfiguration.ActiveDirectory.SearchAllForestServers = false;
|
Database.DiscoConfiguration.ActiveDirectory.SearchAllServers = false;
|
||||||
_SearchAllForestServers = false;
|
searchAllServers = false;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -219,21 +219,21 @@ namespace Disco.Web.Areas.API.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
[DiscoAuthorize(Claims.Config.System.ConfigureActiveDirectory)]
|
[DiscoAuthorize(Claims.Config.System.ConfigureActiveDirectory)]
|
||||||
public virtual ActionResult UpdateActiveDirectorySearchAllForestServers(bool SearchAllForestServers, bool redirect = false)
|
public virtual ActionResult UpdateActiveDirectorySearchAllServers(bool SearchAllServers, bool redirect = false)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var result = ActiveDirectory.Context.UpdateSearchAllForestServers(Database, SearchAllForestServers);
|
var result = ActiveDirectory.Context.UpdateSearchAllServers(Database, SearchAllServers);
|
||||||
|
|
||||||
Database.SaveChanges();
|
Database.SaveChanges();
|
||||||
|
|
||||||
if (!result)
|
if (!result)
|
||||||
{
|
{
|
||||||
var forestServers = ActiveDirectory.Context.ForestServers;
|
var allServers = ActiveDirectory.Context.AllServers;
|
||||||
if (forestServers.Count > ActiveDirectory.MaxForestServerSearch)
|
if (allServers.Count > ActiveDirectory.MaxAllServerSearch)
|
||||||
throw new InvalidOperationException(string.Format("This forest contains more than the Max Forest Server Search restriction ({0})", ActiveDirectory.MaxForestServerSearch));
|
throw new InvalidOperationException($"This directory contains more than the Max Server Search restriction ({ActiveDirectory.MaxAllServerSearch})");
|
||||||
else
|
else
|
||||||
throw new InvalidOperationException("Unable to change the 'SearchEntireForest' property for an unknown reason, please report this bug");
|
throw new InvalidOperationException("Unable to change the 'SearchAllServers' property for an unknown reason, please report this bug");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (redirect)
|
if (redirect)
|
||||||
|
|||||||
@@ -76,8 +76,8 @@ namespace Disco.Web.Areas.Config.Models.SystemConfig
|
|||||||
|
|
||||||
#region Active Directory
|
#region Active Directory
|
||||||
|
|
||||||
[Display(Name="Search All Forest Servers")]
|
[Display(Name="Search All Servers")]
|
||||||
public bool ADSearchAllForestServers { get; set; }
|
public bool ADSearchAllServers { get; set; }
|
||||||
|
|
||||||
public List<ADDomain> ADDomains { get; set; }
|
public List<ADDomain> ADDomains { get; set; }
|
||||||
public ADDomain ADPrimaryDomain { get; set; }
|
public ADDomain ADPrimaryDomain { get; set; }
|
||||||
@@ -86,7 +86,7 @@ namespace Disco.Web.Areas.Config.Models.SystemConfig
|
|||||||
public List<Tuple<string, ADDomain, string>> ADSearchContainers { get; set; }
|
public List<Tuple<string, ADDomain, string>> ADSearchContainers { get; set; }
|
||||||
[Display(Name = "Search With Suffix Wildcard Only")]
|
[Display(Name = "Search With Suffix Wildcard Only")]
|
||||||
public bool ADSearchWildcardSuffixOnly { get; set; }
|
public bool ADSearchWildcardSuffixOnly { get; set; }
|
||||||
public List<string> ADForestServers { get; set; }
|
public List<string> ADAllServers { get; set; }
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@@ -136,17 +136,17 @@ namespace Disco.Web.Areas.Config.Models.SystemConfig
|
|||||||
return Tuple.Create(c, domain, domain.FriendlyDistinguishedNamePath(c));
|
return Tuple.Create(c, domain, domain.FriendlyDistinguishedNamePath(c));
|
||||||
}).ToList();
|
}).ToList();
|
||||||
|
|
||||||
var loadForestServersTask = ADDiscoverForestServers.LoadForestServersAsync();
|
var loadAllServersTask = ADDiscoverServers.LoadAllServersAsync();
|
||||||
if (loadForestServersTask.Wait(TimeSpan.FromSeconds(1)))
|
if (loadAllServersTask.Wait(TimeSpan.FromSeconds(1)))
|
||||||
{
|
{
|
||||||
m.ADForestServers = loadForestServersTask.Result;
|
m.ADAllServers = loadAllServersTask.Result;
|
||||||
var configValue = config.ActiveDirectory.SearchAllForestServers ?? true;
|
var configValue = config.ActiveDirectory.SearchAllServers ?? true;
|
||||||
m.ADSearchAllForestServers = configValue && m.ADForestServers.Count <= ActiveDirectory.MaxForestServerSearch;
|
m.ADSearchAllServers = configValue && m.ADAllServers.Count <= ActiveDirectory.MaxAllServerSearch;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m.ADForestServers = null;
|
m.ADAllServers = null;
|
||||||
m.ADSearchAllForestServers = config.ActiveDirectory.SearchAllForestServers ?? true;
|
m.ADSearchAllServers = config.ActiveDirectory.SearchAllServers ?? true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
|
|||||||
@@ -241,17 +241,17 @@
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th style="width: 135px">
|
<th style="width: 135px">
|
||||||
Forest:
|
Directory:
|
||||||
</th>
|
</th>
|
||||||
<td>
|
<td>
|
||||||
@if (Model.ADForestServers == null)
|
@if (Model.ADAllServers == null)
|
||||||
{
|
{
|
||||||
<div>
|
<div>
|
||||||
@Html.CheckBoxFor(m => m.ADSearchAllForestServers, new { disabled = "disabled" }) @Html.LabelFor(m => m.ADSearchAllForestServers)
|
@Html.CheckBoxFor(m => m.ADSearchAllServers, new { disabled = "disabled" }) @Html.LabelFor(m => m.ADSearchAllServers)
|
||||||
</div>
|
</div>
|
||||||
<div class="info-box">
|
<div class="info-box">
|
||||||
<p class="fa-p">
|
<p class="fa-p">
|
||||||
<i class="fa fa-info-circle"></i>Forest servers are currently being retrieved.<br />
|
<i class="fa fa-info-circle"></i>Directory servers are currently being retrieved.<br />
|
||||||
Try refreshing this page in a moment.
|
Try refreshing this page in a moment.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -260,28 +260,28 @@
|
|||||||
{
|
{
|
||||||
if (canConfigAD)
|
if (canConfigAD)
|
||||||
{
|
{
|
||||||
var canSearchEntireForest = (Model.ADForestServers.Count <= Disco.Services.Interop.ActiveDirectory.ActiveDirectory.MaxForestServerSearch);
|
var canSearchEntireDirectory = (Model.ADAllServers.Count <= Disco.Services.Interop.ActiveDirectory.ActiveDirectory.MaxAllServerSearch);
|
||||||
<div>
|
<div>
|
||||||
@if (!canSearchEntireForest)
|
@if (!canSearchEntireDirectory)
|
||||||
{
|
{
|
||||||
@Html.CheckBoxFor(m => m.ADSearchAllForestServers, new { disabled = "disabled" }) @Html.LabelFor(m => m.ADSearchAllForestServers)
|
@Html.CheckBoxFor(m => m.ADSearchAllServers, new { disabled = "disabled" }) @Html.LabelFor(m => m.ADSearchAllServers)
|
||||||
<div class="info-box">
|
<div class="info-box">
|
||||||
<p class="fa-p">
|
<p class="fa-p">
|
||||||
<i class="fa fa-exclamation-circle warning"></i>Disco will not search entire forests which consist of more than @(Disco.Services.Interop.ActiveDirectory.ActiveDirectory.MaxForestServerSearch) servers. Only servers within this site will be searched.
|
<i class="fa fa-exclamation-circle warning"></i>Disco will not search the entire directory which consists of more than @(Disco.Services.Interop.ActiveDirectory.ActiveDirectory.MaxAllServerSearch) servers. Only servers within this site will be searched.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@Html.CheckBoxFor(m => m.ADSearchAllForestServers) @Html.LabelFor(m => m.ADSearchAllForestServers) @AjaxHelpers.AjaxLoader()
|
@Html.CheckBoxFor(m => m.ADSearchAllServers) @Html.LabelFor(m => m.ADSearchAllServers) @AjaxHelpers.AjaxLoader()
|
||||||
<div class="info-box">
|
<div class="info-box">
|
||||||
<p class="fa-p">
|
<p class="fa-p">
|
||||||
<i class="fa fa-info-circle"></i>If this setting is enabled, Disco will query all servers within the forest rather than only servers within this site.
|
<i class="fa fa-info-circle"></i>If this setting is enabled, Disco will query all servers within the directory rather than only servers within this site.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<script>
|
<script>
|
||||||
$(function () {
|
$(function () {
|
||||||
document.DiscoFunctions.PropertyChangeHelper($('#ADSearchAllForestServers'), null, '@(Url.Action(MVC.API.System.UpdateActiveDirectorySearchAllForestServers()))', 'SearchAllForestServers');
|
document.DiscoFunctions.PropertyChangeHelper($('#ADSearchAllServers'), null, '@(Url.Action(MVC.API.System.UpdateActiveDirectorySearchAllServers()))', 'SearchAllServers');
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
}
|
}
|
||||||
@@ -290,10 +290,10 @@
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
<div>
|
<div>
|
||||||
@Html.CheckBoxFor(m => m.ADSearchAllForestServers, new { disabled = "disabled" }) @Html.LabelFor(m => m.ADSearchAllForestServers)
|
@Html.CheckBoxFor(m => m.ADSearchAllServers, new { disabled = "disabled" }) @Html.LabelFor(m => m.ADSearchAllServers)
|
||||||
<div class="info-box">
|
<div class="info-box">
|
||||||
<p class="fa-p">
|
<p class="fa-p">
|
||||||
<i class="fa fa-info-circle"></i>If this setting is enabled, Disco will query all servers within the forest rather than only servers within this site.
|
<i class="fa fa-info-circle"></i>If this setting is enabled, Disco will query all servers within the directory rather than only servers within this site.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -301,12 +301,12 @@
|
|||||||
<div>
|
<div>
|
||||||
<hr />
|
<hr />
|
||||||
<span>All Servers:</span>
|
<span>All Servers:</span>
|
||||||
<ul id="Config_System_AD_ForestServers" class="none">
|
<ul id="Config_System_AD_AllServers" class="none">
|
||||||
@{
|
@{
|
||||||
var domainIndex = Model.ADDomains.ToDictionary(d => d.Name, StringComparer.OrdinalIgnoreCase);
|
var domainIndex = Model.ADDomains.ToDictionary(d => d.Name, StringComparer.OrdinalIgnoreCase);
|
||||||
foreach (var server in Model.ADForestServers.OrderBy(s => s))
|
var siteServers = Model.ADServers.Where(s => s.IsSiteServer).ToDictionary(s => s.Name, StringComparer.OrdinalIgnoreCase);
|
||||||
|
foreach (var server in Model.ADAllServers.OrderBy(s => s))
|
||||||
{
|
{
|
||||||
var isSiteServer = Model.ADServers.Any(s => s.IsSiteServer && s.Name.Equals(server, StringComparison.OrdinalIgnoreCase));
|
|
||||||
var serverDescription = server;
|
var serverDescription = server;
|
||||||
if (server.Contains('.'))
|
if (server.Contains('.'))
|
||||||
{
|
{
|
||||||
@@ -317,7 +317,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
<li>
|
<li>
|
||||||
<code>@serverDescription</code>@if (isSiteServer)
|
<code>@serverDescription</code>@if (siteServers.ContainsKey(server))
|
||||||
{ <i class="fa fa-building-o information fa-fw" title="Site Server"></i> }
|
{ <i class="fa fa-building-o information fa-fw" title="Site Server"></i> }
|
||||||
</li>
|
</li>
|
||||||
}
|
}
|
||||||
@@ -326,7 +326,7 @@
|
|||||||
<script>
|
<script>
|
||||||
$(function () {
|
$(function () {
|
||||||
var toManyServers = 5;
|
var toManyServers = 5;
|
||||||
var ul = $('#Config_System_AD_ForestServers');
|
var ul = $('#Config_System_AD_AllServers');
|
||||||
var ulLi = ul.find('li');
|
var ulLi = ul.find('li');
|
||||||
if (ulLi.length > toManyServers) {
|
if (ulLi.length > toManyServers) {
|
||||||
var liMore = $('<li>').append(
|
var liMore = $('<li>').append(
|
||||||
@@ -487,7 +487,7 @@
|
|||||||
|
|
||||||
// Set Buttons
|
// Set Buttons
|
||||||
$dialog.dialog('option', 'buttons', {
|
$dialog.dialog('option', 'buttons', {
|
||||||
'Search Entire Forest': function () {
|
'Search Entire Directory': function () {
|
||||||
var $this = $(this);
|
var $this = $(this);
|
||||||
$this.css('overflow', 'hidden');
|
$this.css('overflow', 'hidden');
|
||||||
$this.dialog("disable");
|
$this.dialog("disable");
|
||||||
|
|||||||
@@ -845,7 +845,7 @@ WriteLiteral(" </div>\r\n </td>\r\n </tr>\r\n
|
|||||||
|
|
||||||
WriteLiteral(" style=\"width: 135px\"");
|
WriteLiteral(" style=\"width: 135px\"");
|
||||||
|
|
||||||
WriteLiteral(">\r\n Forest:\r\n </th>\r\n <td>\r\n");
|
WriteLiteral(">\r\n Directory:\r\n </th>\r\n <td>\r\n");
|
||||||
|
|
||||||
|
|
||||||
#line 247 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
#line 247 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
||||||
@@ -855,7 +855,7 @@ WriteLiteral(">\r\n Forest:\r\n </th>\r\n <
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
#line 247 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
#line 247 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
||||||
if (Model.ADForestServers == null)
|
if (Model.ADAllServers == null)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
@@ -867,7 +867,7 @@ WriteLiteral(" ");
|
|||||||
|
|
||||||
|
|
||||||
#line 250 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
#line 250 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
||||||
Write(Html.CheckBoxFor(m => m.ADSearchAllForestServers, new { disabled = "disabled" }));
|
Write(Html.CheckBoxFor(m => m.ADSearchAllServers, new { disabled = "disabled" }));
|
||||||
|
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
@@ -876,7 +876,7 @@ WriteLiteral(" ");
|
|||||||
|
|
||||||
|
|
||||||
#line 250 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
#line 250 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
||||||
Write(Html.LabelFor(m => m.ADSearchAllForestServers));
|
Write(Html.LabelFor(m => m.ADSearchAllServers));
|
||||||
|
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
@@ -895,7 +895,7 @@ WriteLiteral(">\r\n <i");
|
|||||||
|
|
||||||
WriteLiteral(" class=\"fa fa-info-circle\"");
|
WriteLiteral(" class=\"fa fa-info-circle\"");
|
||||||
|
|
||||||
WriteLiteral("></i>Forest servers are currently being retrieved.<br />\r\n " +
|
WriteLiteral("></i>Directory servers are currently being retrieved.<br />\r\n " +
|
||||||
" Try refreshing this page in a moment.\r\n </p>\r\n " +
|
" Try refreshing this page in a moment.\r\n </p>\r\n " +
|
||||||
" </div>\r\n");
|
" </div>\r\n");
|
||||||
|
|
||||||
@@ -906,7 +906,7 @@ WriteLiteral("></i>Forest servers are currently being retrieved.<br />\r\n
|
|||||||
{
|
{
|
||||||
if (canConfigAD)
|
if (canConfigAD)
|
||||||
{
|
{
|
||||||
var canSearchEntireForest = (Model.ADForestServers.Count <= Disco.Services.Interop.ActiveDirectory.ActiveDirectory.MaxForestServerSearch);
|
var canSearchEntireDirectory = (Model.ADAllServers.Count <= Disco.Services.Interop.ActiveDirectory.ActiveDirectory.MaxAllServerSearch);
|
||||||
|
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
@@ -921,7 +921,7 @@ WriteLiteral(" <div>\r\n");
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
#line 265 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
#line 265 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
||||||
if (!canSearchEntireForest)
|
if (!canSearchEntireDirectory)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
@@ -929,7 +929,7 @@ WriteLiteral(" <div>\r\n");
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
#line 267 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
#line 267 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
||||||
Write(Html.CheckBoxFor(m => m.ADSearchAllForestServers, new { disabled = "disabled" }));
|
Write(Html.CheckBoxFor(m => m.ADSearchAllServers, new { disabled = "disabled" }));
|
||||||
|
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
@@ -942,7 +942,7 @@ WriteLiteral(" <div>\r\n");
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
#line 267 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
#line 267 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
||||||
Write(Html.LabelFor(m => m.ADSearchAllForestServers));
|
Write(Html.LabelFor(m => m.ADSearchAllServers));
|
||||||
|
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
@@ -966,11 +966,11 @@ WriteLiteral(">\r\n <i");
|
|||||||
|
|
||||||
WriteLiteral(" class=\"fa fa-exclamation-circle warning\"");
|
WriteLiteral(" class=\"fa fa-exclamation-circle warning\"");
|
||||||
|
|
||||||
WriteLiteral("></i>Disco will not search entire forests which consist of more than ");
|
WriteLiteral("></i>Disco will not search the entire directory which consists of more than ");
|
||||||
|
|
||||||
|
|
||||||
#line 270 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
#line 270 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
||||||
Write(Disco.Services.Interop.ActiveDirectory.ActiveDirectory.MaxForestServerSearch);
|
Write(Disco.Services.Interop.ActiveDirectory.ActiveDirectory.MaxAllServerSearch);
|
||||||
|
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
@@ -989,7 +989,7 @@ WriteLiteral(" servers. Only servers within this site will be searched.\r\n
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
#line 276 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
#line 276 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
||||||
Write(Html.CheckBoxFor(m => m.ADSearchAllForestServers));
|
Write(Html.CheckBoxFor(m => m.ADSearchAllServers));
|
||||||
|
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
@@ -1002,7 +1002,7 @@ WriteLiteral(" servers. Only servers within this site will be searched.\r\n
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
#line 276 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
#line 276 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
||||||
Write(Html.LabelFor(m => m.ADSearchAllForestServers));
|
Write(Html.LabelFor(m => m.ADSearchAllServers));
|
||||||
|
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
@@ -1039,22 +1039,22 @@ WriteLiteral(">\r\n <i");
|
|||||||
|
|
||||||
WriteLiteral(" class=\"fa fa-info-circle\"");
|
WriteLiteral(" class=\"fa fa-info-circle\"");
|
||||||
|
|
||||||
WriteLiteral("></i>If this setting is enabled, Disco will query all servers within the forest r" +
|
WriteLiteral("></i>If this setting is enabled, Disco will query all servers within the director" +
|
||||||
"ather than only servers within this site.\r\n <" +
|
"y rather than only servers within this site.\r\n " +
|
||||||
"/p>\r\n </div>\r\n");
|
" </p>\r\n </div>\r\n");
|
||||||
|
|
||||||
WriteLiteral(" <script>\r\n $(f" +
|
WriteLiteral(" <script>\r\n $(f" +
|
||||||
"unction () {\r\n document.DiscoFunctions.Pr" +
|
"unction () {\r\n document.DiscoFunctions.Pr" +
|
||||||
"opertyChangeHelper($(\'#ADSearchAllForestServers\'), null, \'");
|
"opertyChangeHelper($(\'#ADSearchAllServers\'), null, \'");
|
||||||
|
|
||||||
|
|
||||||
#line 284 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
#line 284 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
||||||
Write(Url.Action(MVC.API.System.UpdateActiveDirectorySearchAllForestServers()));
|
Write(Url.Action(MVC.API.System.UpdateActiveDirectorySearchAllServers()));
|
||||||
|
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
#line hidden
|
#line hidden
|
||||||
WriteLiteral("\', \'SearchAllForestServers\');\r\n });\r\n " +
|
WriteLiteral("\', \'SearchAllServers\');\r\n });\r\n " +
|
||||||
" </script>\r\n");
|
" </script>\r\n");
|
||||||
|
|
||||||
|
|
||||||
@@ -1081,7 +1081,7 @@ WriteLiteral(" ");
|
|||||||
|
|
||||||
|
|
||||||
#line 293 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
#line 293 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
||||||
Write(Html.CheckBoxFor(m => m.ADSearchAllForestServers, new { disabled = "disabled" }));
|
Write(Html.CheckBoxFor(m => m.ADSearchAllServers, new { disabled = "disabled" }));
|
||||||
|
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
@@ -1090,7 +1090,7 @@ WriteLiteral(" ");
|
|||||||
|
|
||||||
|
|
||||||
#line 293 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
#line 293 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
||||||
Write(Html.LabelFor(m => m.ADSearchAllForestServers));
|
Write(Html.LabelFor(m => m.ADSearchAllServers));
|
||||||
|
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
@@ -1107,9 +1107,9 @@ WriteLiteral(">\r\n <i");
|
|||||||
|
|
||||||
WriteLiteral(" class=\"fa fa-info-circle\"");
|
WriteLiteral(" class=\"fa fa-info-circle\"");
|
||||||
|
|
||||||
WriteLiteral("></i>If this setting is enabled, Disco will query all servers within the forest r" +
|
WriteLiteral("></i>If this setting is enabled, Disco will query all servers within the director" +
|
||||||
"ather than only servers within this site.\r\n </p>\r" +
|
"y rather than only servers within this site.\r\n </" +
|
||||||
"\n </div>\r\n </div>\r\n");
|
"p>\r\n </div>\r\n </div>\r\n");
|
||||||
|
|
||||||
|
|
||||||
#line 300 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
#line 300 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
||||||
@@ -1121,7 +1121,7 @@ WriteLiteral("></i>If this setting is enabled, Disco will query all servers with
|
|||||||
WriteLiteral(" <div>\r\n <hr />\r\n " +
|
WriteLiteral(" <div>\r\n <hr />\r\n " +
|
||||||
" <span>All Servers:</span>\r\n <ul");
|
" <span>All Servers:</span>\r\n <ul");
|
||||||
|
|
||||||
WriteLiteral(" id=\"Config_System_AD_ForestServers\"");
|
WriteLiteral(" id=\"Config_System_AD_AllServers\"");
|
||||||
|
|
||||||
WriteLiteral(" class=\"none\"");
|
WriteLiteral(" class=\"none\"");
|
||||||
|
|
||||||
@@ -1137,9 +1137,9 @@ WriteLiteral(">\r\n");
|
|||||||
#line 305 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
#line 305 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
||||||
|
|
||||||
var domainIndex = Model.ADDomains.ToDictionary(d => d.Name, StringComparer.OrdinalIgnoreCase);
|
var domainIndex = Model.ADDomains.ToDictionary(d => d.Name, StringComparer.OrdinalIgnoreCase);
|
||||||
foreach (var server in Model.ADForestServers.OrderBy(s => s))
|
var siteServers = Model.ADServers.Where(s => s.IsSiteServer).ToDictionary(s => s.Name, StringComparer.OrdinalIgnoreCase);
|
||||||
|
foreach (var server in Model.ADAllServers.OrderBy(s => s))
|
||||||
{
|
{
|
||||||
var isSiteServer = Model.ADServers.Any(s => s.IsSiteServer && s.Name.Equals(server, StringComparison.OrdinalIgnoreCase));
|
|
||||||
var serverDescription = server;
|
var serverDescription = server;
|
||||||
if (server.Contains('.'))
|
if (server.Contains('.'))
|
||||||
{
|
{
|
||||||
@@ -1167,7 +1167,7 @@ WriteLiteral("</code>");
|
|||||||
|
|
||||||
|
|
||||||
#line 320 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
#line 320 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
||||||
if (isSiteServer)
|
if (siteServers.ContainsKey(server))
|
||||||
{
|
{
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
@@ -1201,7 +1201,7 @@ WriteLiteral(@"
|
|||||||
<script>
|
<script>
|
||||||
$(function () {
|
$(function () {
|
||||||
var toManyServers = 5;
|
var toManyServers = 5;
|
||||||
var ul = $('#Config_System_AD_ForestServers');
|
var ul = $('#Config_System_AD_AllServers');
|
||||||
var ulLi = ul.find('li');
|
var ulLi = ul.find('li');
|
||||||
if (ulLi.length > toManyServers) {
|
if (ulLi.length > toManyServers) {
|
||||||
var liMore = $('<li>').append(
|
var liMore = $('<li>').append(
|
||||||
@@ -1572,35 +1572,35 @@ WriteLiteral("\', null, function (data) {\r\n
|
|||||||
" }).fancytree(\'getTree\');\r\n\r\n tre" +
|
" }).fancytree(\'getTree\');\r\n\r\n tre" +
|
||||||
"e.$container.css(\'position\', \'relative\');\r\n\r\n " +
|
"e.$container.css(\'position\', \'relative\');\r\n\r\n " +
|
||||||
" // Set Buttons\r\n $dialog.dialog(\'opt" +
|
" // Set Buttons\r\n $dialog.dialog(\'opt" +
|
||||||
"ion\', \'buttons\', {\r\n \'Search Entire F" +
|
"ion\', \'buttons\', {\r\n \'Search Entire D" +
|
||||||
"orest\': function () {\r\n var $this" +
|
"irectory\': function () {\r\n var $t" +
|
||||||
" = $(this);\r\n $this.css(\'overflow" +
|
"his = $(this);\r\n $this.css(\'overf" +
|
||||||
"\', \'hidden\');\r\n $this.dialog(\"dis" +
|
"low\', \'hidden\');\r\n $this.dialog(\"" +
|
||||||
"able\");\r\n $this.dialog(\"option\", " +
|
"disable\");\r\n $this.dialog(\"option" +
|
||||||
"\"buttons\", null);\r\n\r\n var $form =" +
|
"\", \"buttons\", null);\r\n\r\n var $for" +
|
||||||
" $dialog.find(\'form\');\r\n $form.su" +
|
"m = $dialog.find(\'form\');\r\n $form" +
|
||||||
"bmit();\r\n },\r\n " +
|
".submit();\r\n },\r\n " +
|
||||||
" \'Save\': function () {\r\n " +
|
" \'Save\': function () {\r\n " +
|
||||||
" var $this = $(this);\r\n " +
|
" var $this = $(this);\r\n " +
|
||||||
" $this.css(\'overflow\', \'hidden\');\r\n " +
|
" $this.css(\'overflow\', \'hidden\');\r\n " +
|
||||||
" $this.dialog(\"disable\");\r\n $t" +
|
" $this.dialog(\"disable\");\r\n " +
|
||||||
"his.dialog(\"option\", \"buttons\", null);\r\n\r\n " +
|
" $this.dialog(\"option\", \"buttons\", null);\r\n\r\n " +
|
||||||
" var nodes = tree.getSelectedNodes();\r\n " +
|
" var nodes = tree.getSelectedNodes();\r\n " +
|
||||||
" var $form = $dialog.find(\'form\');\r\n " +
|
" var $form = $dialog.find(\'form\');\r\n " +
|
||||||
" $.each(nodes, function (i, node) {\r\n " +
|
" $.each(nodes, function (i, node) {\r\n " +
|
||||||
" $(\'<input>\').attr({ \'type\': \'hidden\', \'name\': \'Contai" +
|
" $(\'<input>\').attr({ \'type\': \'hidden\', \'name\': \'Con" +
|
||||||
"ners\', \'value\': node.key }).appendTo($form);\r\n " +
|
"tainers\', \'value\': node.key }).appendTo($form);\r\n " +
|
||||||
" });\r\n $form.submit(" +
|
" });\r\n $form.subm" +
|
||||||
");\r\n }\r\n " +
|
"it();\r\n }\r\n " +
|
||||||
" });\r\n\r\n // Select & Expand\r\n " +
|
" });\r\n\r\n // Select & Expand\r" +
|
||||||
" selectDistinguishedNames();\r\n\r\n " +
|
"\n selectDistinguishedNames();\r\n\r\n " +
|
||||||
" tree.options.fx = { height: \"toggle\", duration: 200" +
|
" tree.options.fx = { height: \"toggle\", duration: " +
|
||||||
" };\r\n });\r\n\r\n " +
|
"200 };\r\n });\r\n\r\n " +
|
||||||
" }\r\n\r\n selectDistinguishedNames();\r\n\r\n " +
|
" }\r\n\r\n selectDistinguishedNames();\r\n\r\n " +
|
||||||
" $dialog.dialog(\'open\');\r\n\r\n r" +
|
" $dialog.dialog(\'open\');\r\n\r\n " +
|
||||||
"eturn false;\r\n }\r\n\r\n $(\'#C" +
|
" return false;\r\n }\r\n\r\n $(" +
|
||||||
"onfig_System_AD_SearchScope_Update\').click(update);\r\n });" +
|
"\'#Config_System_AD_SearchScope_Update\').click(update);\r\n " +
|
||||||
"\r\n </script>\r\n");
|
"});\r\n </script>\r\n");
|
||||||
|
|
||||||
|
|
||||||
#line 532 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
#line 532 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml"
|
||||||
|
|||||||
@@ -89,9 +89,9 @@ namespace Disco.Web.Areas.API.Controllers
|
|||||||
}
|
}
|
||||||
[NonAction]
|
[NonAction]
|
||||||
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
public virtual System.Web.Mvc.ActionResult UpdateActiveDirectorySearchAllForestServers()
|
public virtual System.Web.Mvc.ActionResult UpdateActiveDirectorySearchAllServers()
|
||||||
{
|
{
|
||||||
return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateActiveDirectorySearchAllForestServers);
|
return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateActiveDirectorySearchAllServers);
|
||||||
}
|
}
|
||||||
[NonAction]
|
[NonAction]
|
||||||
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
@@ -155,7 +155,7 @@ namespace Disco.Web.Areas.API.Controllers
|
|||||||
public readonly string DeleteOrganisationAddress = "DeleteOrganisationAddress";
|
public readonly string DeleteOrganisationAddress = "DeleteOrganisationAddress";
|
||||||
public readonly string UpdateMultiSiteMode = "UpdateMultiSiteMode";
|
public readonly string UpdateMultiSiteMode = "UpdateMultiSiteMode";
|
||||||
public readonly string UpdateActiveDirectorySearchScope = "UpdateActiveDirectorySearchScope";
|
public readonly string UpdateActiveDirectorySearchScope = "UpdateActiveDirectorySearchScope";
|
||||||
public readonly string UpdateActiveDirectorySearchAllForestServers = "UpdateActiveDirectorySearchAllForestServers";
|
public readonly string UpdateActiveDirectorySearchAllServers = "UpdateActiveDirectorySearchAllServers";
|
||||||
public readonly string UpdateActiveDirectorySearchWildcardSuffixOnly = "UpdateActiveDirectorySearchWildcardSuffixOnly";
|
public readonly string UpdateActiveDirectorySearchWildcardSuffixOnly = "UpdateActiveDirectorySearchWildcardSuffixOnly";
|
||||||
public readonly string DomainOrganisationalUnits = "DomainOrganisationalUnits";
|
public readonly string DomainOrganisationalUnits = "DomainOrganisationalUnits";
|
||||||
public readonly string SearchSubjects = "SearchSubjects";
|
public readonly string SearchSubjects = "SearchSubjects";
|
||||||
@@ -178,7 +178,7 @@ namespace Disco.Web.Areas.API.Controllers
|
|||||||
public const string DeleteOrganisationAddress = "DeleteOrganisationAddress";
|
public const string DeleteOrganisationAddress = "DeleteOrganisationAddress";
|
||||||
public const string UpdateMultiSiteMode = "UpdateMultiSiteMode";
|
public const string UpdateMultiSiteMode = "UpdateMultiSiteMode";
|
||||||
public const string UpdateActiveDirectorySearchScope = "UpdateActiveDirectorySearchScope";
|
public const string UpdateActiveDirectorySearchScope = "UpdateActiveDirectorySearchScope";
|
||||||
public const string UpdateActiveDirectorySearchAllForestServers = "UpdateActiveDirectorySearchAllForestServers";
|
public const string UpdateActiveDirectorySearchAllServers = "UpdateActiveDirectorySearchAllServers";
|
||||||
public const string UpdateActiveDirectorySearchWildcardSuffixOnly = "UpdateActiveDirectorySearchWildcardSuffixOnly";
|
public const string UpdateActiveDirectorySearchWildcardSuffixOnly = "UpdateActiveDirectorySearchWildcardSuffixOnly";
|
||||||
public const string DomainOrganisationalUnits = "DomainOrganisationalUnits";
|
public const string DomainOrganisationalUnits = "DomainOrganisationalUnits";
|
||||||
public const string SearchSubjects = "SearchSubjects";
|
public const string SearchSubjects = "SearchSubjects";
|
||||||
@@ -247,13 +247,13 @@ namespace Disco.Web.Areas.API.Controllers
|
|||||||
public readonly string Containers = "Containers";
|
public readonly string Containers = "Containers";
|
||||||
public readonly string redirect = "redirect";
|
public readonly string redirect = "redirect";
|
||||||
}
|
}
|
||||||
static readonly ActionParamsClass_UpdateActiveDirectorySearchAllForestServers s_params_UpdateActiveDirectorySearchAllForestServers = new ActionParamsClass_UpdateActiveDirectorySearchAllForestServers();
|
static readonly ActionParamsClass_UpdateActiveDirectorySearchAllServers s_params_UpdateActiveDirectorySearchAllServers = new ActionParamsClass_UpdateActiveDirectorySearchAllServers();
|
||||||
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
public ActionParamsClass_UpdateActiveDirectorySearchAllForestServers UpdateActiveDirectorySearchAllForestServersParams { get { return s_params_UpdateActiveDirectorySearchAllForestServers; } }
|
public ActionParamsClass_UpdateActiveDirectorySearchAllServers UpdateActiveDirectorySearchAllServersParams { get { return s_params_UpdateActiveDirectorySearchAllServers; } }
|
||||||
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
public class ActionParamsClass_UpdateActiveDirectorySearchAllForestServers
|
public class ActionParamsClass_UpdateActiveDirectorySearchAllServers
|
||||||
{
|
{
|
||||||
public readonly string SearchAllForestServers = "SearchAllForestServers";
|
public readonly string SearchAllServers = "SearchAllServers";
|
||||||
public readonly string redirect = "redirect";
|
public readonly string redirect = "redirect";
|
||||||
}
|
}
|
||||||
static readonly ActionParamsClass_UpdateActiveDirectorySearchWildcardSuffixOnly s_params_UpdateActiveDirectorySearchWildcardSuffixOnly = new ActionParamsClass_UpdateActiveDirectorySearchWildcardSuffixOnly();
|
static readonly ActionParamsClass_UpdateActiveDirectorySearchWildcardSuffixOnly s_params_UpdateActiveDirectorySearchWildcardSuffixOnly = new ActionParamsClass_UpdateActiveDirectorySearchWildcardSuffixOnly();
|
||||||
@@ -467,15 +467,15 @@ namespace Disco.Web.Areas.API.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
[NonAction]
|
[NonAction]
|
||||||
partial void UpdateActiveDirectorySearchAllForestServersOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, bool SearchAllForestServers, bool redirect);
|
partial void UpdateActiveDirectorySearchAllServersOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, bool SearchAllServers, bool redirect);
|
||||||
|
|
||||||
[NonAction]
|
[NonAction]
|
||||||
public override System.Web.Mvc.ActionResult UpdateActiveDirectorySearchAllForestServers(bool SearchAllForestServers, bool redirect)
|
public override System.Web.Mvc.ActionResult UpdateActiveDirectorySearchAllServers(bool SearchAllServers, bool redirect)
|
||||||
{
|
{
|
||||||
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateActiveDirectorySearchAllForestServers);
|
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateActiveDirectorySearchAllServers);
|
||||||
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "SearchAllForestServers", SearchAllForestServers);
|
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "SearchAllServers", SearchAllServers);
|
||||||
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "redirect", redirect);
|
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "redirect", redirect);
|
||||||
UpdateActiveDirectorySearchAllForestServersOverride(callInfo, SearchAllForestServers, redirect);
|
UpdateActiveDirectorySearchAllServersOverride(callInfo, SearchAllServers, redirect);
|
||||||
return callInfo;
|
return callInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user