v1.2.1 - Filter out devices without valid domain ID and not found in AD
This commit is contained in:
@@ -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))
|
||||||
|
|||||||
Reference in New Issue
Block a user