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,ADManagedByUser,ADManagedByName,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.ADManagedByUserId), 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.

"); sb.Append("
"); sb.Append("↻ Run Comparison"); if (summary != null) { sb.Append("⬇ Export Mismatches CSV"); } sb.Append("
"); if (summary != null) { sb.Append("
"); sb.Append("
" + summary.TotalDevices + "
Total Devices
"); sb.Append("
" + summary.DevicesMatched + "
Matched
"); sb.Append("
" + summary.DevicesMismatched + "
Mismatched
"); sb.Append("
" + summary.DevicesNotInAD + "
Not in AD
"); sb.Append("
" + summary.DevicesNoManagedBy + "
No ManagedBy
"); sb.Append("
" + summary.DevicesNoAssignment + "
No Assignment
"); sb.Append("
"); var mismatches = summary.Results.Where(r => !r.IsMatch).ToList(); if (mismatches.Count == 0) { sb.Append("
"); sb.Append("✓ All devices match! Every device's Disco assigned user matches the AD Managed By field."); sb.Append("
"); } else { sb.Append("

Mismatches (" + mismatches.Count + ")

"); sb.Append(""); sb.Append(""); sb.Append(""); sb.Append(""); foreach (var r in mismatches) { string rowClass = r.FoundInAD ? "warn-row" : "danger-row"; string badge = r.FoundInAD ? "Mismatch" : "Not in AD"; string discoUser = !string.IsNullOrEmpty(r.DiscoAssignedUserId) ? H(r.DiscoAssignedUserId) + (r.DiscoAssignedUserDisplayName != null ? "
" + H(r.DiscoAssignedUserDisplayName) + "" : "") : "Not assigned"; string adUser; if (!string.IsNullOrEmpty(r.ADManagedByUserId)) { adUser = H(r.ADManagedByUserId); if (r.ADManagedByDisplayName != null) adUser = adUser + "
" + H(r.ADManagedByDisplayName) + ""; } else if (r.FoundInAD) { adUser = "Empty"; } else { adUser = "N/A"; } sb.Append(""); sb.Append(""); sb.Append(""); sb.Append(""); sb.Append(""); sb.Append(""); sb.Append(""); sb.Append(""); } sb.Append("
StatusSerial NumberComputer NameDisco Assigned UserAD Managed ByReason
" + badge + "" + H(r.SerialNumber) + "" + H(r.ComputerName) + "" + discoUser + "" + adUser + "" + H(r.MismatchReason) + "
"); } } sb.Append(""); return sb.ToString(); } } }