diff --git a/WebHandler/ADCompareWebHandler.cs b/WebHandler/ADCompareWebHandler.cs index 7a11cbc..b0ae947 100644 --- a/WebHandler/ADCompareWebHandler.cs +++ b/WebHandler/ADCompareWebHandler.cs @@ -44,13 +44,13 @@ namespace Disco.Plugins.ADCompare.WebHandler var service = new DeviceCompareService(Database); var summary = service.CompareAllDevices(); var sb = new StringBuilder(); - sb.AppendLine("SerialNumber,ComputerName,DiscoAssignedUser,DiscoAssignedUserName,ADManagedByUser,ADManagedByName,Match,Reason"); + 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.ADManagedByUserId), CsvEsc(r.ADManagedByDisplayName), + CsvEsc(r.ADManagedByDisplayName), r.IsMatch.ToString(), CsvEsc(r.MismatchReason))); } var fileName = "AD_ManagedBy_Compare_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".csv"; @@ -103,14 +103,15 @@ namespace Disco.Plugins.ADCompare.WebHandler sb.Append(".green{color:#5cb85c;} .orange{color:#f0ad4e;} .red{color:#d9534f;} .blue{color:#5bc0de;} .grey{color:#999;}"); sb.Append("table{width:100%;border-collapse:collapse;margin-top:10px;} th{background:#f5f5f5;text-align:left;padding:8px;border-bottom:2px solid #ddd;}"); sb.Append("td{padding:8px;border-bottom:1px solid #eee;} tr:hover{background:#f9f9f9;}"); - sb.Append(".warn-row{background:#fcf8e3;} .danger-row{background:#f2dede;}"); + sb.Append(".warn-row{background:#fcf8e3;}"); sb.Append(".badge{display:inline-block;padding:2px 8px;border-radius:10px;font-size:11px;color:#fff;}"); - sb.Append(".badge-warn{background:#f0ad4e;} .badge-err{background:#d9534f;}"); + sb.Append(".badge-warn{background:#f0ad4e;}"); sb.Append(".muted{color:#999;font-style:italic;} .small{font-size:12px;color:#888;}"); + sb.Append(".info-bar{margin:10px 0;padding:8px 12px;background:#d9edf7;border-radius:4px;font-size:13px;color:#31708f;}"); 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("

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"); @@ -122,61 +123,64 @@ namespace Disco.Plugins.ADCompare.WebHandler if (summary != null) { + // Summary stats - only devices found in AD sb.Append("
"); - sb.Append("
" + summary.TotalDevices + "
Total Devices
"); + sb.Append("
" + summary.TotalDevices + "
Devices Checked
"); 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("
"); + // 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's Disco assigned user matches the AD Managed By field."); + 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(""); 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"; - } + string adUser = !string.IsNullOrEmpty(r.ADManagedByDisplayName) + ? H(r.ADManagedByDisplayName) + : "Empty"; - sb.Append(""); - sb.Append(""); + sb.Append(""); sb.Append(""); sb.Append(""); sb.Append("");
StatusSerial NumberComputer NameSerial NumberComputer NameDisco Assigned UserAD Managed ByReason
" + badge + "
" + H(r.SerialNumber) + "" + H(r.ComputerName) + "" + discoUser + "