UserPrincipal
hat eine Methode GetUnderlyingObject()
, die das DirectoryEntry
zurückgeben wird.
Holen Sie DirectoryEntry vom Principal:
private DirectoryEntry GetDirectoryEntryFromUserPrincipal(Principal user)
{
return (DirectoryEntry)user.GetUnderlyingObject();
}
Holen Sie DirectoryEntry von Domäne und Kontoname:
private DirectoryEntry GetDirectoryEntryFromDomainAndUsername(string domainName, string userName)
{
// Holen Sie die SID vom NT-Kontonamen
var sid = (SecurityIdentifier) new NTAccount(domainName, accountName)
.Translate(typeof(SecurityIdentifier));
// Holen Sie den Verzeichniseintrag für das LDAP-Servicekonto
var serviceEntry = new DirectoryEntry("LDAP://{Adresse}", "ServiceBenutzername", "ServicePasswort");
var mySearcher = new DirectorySearcher(serviceEntry)
{
Filter = string.Format("(&(ObjectSid={0}))", sid.Value)
};
return mySearcher.FindOne().GetDirectoryEntry();
}
Sobald Sie den DirectoryEntry
haben, verwenden Sie die Guid
Eigenschaft, um die Objekt-Guid des Eintrags zu erhalten
private Guid GetObjectGuidFromDirectoryEntry(DirectoryEntry entry)
{
// Gib die Guid zurück, das ist die Objekt-Guid (ignoriere NativeGuid)
return entry.Guid;
}
Zur Verfolgung eines Benutzerkontos in der Anwendung gegen ein Verzeichniskonto: Verwenden Sie immer die Objekt-Guid als "Dieser Wert wird festgelegt, wenn das Objekt erstellt wird und kann nicht geändert werden."
NT- und SAM-Kontonamen können sich ändern, wenn der Benutzer Domänen wechselt oder, häufiger, ihren Namen ändert (Heirat, rechtliche Namensänderung usw.) und sollten nicht verwendet werden, um einen Benutzer zu verfolgen.
Um den NT-Kontonamen zu erhalten (Domäne\Benutzername):
private string GetNTAccountNameFromDirectoryEntry(DirectoryEntry entry)
{
PropertyValueCollection propertyValueCollection = entry.Properties["objectsid"];
SecurityIdentifier sid = new SecurityIdentifier((byte[]) propertyValueCollection[0], 0);
NTAccount ntAccount = (NTAccount)sid.Translate(typeof (NTAccount));
return account.ToString();
}
Um den SAM-Kontonamen (Benutzername@Domäne) zu erhalten:
private string GetSAMAccountFromDirectoryEntry(DirectoryEntry entry)
{
return entry.Properties["Name"].Value;
}
Und hier ist die erschöpfende Liste aller Active Directory Attribute. Verwenden Sie den "Ldap-Display-Name" beim Abrufen des Werts aus Properties
z.B. Properties["Ldap-Display-Name"]
Anzeigename (Vorname MI Nachname) könnte nützlich sein.