v1.1.0 - Fix DN comparison in device page extension

This commit is contained in:
2026-04-27 10:42:42 +10:00
parent 223716e5ca
commit 39ce0da496
+27 -27
View File
@@ -25,7 +25,7 @@ namespace Disco.Plugins.ADCompare.Features
try try
{ {
var adAccount = ActiveDirectory.RetrieveADMachineAccount( var adAccount = ActiveDirectory.RetrieveADMachineAccount(
device.DeviceDomainId, device.DeviceDomainId,
new[] { "managedBy", "lastLogonTimestamp" }); new[] { "managedBy", "lastLogonTimestamp" });
if (adAccount == null) if (adAccount == null)
@@ -41,35 +41,28 @@ namespace Disco.Plugins.ADCompare.Features
var hasManagedBy = !string.IsNullOrEmpty(managedByDN); var hasManagedBy = !string.IsNullOrEmpty(managedByDN);
var hasAssignment = !string.IsNullOrEmpty(discoAssignedUser); var hasAssignment = !string.IsNullOrEmpty(discoAssignedUser);
string adManagedByUserId = null; // Extract display name from managedBy DN
string adManagedByName = null; string managedByDisplayName = hasManagedBy ? ExtractCNFromDN(managedByDN) : null;
if (hasManagedBy) // Look up the Disco assigned user's DN in AD for comparison
string assignedUserDN = null;
if (hasAssignment)
{ {
try try
{ {
var managedByUser = ActiveDirectory.RetrieveADUserAccount(managedByDN); var assignedUserAD = ActiveDirectory.RetrieveADUserAccount(discoAssignedUser);
if (managedByUser != null) if (assignedUserAD != null)
{ assignedUserDN = assignedUserAD.DistinguishedName;
adManagedByUserId = managedByUser.Id;
adManagedByName = managedByUser.DisplayName;
}
else
{
adManagedByUserId = managedByDN;
}
}
catch
{
adManagedByUserId = managedByDN;
} }
catch { }
} }
// Compare DN-to-DN
bool isMatch = false; bool isMatch = false;
if (!hasAssignment && !hasManagedBy) if (!hasAssignment && !hasManagedBy)
isMatch = true; isMatch = true;
else if (hasAssignment && hasManagedBy) else if (hasAssignment && hasManagedBy && assignedUserDN != null)
isMatch = string.Equals(discoAssignedUser, adManagedByUserId, StringComparison.OrdinalIgnoreCase); isMatch = string.Equals(assignedUserDN, managedByDN, StringComparison.OrdinalIgnoreCase);
html.Append("<table class='table table-condensed' style='margin-bottom:10px;'>"); html.Append("<table class='table table-condensed' style='margin-bottom:10px;'>");
@@ -106,13 +99,7 @@ namespace Disco.Plugins.ADCompare.Features
html.Append("<tr><td><strong>AD Managed By</strong></td><td>"); html.Append("<tr><td><strong>AD Managed By</strong></td><td>");
if (hasManagedBy) if (hasManagedBy)
{ {
html.Append(Encode(adManagedByUserId)); html.Append(Encode(managedByDisplayName ?? managedByDN));
if (!string.IsNullOrEmpty(adManagedByName))
{
html.Append(" <span class='text-muted'>(");
html.Append(Encode(adManagedByName));
html.Append(")</span>");
}
} }
else else
{ {
@@ -120,6 +107,7 @@ namespace Disco.Plugins.ADCompare.Features
} }
html.Append("</td></tr>"); html.Append("</td></tr>");
// Last Logon
var lastLogonTicks = adAccount.GetPropertyValue<long>("lastLogonTimestamp"); var lastLogonTicks = adAccount.GetPropertyValue<long>("lastLogonTimestamp");
html.Append("<tr><td><strong>Last Login</strong></td><td>"); html.Append("<tr><td><strong>Last Login</strong></td><td>");
if (lastLogonTicks > 0) if (lastLogonTicks > 0)
@@ -166,6 +154,18 @@ namespace Disco.Plugins.ADCompare.Features
return Literal(html.ToString()); return Literal(html.ToString());
} }
private string ExtractCNFromDN(string dn)
{
if (string.IsNullOrEmpty(dn)) return null;
if (dn.StartsWith("CN=", StringComparison.OrdinalIgnoreCase))
{
var commaIndex = dn.IndexOf(',');
if (commaIndex > 3) return dn.Substring(3, commaIndex - 3);
return dn.Substring(3);
}
return dn;
}
private string Encode(string value) private string Encode(string value)
{ {
if (string.IsNullOrEmpty(value)) return ""; if (string.IsNullOrEmpty(value)) return "";