Files
Disco/Disco.Services/Interop/ActiveDirectory/ADDiscoverServers.cs
T
2020-11-26 15:01:03 +11:00

114 lines
3.8 KiB
C#

using Disco.Data.Repository;
using Disco.Services.Tasks;
using System.Collections.Generic;
using System.DirectoryServices.ActiveDirectory;
using System.Linq;
using System.Threading.Tasks;
namespace Disco.Services.Interop.ActiveDirectory
{
public class ADDiscoverServers : ScheduledTask
{
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<string> AllServers { get; set; }
private static object _scheduleLock = new object();
protected override void ExecuteTask()
{
var allServers = DiscoverAllServers();
AllServers = allServers;
// Restrict Searching Entire Directory if to many servers
using (DiscoDataContext Database = new DiscoDataContext())
{
var searchAllServers = Database.DiscoConfiguration.ActiveDirectory.SearchAllServers;
// Check explicitly configured: No
if (!searchAllServers.HasValue || searchAllServers.Value)
{
// Not Configured, or explicitly configured: Yes
if (allServers.Count > ActiveDirectory.MaxAllServerSearch)
{
// Update Database
Database.DiscoConfiguration.ActiveDirectory.SearchAllServers = false;
}
else
{
// Default
Database.DiscoConfiguration.ActiveDirectory.SearchAllServers = true;
}
Database.SaveChanges();
}
}
}
internal static ScheduledTaskStatus ScheduleNow()
{
var taskStatus = ScheduledTasks.GetTaskStatuses(typeof(ADDiscoverServers)).Where(ts => ts.IsRunning).FirstOrDefault();
if (taskStatus != null)
return taskStatus;
else
{
lock (_scheduleLock)
{
taskStatus = ScheduledTasks.GetTaskStatuses(typeof(ADDiscoverServers)).Where(ts => ts.IsRunning).FirstOrDefault();
if (taskStatus != null)
return taskStatus;
else
{
var t = new ADDiscoverServers();
return t.ScheduleTask();
}
}
}
}
public static List<string> LoadAllServersSync()
{
if (AllServers != null)
return AllServers;
ScheduledTaskStatus status;
lock (_scheduleLock)
{
if (AllServers != null)
return AllServers;
status = ScheduleNow();
}
status.CompletionTask.Wait();
return AllServers;
}
public static Task<List<string>> LoadAllServersAsync()
{
if (AllServers != null)
return Task.FromResult(AllServers);
ScheduledTaskStatus status;
lock (_scheduleLock)
{
if (AllServers != null)
return Task.FromResult(AllServers);
status = ScheduleNow();
}
return status.CompletionTask.ContinueWith(t =>
{
return AllServers;
});
}
private static List<string> DiscoverAllServers()
{
return ActiveDirectory.Context.Domains
.SelectMany(d => d.Domain.FindAllDomainControllers().Cast<DomainController>().Select(dc => dc.Name)).ToList();
}
}
}