v1.2.1 - Filter out devices without valid domain ID and not found in AD

This commit is contained in:
2026-04-27 16:07:48 +10:00
parent 7b50c0a7fa
commit c3e014446c
+20 -23
View File
@@ -26,20 +26,30 @@ namespace Disco.Plugins.ADCompare.Features
.Where(d => d.DeviceDomainId != null && d.DecommissionedDate == null) .Where(d => d.DeviceDomainId != null && d.DecommissionedDate == null)
.ToList(); .ToList();
summary.TotalDevices = devices.Count; // Only process devices with a valid DOMAIN\ComputerName format
var validDevices = devices.Where(d => d.DeviceDomainId.Contains("\\")).ToList();
summary.TotalDevices = validDevices.Count;
summary.SkippedDevices = devices.Count - validDevices.Count;
foreach (var device in devices) foreach (var device in validDevices)
{ {
var result = CompareDevice(device); var result = CompareDevice(device);
// Skip devices not found in AD - only keep ones we can actually compare
if (!result.FoundInAD)
{
summary.DevicesNotInAD++;
continue;
}
summary.Results.Add(result); summary.Results.Add(result);
} }
summary.DevicesWithAssignment = summary.Results.Count(r => r.HasAssignment); summary.DevicesWithAssignment = summary.Results.Count(r => r.HasAssignment);
summary.DevicesNotInAD = summary.Results.Count(r => !r.FoundInAD);
summary.DevicesMatched = summary.Results.Count(r => r.IsMatch); summary.DevicesMatched = summary.Results.Count(r => r.IsMatch);
summary.DevicesMismatched = summary.Results.Count(r => !r.IsMatch && r.FoundInAD); summary.DevicesMismatched = summary.Results.Count(r => !r.IsMatch);
summary.DevicesNoAssignment = summary.Results.Count(r => !r.HasAssignment); summary.DevicesNoAssignment = summary.Results.Count(r => !r.HasAssignment);
summary.DevicesNoManagedBy = summary.Results.Count(r => r.FoundInAD && !r.HasManagedBy); summary.DevicesNoManagedBy = summary.Results.Count(r => !r.HasManagedBy);
summary.DevicesADDisabled = summary.Results.Count(r => r.ADAccountDisabled); summary.DevicesADDisabled = summary.Results.Count(r => r.ADAccountDisabled);
return summary; return summary;
@@ -69,19 +79,15 @@ namespace Disco.Plugins.ADCompare.Features
result.FoundInAD = true; result.FoundInAD = true;
result.ADAccountDisabled = adAccount.IsDisabled; result.ADAccountDisabled = adAccount.IsDisabled;
// Get the managedBy DN from the computer object
var managedByDN = adAccount.GetPropertyValue<string>("managedBy"); var managedByDN = adAccount.GetPropertyValue<string>("managedBy");
result.ADManagedByDN = managedByDN; result.ADManagedByDN = managedByDN;
result.HasManagedBy = !string.IsNullOrEmpty(managedByDN); result.HasManagedBy = !string.IsNullOrEmpty(managedByDN);
// Extract display name from the CN portion of the DN for display
if (result.HasManagedBy) if (result.HasManagedBy)
{ {
result.ADManagedByDisplayName = ExtractCNFromDN(managedByDN); result.ADManagedByDisplayName = ExtractCNFromDN(managedByDN);
} }
// To compare correctly, look up the Disco assigned user in AD
// and compare their DN against the managedBy DN
string assignedUserDN = null; string assignedUserDN = null;
if (result.HasAssignment) if (result.HasAssignment)
{ {
@@ -91,23 +97,18 @@ namespace Disco.Plugins.ADCompare.Features
if (assignedUserAD != null) if (assignedUserAD != null)
{ {
assignedUserDN = assignedUserAD.DistinguishedName; assignedUserDN = assignedUserAD.DistinguishedName;
result.ADManagedByUserId = device.AssignedUserId; // For display result.ADManagedByUserId = device.AssignedUserId;
} }
} }
catch catch { }
{
// Can't look up assigned user in AD
}
} }
// Now compare: both have values -> compare DNs
if (!result.HasAssignment && !result.HasManagedBy) if (!result.HasAssignment && !result.HasManagedBy)
{ {
result.IsMatch = true; result.IsMatch = true;
} }
else if (result.HasAssignment && result.HasManagedBy && assignedUserDN != null) else if (result.HasAssignment && result.HasManagedBy && assignedUserDN != null)
{ {
// Compare DN-to-DN (case insensitive)
result.IsMatch = string.Equals(assignedUserDN, managedByDN, StringComparison.OrdinalIgnoreCase); result.IsMatch = string.Equals(assignedUserDN, managedByDN, StringComparison.OrdinalIgnoreCase);
if (result.IsMatch) if (result.IsMatch)
{ {
@@ -142,14 +143,14 @@ namespace Disco.Plugins.ADCompare.Features
return "Assigned in Disco but AD managedBy is empty"; return "Assigned in Disco but AD managedBy is empty";
if (!result.HasAssignment && result.HasManagedBy) if (!result.HasAssignment && result.HasManagedBy)
return string.Format("Not assigned in Disco but AD managedBy is set to {0}", return string.Format("Not assigned in Disco but AD managedBy is set to {0}",
ExtractCNFromDN(result.ADManagedByDN)); ExtractCNFromDN(result.ADManagedByDN));
if (result.HasAssignment && result.HasManagedBy) if (result.HasAssignment && result.HasManagedBy)
{ {
var managedByName = ExtractCNFromDN(result.ADManagedByDN); var managedByName = ExtractCNFromDN(result.ADManagedByDN);
return string.Format("Different users: Disco={0} ({1}), AD managedBy={2}", return string.Format("Different users: Disco={0} ({1}), AD managedBy={2}",
result.DiscoAssignedUserId, result.DiscoAssignedUserId,
result.DiscoAssignedUserDisplayName ?? "?", result.DiscoAssignedUserDisplayName ?? "?",
managedByName); managedByName);
} }
@@ -157,10 +158,6 @@ namespace Disco.Plugins.ADCompare.Features
return "Unknown mismatch"; return "Unknown mismatch";
} }
/// <summary>
/// Extract the CN value from a Distinguished Name.
/// e.g. "CN=Sue Lesnjak,OU=Teachers,..." -> "Sue Lesnjak"
/// </summary>
private string ExtractCNFromDN(string dn) private string ExtractCNFromDN(string dn)
{ {
if (string.IsNullOrEmpty(dn)) if (string.IsNullOrEmpty(dn))