support active directory trust relationships

This commit is contained in:
Gary Sharp
2020-11-26 15:01:03 +11:00
parent 4fca015afa
commit e531ffe2b7
10 changed files with 239 additions and 173 deletions
@@ -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)
@@ -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;
} }