From c3e014446cb9850c8e7e897695f3570ef73dc223 Mon Sep 17 00:00:00 2001 From: jessikitty Date: Mon, 27 Apr 2026 16:07:48 +1000 Subject: [PATCH] v1.2.1 - Filter out devices without valid domain ID and not found in AD --- Features/DeviceCompareService.cs | 43 +++++++++++++++----------------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/Features/DeviceCompareService.cs b/Features/DeviceCompareService.cs index facee3b..45005b1 100644 --- a/Features/DeviceCompareService.cs +++ b/Features/DeviceCompareService.cs @@ -26,20 +26,30 @@ namespace Disco.Plugins.ADCompare.Features .Where(d => d.DeviceDomainId != null && d.DecommissionedDate == null) .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); + + // Skip devices not found in AD - only keep ones we can actually compare + if (!result.FoundInAD) + { + summary.DevicesNotInAD++; + continue; + } + summary.Results.Add(result); } 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.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.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); return summary; @@ -69,19 +79,15 @@ namespace Disco.Plugins.ADCompare.Features result.FoundInAD = true; result.ADAccountDisabled = adAccount.IsDisabled; - // Get the managedBy DN from the computer object var managedByDN = adAccount.GetPropertyValue("managedBy"); result.ADManagedByDN = managedByDN; result.HasManagedBy = !string.IsNullOrEmpty(managedByDN); - // Extract display name from the CN portion of the DN for display if (result.HasManagedBy) { 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; if (result.HasAssignment) { @@ -91,23 +97,18 @@ namespace Disco.Plugins.ADCompare.Features if (assignedUserAD != null) { assignedUserDN = assignedUserAD.DistinguishedName; - result.ADManagedByUserId = device.AssignedUserId; // For display + result.ADManagedByUserId = device.AssignedUserId; } } - catch - { - // Can't look up assigned user in AD - } + catch { } } - // Now compare: both have values -> compare DNs if (!result.HasAssignment && !result.HasManagedBy) { result.IsMatch = true; } else if (result.HasAssignment && result.HasManagedBy && assignedUserDN != null) { - // Compare DN-to-DN (case insensitive) result.IsMatch = string.Equals(assignedUserDN, managedByDN, StringComparison.OrdinalIgnoreCase); if (result.IsMatch) { @@ -142,14 +143,14 @@ namespace Disco.Plugins.ADCompare.Features return "Assigned in Disco but AD managedBy is empty"; 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)); if (result.HasAssignment && result.HasManagedBy) { var managedByName = ExtractCNFromDN(result.ADManagedByDN); - return string.Format("Different users: Disco={0} ({1}), AD managedBy={2}", - result.DiscoAssignedUserId, + return string.Format("Different users: Disco={0} ({1}), AD managedBy={2}", + result.DiscoAssignedUserId, result.DiscoAssignedUserDisplayName ?? "?", managedByName); } @@ -157,10 +158,6 @@ namespace Disco.Plugins.ADCompare.Features return "Unknown mismatch"; } - /// - /// Extract the CN value from a Distinguished Name. - /// e.g. "CN=Sue Lesnjak,OU=Teachers,..." -> "Sue Lesnjak" - /// private string ExtractCNFromDN(string dn) { if (string.IsNullOrEmpty(dn))