From e531ffe2b7c416404cff3c264f119ed2194b2d75 Mon Sep 17 00:00:00 2001 From: Gary Sharp Date: Thu, 26 Nov 2020 15:01:03 +1100 Subject: [PATCH] support active directory trust relationships --- .../Modules/ActiveDirectoryConfiguration.cs | 26 ++++ ...rForestServers.cs => ADDiscoverServers.cs} | 64 ++++----- .../ADNetworkLogonDatesUpdateTask.cs | 4 +- .../ActiveDirectory/ActiveDirectory.cs | 2 +- .../ActiveDirectory/ActiveDirectoryContext.cs | 86 ++++++++--- .../Areas/API/Controllers/SystemController.cs | 12 +- .../Config/Models/SystemConfig/IndexModel.cs | 20 +-- .../Config/Views/SystemConfig/Index.cshtml | 38 ++--- .../Views/SystemConfig/Index.generated.cs | 134 +++++++++--------- .../T4MVC/API.SystemController.generated.cs | 26 ++-- 10 files changed, 239 insertions(+), 173 deletions(-) rename Disco.Services/Interop/ActiveDirectory/{ADDiscoverForestServers.cs => ADDiscoverServers.cs} (50%) diff --git a/Disco.Data/Configuration/Modules/ActiveDirectoryConfiguration.cs b/Disco.Data/Configuration/Modules/ActiveDirectoryConfiguration.cs index f4f0e454..6736c8f6 100644 --- a/Disco.Data/Configuration/Modules/ActiveDirectoryConfiguration.cs +++ b/Disco.Data/Configuration/Modules/ActiveDirectoryConfiguration.cs @@ -1,5 +1,7 @@ using Disco.Data.Repository; +using System; using System.Collections.Generic; +using System.ComponentModel; namespace Disco.Data.Configuration.Modules { @@ -24,12 +26,36 @@ namespace Disco.Data.Configuration.Modules } } + [Obsolete("User SearchAllServers instead"), EditorBrowsable(EditorBrowsableState.Never)] public bool? SearchAllForestServers { get { return Get(null); } set { Set(value); } } + public bool? SearchAllServers + { + get { + var value = Get(null); + + /// migrate +#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); } + } + /// /// 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) diff --git a/Disco.Services/Interop/ActiveDirectory/ADDiscoverForestServers.cs b/Disco.Services/Interop/ActiveDirectory/ADDiscoverServers.cs similarity index 50% rename from Disco.Services/Interop/ActiveDirectory/ADDiscoverForestServers.cs rename to Disco.Services/Interop/ActiveDirectory/ADDiscoverServers.cs index 2aa26eb6..1a9ae48c 100644 --- a/Disco.Services/Interop/ActiveDirectory/ADDiscoverForestServers.cs +++ b/Disco.Services/Interop/ActiveDirectory/ADDiscoverServers.cs @@ -7,37 +7,37 @@ using System.Threading.Tasks; 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 CancelInitiallySupported { get { return false; } } - internal static List ForestServers { get; set; } + internal static List AllServers { get; set; } private static object _scheduleLock = new object(); protected override void ExecuteTask() { - var forestServers = DiscoverForestServers(); - ADDiscoverForestServers.ForestServers = forestServers; + var allServers = DiscoverAllServers(); + AllServers = allServers; - // Restrict Searching Entire Forest if to many servers + // Restrict Searching Entire Directory if to many servers using (DiscoDataContext Database = new DiscoDataContext()) { - var searchEntireForest = Database.DiscoConfiguration.ActiveDirectory.SearchAllForestServers; + var searchAllServers = Database.DiscoConfiguration.ActiveDirectory.SearchAllServers; // Check explicitly configured: No - if (!searchEntireForest.HasValue || searchEntireForest.Value) + if (!searchAllServers.HasValue || searchAllServers.Value) { // Not Configured, or explicitly configured: Yes - if (forestServers.Count > ActiveDirectory.MaxForestServerSearch) + if (allServers.Count > ActiveDirectory.MaxAllServerSearch) { // Update Database - Database.DiscoConfiguration.ActiveDirectory.SearchAllForestServers = false; + Database.DiscoConfiguration.ActiveDirectory.SearchAllServers = false; } else { // Default - Database.DiscoConfiguration.ActiveDirectory.SearchAllForestServers = true; + Database.DiscoConfiguration.ActiveDirectory.SearchAllServers = true; } Database.SaveChanges(); @@ -47,69 +47,67 @@ namespace Disco.Services.Interop.ActiveDirectory 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) return taskStatus; else { 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) return taskStatus; else { - var t = new ADDiscoverForestServers(); + var t = new ADDiscoverServers(); return t.ScheduleTask(); } } } } - public static List LoadForestServersBlocking() + public static List LoadAllServersSync() { - if (ADDiscoverForestServers.ForestServers != null) - return ADDiscoverForestServers.ForestServers; + if (AllServers != null) + return AllServers; ScheduledTaskStatus status; lock (_scheduleLock) { - if (ADDiscoverForestServers.ForestServers != null) - return ADDiscoverForestServers.ForestServers; + if (AllServers != null) + return AllServers; - status = ADDiscoverForestServers.ScheduleNow(); + status = ScheduleNow(); } status.CompletionTask.Wait(); - return ForestServers; + return AllServers; } - public static Task> LoadForestServersAsync() + public static Task> LoadAllServersAsync() { - if (ADDiscoverForestServers.ForestServers != null) - return Task.FromResult(ADDiscoverForestServers.ForestServers); + if (AllServers != null) + return Task.FromResult(AllServers); ScheduledTaskStatus status; lock (_scheduleLock) { - if (ADDiscoverForestServers.ForestServers != null) - return Task.FromResult(ADDiscoverForestServers.ForestServers); + if (AllServers != null) + return Task.FromResult(AllServers); - status = ADDiscoverForestServers.ScheduleNow(); + status = ScheduleNow(); } return status.CompletionTask.ContinueWith(t => { - return ADDiscoverForestServers.ForestServers; + return AllServers; }); } - private static List DiscoverForestServers() + private static List DiscoverAllServers() { - using (var computerDomain = Domain.GetComputerDomain()) - { - return computerDomain.Forest.Domains.Cast().SelectMany(d => d.FindAllDomainControllers().Cast()).Select(dc => dc.Name).ToList(); - } + return ActiveDirectory.Context.Domains + .SelectMany(d => d.Domain.FindAllDomainControllers().Cast().Select(dc => dc.Name)).ToList(); } } } diff --git a/Disco.Services/Interop/ActiveDirectory/ADNetworkLogonDatesUpdateTask.cs b/Disco.Services/Interop/ActiveDirectory/ADNetworkLogonDatesUpdateTask.cs index fe302aa9..ad966358 100644 --- a/Disco.Services/Interop/ActiveDirectory/ADNetworkLogonDatesUpdateTask.cs +++ b/Disco.Services/Interop/ActiveDirectory/ADNetworkLogonDatesUpdateTask.cs @@ -67,7 +67,7 @@ namespace Disco.Services.Interop.ActiveDirectory var ldapFilter = string.Format(ldapFilterTemplate, ADHelpers.EscapeLdapQuery(deviceSamAccountName)); IEnumerable domainControllers; - if (context.SearchAllForestServers) + if (context.SearchAllServers) domainControllers = deviceDomain.GetAllReachableDomainControllers(); else domainControllers = deviceDomain.GetReachableSiteDomainControllers(); @@ -122,7 +122,7 @@ namespace Disco.Services.Interop.ActiveDirectory // Determine Domain Controllers to Query IEnumerable>> serverQueries; - if (context.SearchAllForestServers) + if (context.SearchAllServers) serverQueries = domainQueries.SelectMany(q => q.Item1.GetAllReachableDomainControllers(), (q, dc) => Tuple.Create(q.Item1, dc, q.Item2)); else serverQueries = domainQueries.SelectMany(q => q.Item1.GetReachableSiteDomainControllers(), (q, dc) => Tuple.Create(q.Item1, dc, q.Item2)); diff --git a/Disco.Services/Interop/ActiveDirectory/ActiveDirectory.cs b/Disco.Services/Interop/ActiveDirectory/ActiveDirectory.cs index 5617e27d..9c851e66 100644 --- a/Disco.Services/Interop/ActiveDirectory/ActiveDirectory.cs +++ b/Disco.Services/Interop/ActiveDirectory/ActiveDirectory.cs @@ -11,7 +11,7 @@ namespace Disco.Services.Interop.ActiveDirectory { public const int SingleSearchResult = 1; public const int DefaultSearchResultLimit = 30; - public const int MaxForestServerSearch = 30; + public const int MaxAllServerSearch = 30; public const int DomainControllerUnavailableMinutes = 10; private static ActiveDirectoryContext context; diff --git a/Disco.Services/Interop/ActiveDirectory/ActiveDirectoryContext.cs b/Disco.Services/Interop/ActiveDirectory/ActiveDirectoryContext.cs index 675bd5c0..e04621f2 100644 --- a/Disco.Services/Interop/ActiveDirectory/ActiveDirectoryContext.cs +++ b/Disco.Services/Interop/ActiveDirectory/ActiveDirectoryContext.cs @@ -1,4 +1,5 @@ using Disco.Data.Repository; +using Disco.Services.Logging; using System; using System.Collections.Generic; using System.DirectoryServices.ActiveDirectory; @@ -15,24 +16,24 @@ namespace Disco.Services.Interop.ActiveDirectory public List Domains { get; private set; } public ActiveDirectoryManagedGroups ManagedGroups { get; private set; } - public List ForestServers + public List AllServers { get { - return ADDiscoverForestServers.LoadForestServersBlocking(); + return ADDiscoverServers.LoadAllServersSync(); } } - private bool _SearchAllForestServers { get; set; } - public bool SearchAllForestServers + private bool searchAllServers { get; set; } + public bool SearchAllServers { get { - var fs = ADDiscoverForestServers.ForestServers; - if (fs != null && fs.Count > ActiveDirectory.MaxForestServerSearch) + var fs = ADDiscoverServers.AllServers; + if (fs != null && fs.Count > ActiveDirectory.MaxAllServerSearch) return false; // Never - return _SearchAllForestServers; + return searchAllServers; } } @@ -50,8 +51,8 @@ namespace Disco.Services.Interop.ActiveDirectory private void Initialize(DiscoDataContext Database) { - // Search Entire Forest (default: true) - _SearchAllForestServers = Database.DiscoConfiguration.ActiveDirectory.SearchAllForestServers ?? true; + // Search Entire Directory (default: true) + searchAllServers = Database.DiscoConfiguration.ActiveDirectory.SearchAllServers ?? true; // Set Search LDAP Filters InitializeWildcardSearchSufixOnly(Database.DiscoConfiguration.ActiveDirectory.SearchWildcardSuffixOnly); @@ -62,11 +63,52 @@ namespace Disco.Services.Interop.ActiveDirectory // Determine Domains var computerDomain = Domain.GetComputerDomain(); - Domains = computerDomain.Forest.Domains + var domains = computerDomain.Forest.Domains .Cast() .Select(d => new ADDomain(this, d)) .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 ReinitializeSearchContainers(Database.DiscoConfiguration.ActiveDirectory.SearchContainers); @@ -180,7 +222,7 @@ namespace Disco.Services.Interop.ActiveDirectory #region Searching - public IEnumerable SearchEntireForest(string LdapFilter, string[] LoadProperties, int? ResultLimit = null) + public IEnumerable SearchEntireDirectory(string LdapFilter, string[] LoadProperties, int? ResultLimit = null) { 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; - _SearchAllForestServers = false; + Database.DiscoConfiguration.ActiveDirectory.SearchAllServers = false; + searchAllServers = false; return true; } else { - var forestServers = ADDiscoverForestServers.LoadForestServersBlocking(); - if (forestServers.Count <= ActiveDirectory.MaxForestServerSearch) + var allServers = ADDiscoverServers.LoadAllServersSync(); + if (allServers.Count <= ActiveDirectory.MaxAllServerSearch) { - Database.DiscoConfiguration.ActiveDirectory.SearchAllForestServers = true; - _SearchAllForestServers = true; + Database.DiscoConfiguration.ActiveDirectory.SearchAllServers = true; + searchAllServers = true; return true; } else { - Database.DiscoConfiguration.ActiveDirectory.SearchAllForestServers = false; - _SearchAllForestServers = false; + Database.DiscoConfiguration.ActiveDirectory.SearchAllServers = false; + searchAllServers = false; return false; } } diff --git a/Disco.Web/Areas/API/Controllers/SystemController.cs b/Disco.Web/Areas/API/Controllers/SystemController.cs index 61c81c3c..a9a4c358 100644 --- a/Disco.Web/Areas/API/Controllers/SystemController.cs +++ b/Disco.Web/Areas/API/Controllers/SystemController.cs @@ -219,21 +219,21 @@ namespace Disco.Web.Areas.API.Controllers } [DiscoAuthorize(Claims.Config.System.ConfigureActiveDirectory)] - public virtual ActionResult UpdateActiveDirectorySearchAllForestServers(bool SearchAllForestServers, bool redirect = false) + public virtual ActionResult UpdateActiveDirectorySearchAllServers(bool SearchAllServers, bool redirect = false) { try { - var result = ActiveDirectory.Context.UpdateSearchAllForestServers(Database, SearchAllForestServers); + var result = ActiveDirectory.Context.UpdateSearchAllServers(Database, SearchAllServers); Database.SaveChanges(); if (!result) { - var forestServers = ActiveDirectory.Context.ForestServers; - if (forestServers.Count > ActiveDirectory.MaxForestServerSearch) - throw new InvalidOperationException(string.Format("This forest contains more than the Max Forest Server Search restriction ({0})", ActiveDirectory.MaxForestServerSearch)); + var allServers = ActiveDirectory.Context.AllServers; + if (allServers.Count > ActiveDirectory.MaxAllServerSearch) + throw new InvalidOperationException($"This directory contains more than the Max Server Search restriction ({ActiveDirectory.MaxAllServerSearch})"); 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) diff --git a/Disco.Web/Areas/Config/Models/SystemConfig/IndexModel.cs b/Disco.Web/Areas/Config/Models/SystemConfig/IndexModel.cs index 8a141da8..95c59c2e 100644 --- a/Disco.Web/Areas/Config/Models/SystemConfig/IndexModel.cs +++ b/Disco.Web/Areas/Config/Models/SystemConfig/IndexModel.cs @@ -76,8 +76,8 @@ namespace Disco.Web.Areas.Config.Models.SystemConfig #region Active Directory - [Display(Name="Search All Forest Servers")] - public bool ADSearchAllForestServers { get; set; } + [Display(Name="Search All Servers")] + public bool ADSearchAllServers { get; set; } public List ADDomains { get; set; } public ADDomain ADPrimaryDomain { get; set; } @@ -86,7 +86,7 @@ namespace Disco.Web.Areas.Config.Models.SystemConfig public List> ADSearchContainers { get; set; } [Display(Name = "Search With Suffix Wildcard Only")] public bool ADSearchWildcardSuffixOnly { get; set; } - public List ADForestServers { get; set; } + public List ADAllServers { get; set; } #endregion @@ -136,17 +136,17 @@ namespace Disco.Web.Areas.Config.Models.SystemConfig return Tuple.Create(c, domain, domain.FriendlyDistinguishedNamePath(c)); }).ToList(); - var loadForestServersTask = ADDiscoverForestServers.LoadForestServersAsync(); - if (loadForestServersTask.Wait(TimeSpan.FromSeconds(1))) + var loadAllServersTask = ADDiscoverServers.LoadAllServersAsync(); + if (loadAllServersTask.Wait(TimeSpan.FromSeconds(1))) { - m.ADForestServers = loadForestServersTask.Result; - var configValue = config.ActiveDirectory.SearchAllForestServers ?? true; - m.ADSearchAllForestServers = configValue && m.ADForestServers.Count <= ActiveDirectory.MaxForestServerSearch; + m.ADAllServers = loadAllServersTask.Result; + var configValue = config.ActiveDirectory.SearchAllServers ?? true; + m.ADSearchAllServers = configValue && m.ADAllServers.Count <= ActiveDirectory.MaxAllServerSearch; } else { - m.ADForestServers = null; - m.ADSearchAllForestServers = config.ActiveDirectory.SearchAllForestServers ?? true; + m.ADAllServers = null; + m.ADSearchAllServers = config.ActiveDirectory.SearchAllServers ?? true; } return m; diff --git a/Disco.Web/Areas/Config/Views/SystemConfig/Index.cshtml b/Disco.Web/Areas/Config/Views/SystemConfig/Index.cshtml index e102f38c..72b2e161 100644 --- a/Disco.Web/Areas/Config/Views/SystemConfig/Index.cshtml +++ b/Disco.Web/Areas/Config/Views/SystemConfig/Index.cshtml @@ -241,17 +241,17 @@ - Forest: + Directory: - @if (Model.ADForestServers == null) + @if (Model.ADAllServers == null) {
- @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)

- Forest servers are currently being retrieved.
+ Directory servers are currently being retrieved.
Try refreshing this page in a moment.

@@ -260,28 +260,28 @@ { if (canConfigAD) { - var canSearchEntireForest = (Model.ADForestServers.Count <= Disco.Services.Interop.ActiveDirectory.ActiveDirectory.MaxForestServerSearch); + var canSearchEntireDirectory = (Model.ADAllServers.Count <= Disco.Services.Interop.ActiveDirectory.ActiveDirectory.MaxAllServerSearch);
- @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)

- 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. + 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.

} 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()

- If this setting is enabled, Disco will query all servers within the forest rather than only servers within this site. + If this setting is enabled, Disco will query all servers within the directory rather than only servers within this site.

} @@ -290,10 +290,10 @@ else {
- @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)

