using Disco.Plugins.ADCompare.Features; using Disco.Services.Plugins; using System; using System.Linq; using System.Text; using System.Web; using System.Web.Mvc; namespace Disco.Plugins.ADCompare.WebHandler { public class ADCompareWebHandler : PluginWebHandler { public override ActionResult ExecuteAction(string ActionName) { var action = ActionName != null ? ActionName.ToLower() : ""; switch (action) { case "": case "index": return Index(); case "run": return Run(); case "export": return ExportCsv(); default: return new HttpNotFoundResult(); } } private ActionResult Index() { return HtmlResult(BuildPage(null)); } private ActionResult Run() { var service = new DeviceCompareService(Database); var summary = service.CompareAllDevices(); return HtmlResult(BuildPage(summary)); } private ActionResult ExportCsv() { var service = new DeviceCompareService(Database); var summary = service.CompareAllDevices(); var sb = new StringBuilder(); sb.AppendLine("SerialNumber,ComputerName,DiscoAssignedUser,DiscoAssignedUserName,ADManagedBy,Match,Reason"); foreach (var r in summary.Results.Where(r => !r.IsMatch)) { sb.AppendLine(string.Join(",", CsvEsc(r.SerialNumber), CsvEsc(r.ComputerName), CsvEsc(r.DiscoAssignedUserId), CsvEsc(r.DiscoAssignedUserDisplayName), CsvEsc(r.ADManagedByDisplayName), r.IsMatch.ToString(), CsvEsc(r.MismatchReason))); } var fileName = "AD_ManagedBy_Compare_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".csv"; HostController.Response.Headers.Add("Content-Disposition", "attachment; filename=\"" + fileName + "\""); return new ContentResult { Content = sb.ToString(), ContentType = "text/csv", ContentEncoding = Encoding.UTF8 }; } private ActionResult HtmlResult(string html) { return new ContentResult { Content = html, ContentType = "text/html", ContentEncoding = Encoding.UTF8 }; } private string CsvEsc(string v) { if (v == null) v = ""; return "\"" + v.Replace("\"", "\"\"") + "\""; } private string H(string v) { if (string.IsNullOrEmpty(v)) return ""; return HttpUtility.HtmlEncode(v); } private string BuildPage(Models.DeviceComparisonSummary summary) { var pluginUrl = "/Plugin/Disco.Plugins.ADCompare"; var sb = new StringBuilder(); sb.Append(""); sb.Append("AD Compare - Device Managed By"); sb.Append(""); sb.Append("

AD Compare — Device Managed By

"); sb.Append("

Compares the AD computer Managed By field against the Disco Assigned User for domain-joined devices found in AD.

"); sb.Append("
"); sb.Append("↻ Run Comparison"); if (summary != null) { sb.Append("⬇ Export Mismatches CSV"); } sb.Append("
"); if (summary != null) { // Summary stats - only devices found in AD sb.Append("
"); sb.Append("
" + summary.TotalDevices + "
Devices Checked
"); sb.Append("
" + summary.DevicesMatched + "
Matched
"); sb.Append("
" + summary.DevicesMismatched + "
Mismatched
"); sb.Append("
" + summary.DevicesNoManagedBy + "
No ManagedBy
"); sb.Append("
" + summary.DevicesNoAssignment + "
No Assignment
"); sb.Append("
"); // Info bar for filtered items if (summary.DevicesNotInAD > 0 || summary.SkippedDevices > 0) { sb.Append("
"); sb.Append("Filtered out: "); if (summary.DevicesNotInAD > 0) { sb.Append(summary.DevicesNotInAD + " device(s) not found in AD"); } if (summary.DevicesNotInAD > 0 && summary.SkippedDevices > 0) { sb.Append(", "); } if (summary.SkippedDevices > 0) { sb.Append(summary.SkippedDevices + " device(s) without valid domain ID"); } sb.Append("
"); } // Results table - mismatches only (all results are AD-found devices) var mismatches = summary.Results.Where(r => !r.IsMatch).ToList(); if (mismatches.Count == 0) { sb.Append("
"); sb.Append("✓ All devices match! Every device found in AD has its Managed By matching the Disco assigned user."); sb.Append("
"); } else { sb.Append("

Mismatches (" + mismatches.Count + ")

"); sb.Append(""); sb.Append(""); sb.Append(""); sb.Append(""); foreach (var r in mismatches) { string discoUser = !string.IsNullOrEmpty(r.DiscoAssignedUserId) ? H(r.DiscoAssignedUserId) + (r.DiscoAssignedUserDisplayName != null ? "
" + H(r.DiscoAssignedUserDisplayName) + "" : "") : "Not assigned"; string adUser = !string.IsNullOrEmpty(r.ADManagedByDisplayName) ? H(r.ADManagedByDisplayName) : "Empty"; sb.Append(""); sb.Append(""); sb.Append(""); sb.Append(""); sb.Append(""); sb.Append(""); sb.Append(""); } sb.Append("
Serial NumberComputer NameDisco Assigned UserAD Managed ByReason
" + H(r.SerialNumber) + "" + H(r.ComputerName) + "" + discoUser + "" + adUser + "" + H(r.MismatchReason) + "
"); } } sb.Append(""); return sb.ToString(); } } }