v1.2.1 - Show only AD-found devices, info bar for filtered counts
This commit is contained in:
@@ -44,13 +44,13 @@ namespace Disco.Plugins.ADCompare.WebHandler
|
|||||||
var service = new DeviceCompareService(Database);
|
var service = new DeviceCompareService(Database);
|
||||||
var summary = service.CompareAllDevices();
|
var summary = service.CompareAllDevices();
|
||||||
var sb = new StringBuilder();
|
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))
|
foreach (var r in summary.Results.Where(r => !r.IsMatch))
|
||||||
{
|
{
|
||||||
sb.AppendLine(string.Join(",",
|
sb.AppendLine(string.Join(",",
|
||||||
CsvEsc(r.SerialNumber), CsvEsc(r.ComputerName),
|
CsvEsc(r.SerialNumber), CsvEsc(r.ComputerName),
|
||||||
CsvEsc(r.DiscoAssignedUserId), CsvEsc(r.DiscoAssignedUserDisplayName),
|
CsvEsc(r.DiscoAssignedUserId), CsvEsc(r.DiscoAssignedUserDisplayName),
|
||||||
CsvEsc(r.ADManagedByUserId), CsvEsc(r.ADManagedByDisplayName),
|
CsvEsc(r.ADManagedByDisplayName),
|
||||||
r.IsMatch.ToString(), CsvEsc(r.MismatchReason)));
|
r.IsMatch.ToString(), CsvEsc(r.MismatchReason)));
|
||||||
}
|
}
|
||||||
var fileName = "AD_ManagedBy_Compare_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".csv";
|
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(".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("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("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{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(".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("</style></head><body>");
|
sb.Append("</style></head><body>");
|
||||||
|
|
||||||
sb.Append("<h2>AD Compare — Device Managed By</h2>");
|
sb.Append("<h2>AD Compare — Device Managed By</h2>");
|
||||||
sb.Append("<p>Compares the AD computer <strong>Managed By</strong> field against the Disco <strong>Assigned User</strong>.</p>");
|
sb.Append("<p>Compares the AD computer <strong>Managed By</strong> field against the Disco <strong>Assigned User</strong> for domain-joined devices found in AD.</p>");
|
||||||
|
|
||||||
sb.Append("<div style='margin:15px 0;'>");
|
sb.Append("<div style='margin:15px 0;'>");
|
||||||
sb.Append("<a href='" + pluginUrl + "/Run' class='btn btn-primary'>↻ Run Comparison</a>");
|
sb.Append("<a href='" + pluginUrl + "/Run' class='btn btn-primary'>↻ Run Comparison</a>");
|
||||||
@@ -122,61 +123,64 @@ namespace Disco.Plugins.ADCompare.WebHandler
|
|||||||
|
|
||||||
if (summary != null)
|
if (summary != null)
|
||||||
{
|
{
|
||||||
|
// Summary stats - only devices found in AD
|
||||||
sb.Append("<div class='summary'>");
|
sb.Append("<div class='summary'>");
|
||||||
sb.Append("<div class='stat'><div class='num'>" + summary.TotalDevices + "</div><div class='lbl'>Total Devices</div></div>");
|
sb.Append("<div class='stat'><div class='num'>" + summary.TotalDevices + "</div><div class='lbl'>Devices Checked</div></div>");
|
||||||
sb.Append("<div class='stat'><div class='num green'>" + summary.DevicesMatched + "</div><div class='lbl'>Matched</div></div>");
|
sb.Append("<div class='stat'><div class='num green'>" + summary.DevicesMatched + "</div><div class='lbl'>Matched</div></div>");
|
||||||
sb.Append("<div class='stat'><div class='num orange'>" + summary.DevicesMismatched + "</div><div class='lbl'>Mismatched</div></div>");
|
sb.Append("<div class='stat'><div class='num orange'>" + summary.DevicesMismatched + "</div><div class='lbl'>Mismatched</div></div>");
|
||||||
sb.Append("<div class='stat'><div class='num red'>" + summary.DevicesNotInAD + "</div><div class='lbl'>Not in AD</div></div>");
|
|
||||||
sb.Append("<div class='stat'><div class='num blue'>" + summary.DevicesNoManagedBy + "</div><div class='lbl'>No ManagedBy</div></div>");
|
sb.Append("<div class='stat'><div class='num blue'>" + summary.DevicesNoManagedBy + "</div><div class='lbl'>No ManagedBy</div></div>");
|
||||||
sb.Append("<div class='stat'><div class='num grey'>" + summary.DevicesNoAssignment + "</div><div class='lbl'>No Assignment</div></div>");
|
sb.Append("<div class='stat'><div class='num grey'>" + summary.DevicesNoAssignment + "</div><div class='lbl'>No Assignment</div></div>");
|
||||||
sb.Append("</div>");
|
sb.Append("</div>");
|
||||||
|
|
||||||
|
// Info bar for filtered items
|
||||||
|
if (summary.DevicesNotInAD > 0 || summary.SkippedDevices > 0)
|
||||||
|
{
|
||||||
|
sb.Append("<div class='info-bar'>");
|
||||||
|
sb.Append("<strong>Filtered out:</strong> ");
|
||||||
|
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("</div>");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Results table - mismatches only (all results are AD-found devices)
|
||||||
var mismatches = summary.Results.Where(r => !r.IsMatch).ToList();
|
var mismatches = summary.Results.Where(r => !r.IsMatch).ToList();
|
||||||
|
|
||||||
if (mismatches.Count == 0)
|
if (mismatches.Count == 0)
|
||||||
{
|
{
|
||||||
sb.Append("<div style='padding:20px;background:#dff0d8;border-radius:4px;margin-top:15px;'>");
|
sb.Append("<div style='padding:20px;background:#dff0d8;border-radius:4px;margin-top:15px;'>");
|
||||||
sb.Append("<strong>✓ All devices match!</strong> Every device's Disco assigned user matches the AD Managed By field.");
|
sb.Append("<strong>✓ All devices match!</strong> Every device found in AD has its Managed By matching the Disco assigned user.");
|
||||||
sb.Append("</div>");
|
sb.Append("</div>");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sb.Append("<h3 style='margin-top:20px;'>Mismatches (" + mismatches.Count + ")</h3>");
|
sb.Append("<h3 style='margin-top:20px;'>Mismatches (" + mismatches.Count + ")</h3>");
|
||||||
sb.Append("<table><thead><tr>");
|
sb.Append("<table><thead><tr>");
|
||||||
sb.Append("<th>Status</th><th>Serial Number</th><th>Computer Name</th>");
|
sb.Append("<th>Serial Number</th><th>Computer Name</th>");
|
||||||
sb.Append("<th>Disco Assigned User</th><th>AD Managed By</th><th>Reason</th>");
|
sb.Append("<th>Disco Assigned User</th><th>AD Managed By</th><th>Reason</th>");
|
||||||
sb.Append("</tr></thead><tbody>");
|
sb.Append("</tr></thead><tbody>");
|
||||||
|
|
||||||
foreach (var r in mismatches)
|
foreach (var r in mismatches)
|
||||||
{
|
{
|
||||||
string rowClass = r.FoundInAD ? "warn-row" : "danger-row";
|
|
||||||
string badge = r.FoundInAD
|
|
||||||
? "<span class='badge badge-warn'>Mismatch</span>"
|
|
||||||
: "<span class='badge badge-err'>Not in AD</span>";
|
|
||||||
|
|
||||||
string discoUser = !string.IsNullOrEmpty(r.DiscoAssignedUserId)
|
string discoUser = !string.IsNullOrEmpty(r.DiscoAssignedUserId)
|
||||||
? H(r.DiscoAssignedUserId) + (r.DiscoAssignedUserDisplayName != null
|
? H(r.DiscoAssignedUserId) + (r.DiscoAssignedUserDisplayName != null
|
||||||
? "<br/><span class='small'>" + H(r.DiscoAssignedUserDisplayName) + "</span>" : "")
|
? "<br/><span class='small'>" + H(r.DiscoAssignedUserDisplayName) + "</span>" : "")
|
||||||
: "<span class='muted'>Not assigned</span>";
|
: "<span class='muted'>Not assigned</span>";
|
||||||
|
|
||||||
string adUser;
|
string adUser = !string.IsNullOrEmpty(r.ADManagedByDisplayName)
|
||||||
if (!string.IsNullOrEmpty(r.ADManagedByUserId))
|
? H(r.ADManagedByDisplayName)
|
||||||
{
|
: "<span class='muted'>Empty</span>";
|
||||||
adUser = H(r.ADManagedByUserId);
|
|
||||||
if (r.ADManagedByDisplayName != null)
|
|
||||||
adUser = adUser + "<br/><span class='small'>" + H(r.ADManagedByDisplayName) + "</span>";
|
|
||||||
}
|
|
||||||
else if (r.FoundInAD)
|
|
||||||
{
|
|
||||||
adUser = "<span class='muted'>Empty</span>";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
adUser = "<span class='muted'>N/A</span>";
|
|
||||||
}
|
|
||||||
|
|
||||||
sb.Append("<tr class='" + rowClass + "'>");
|
sb.Append("<tr class='warn-row'>");
|
||||||
sb.Append("<td>" + badge + "</td>");
|
|
||||||
sb.Append("<td>" + H(r.SerialNumber) + "</td>");
|
sb.Append("<td>" + H(r.SerialNumber) + "</td>");
|
||||||
sb.Append("<td>" + H(r.ComputerName) + "</td>");
|
sb.Append("<td>" + H(r.ComputerName) + "</td>");
|
||||||
sb.Append("<td>" + discoUser + "</td>");
|
sb.Append("<td>" + discoUser + "</td>");
|
||||||
|
|||||||
Reference in New Issue
Block a user