- If this setting is enabled, Disco will query all servers within the forest rather than only servers within this site. + If this setting is enabled, Disco will query all servers within the directory rather than only servers within this site.

@@ -301,12 +301,12 @@

All Servers: -
    +
      @{ 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; if (server.Contains('.')) { @@ -317,7 +317,7 @@ } }
    • - @serverDescription@if (isSiteServer) + @serverDescription@if (siteServers.ContainsKey(server)) { }
    • } @@ -326,7 +326,7 @@ \r\n"); +WriteLiteral("\', \'SearchAllServers\');\r\n });\r\n " + +" \r\n"); #line 287 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml" @@ -1081,7 +1081,7 @@ WriteLiteral(" "); #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 @@ -1090,7 +1090,7 @@ WriteLiteral(" "); #line 293 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml" - Write(Html.LabelFor(m => m.ADSearchAllForestServers)); + Write(Html.LabelFor(m => m.ADSearchAllServers)); #line default @@ -1107,9 +1107,9 @@ WriteLiteral(">\r\n If this setting is enabled, Disco will query all servers within the forest r" + -"ather than only servers within this site.\r\n

      \r" + -"\n
\r\n
\r\n"); +WriteLiteral(">If this setting is enabled, Disco will query all servers within the director" + +"y rather than only servers within this site.\r\n \r\n \r\n \r\n"); #line 300 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml" @@ -1121,7 +1121,7 @@ WriteLiteral(">If this setting is enabled, Disco will query all servers with WriteLiteral("
\r\n
\r\n " + " All Servers:\r\n \r\n"); #line 305 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml" 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; if (server.Contains('.')) { @@ -1167,7 +1167,7 @@ WriteLiteral(""); #line 320 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml" - if (isSiteServer) + if (siteServers.ContainsKey(server)) { #line default @@ -1201,7 +1201,7 @@ WriteLiteral(@" \r\n"); +"ion\', \'buttons\', {\r\n \'Search Entire D" + +"irectory\': function () {\r\n var $t" + +"his = $(this);\r\n $this.css(\'overf" + +"low\', \'hidden\');\r\n $this.dialog(\"" + +"disable\");\r\n $this.dialog(\"option" + +"\", \"buttons\", null);\r\n\r\n var $for" + +"m = $dialog.find(\'form\');\r\n $form" + +".submit();\r\n },\r\n " + +" \'Save\': function () {\r\n " + +" var $this = $(this);\r\n " + +" $this.css(\'overflow\', \'hidden\');\r\n " + +" $this.dialog(\"disable\");\r\n " + +" $this.dialog(\"option\", \"buttons\", null);\r\n\r\n " + +" var nodes = tree.getSelectedNodes();\r\n " + +" var $form = $dialog.find(\'form\');\r\n " + +" $.each(nodes, function (i, node) {\r\n " + +" $(\'\').attr({ \'type\': \'hidden\', \'name\': \'Con" + +"tainers\', \'value\': node.key }).appendTo($form);\r\n " + +" });\r\n $form.subm" + +"it();\r\n }\r\n " + +" });\r\n\r\n // Select & Expand\r" + +"\n selectDistinguishedNames();\r\n\r\n " + +" tree.options.fx = { height: \"toggle\", duration: " + +"200 };\r\n });\r\n\r\n " + +" }\r\n\r\n selectDistinguishedNames();\r\n\r\n " + +" $dialog.dialog(\'open\');\r\n\r\n " + +" return false;\r\n }\r\n\r\n $(" + +"\'#Config_System_AD_SearchScope_Update\').click(update);\r\n " + +"});\r\n \r\n"); #line 532 "..\..\Areas\Config\Views\SystemConfig\Index.cshtml" diff --git a/Disco.Web/Extensions/T4MVC/API.SystemController.generated.cs b/Disco.Web/Extensions/T4MVC/API.SystemController.generated.cs index ddb3cdd7..4fe45623 100644 --- a/Disco.Web/Extensions/T4MVC/API.SystemController.generated.cs +++ b/Disco.Web/Extensions/T4MVC/API.SystemController.generated.cs @@ -89,9 +89,9 @@ namespace Disco.Web.Areas.API.Controllers } [NonAction] [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] [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] @@ -155,7 +155,7 @@ namespace Disco.Web.Areas.API.Controllers public readonly string DeleteOrganisationAddress = "DeleteOrganisationAddress"; public readonly string UpdateMultiSiteMode = "UpdateMultiSiteMode"; public readonly string UpdateActiveDirectorySearchScope = "UpdateActiveDirectorySearchScope"; - public readonly string UpdateActiveDirectorySearchAllForestServers = "UpdateActiveDirectorySearchAllForestServers"; + public readonly string UpdateActiveDirectorySearchAllServers = "UpdateActiveDirectorySearchAllServers"; public readonly string UpdateActiveDirectorySearchWildcardSuffixOnly = "UpdateActiveDirectorySearchWildcardSuffixOnly"; public readonly string DomainOrganisationalUnits = "DomainOrganisationalUnits"; public readonly string SearchSubjects = "SearchSubjects"; @@ -178,7 +178,7 @@ namespace Disco.Web.Areas.API.Controllers public const string DeleteOrganisationAddress = "DeleteOrganisationAddress"; public const string UpdateMultiSiteMode = "UpdateMultiSiteMode"; public const string UpdateActiveDirectorySearchScope = "UpdateActiveDirectorySearchScope"; - public const string UpdateActiveDirectorySearchAllForestServers = "UpdateActiveDirectorySearchAllForestServers"; + public const string UpdateActiveDirectorySearchAllServers = "UpdateActiveDirectorySearchAllServers"; public const string UpdateActiveDirectorySearchWildcardSuffixOnly = "UpdateActiveDirectorySearchWildcardSuffixOnly"; public const string DomainOrganisationalUnits = "DomainOrganisationalUnits"; public const string SearchSubjects = "SearchSubjects"; @@ -247,13 +247,13 @@ namespace Disco.Web.Areas.API.Controllers public readonly string Containers = "Containers"; 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] - public ActionParamsClass_UpdateActiveDirectorySearchAllForestServers UpdateActiveDirectorySearchAllForestServersParams { get { return s_params_UpdateActiveDirectorySearchAllForestServers; } } + public ActionParamsClass_UpdateActiveDirectorySearchAllServers UpdateActiveDirectorySearchAllServersParams { get { return s_params_UpdateActiveDirectorySearchAllServers; } } [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"; } static readonly ActionParamsClass_UpdateActiveDirectorySearchWildcardSuffixOnly s_params_UpdateActiveDirectorySearchWildcardSuffixOnly = new ActionParamsClass_UpdateActiveDirectorySearchWildcardSuffixOnly(); @@ -467,15 +467,15 @@ namespace Disco.Web.Areas.API.Controllers } [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] - 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); - ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "SearchAllForestServers", SearchAllForestServers); + var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateActiveDirectorySearchAllServers); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "SearchAllServers", SearchAllServers); ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "redirect", redirect); - UpdateActiveDirectorySearchAllForestServersOverride(callInfo, SearchAllForestServers, redirect); + UpdateActiveDirectorySearchAllServersOverride(callInfo, SearchAllServers, redirect); return callInfo; }