16 Stimmen

Wie man einen Benutzernamen in Active Directory aus einem Anzeigenamen in C# bekommt?

Ich möchte in der Lage sein, die Benutzer-ID eines Benutzers im Active Directory mithilfe des Anzeigenamens dieses Benutzers zu erhalten. Der Anzeigename wird aus einer Datenbank abgerufen und wurde während der Sitzung dieses Benutzers mithilfe des folgenden Codes gespeichert, um den Anzeigenamen zu erhalten:

using System.DirectoryServices.AccountManagement;

    private string GetDisplayName()
    {
        // Domänenkontext einrichten
        PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

        // Aktuell angemeldeten Benutzer finden
        UserPrincipal user = UserPrincipal.Current;

        return user.DisplayName;
    }

Dieses Mal möchte ich eine Methode namens GetUserIdFromDisplayName() haben, die den Active Directory-Anmeldenamen zurückgibt. Irgendwelche Ideen?

35voto

marc_s Punkte 701497

Ich glaube, du kannst es viel einfacher machen als mit Davids Antwort, indem du die integrierte Funktionalität des System.DirectoryServices.AccountManagement (S.DS.AM) Namespace verwendest.

Grundsätzlich kannst du einen Domänenkontext definieren und Benutzer und/oder Gruppen in AD einfach finden:

using System.DirectoryServices.AccountManagement;

private string GetUserIdFromDisplayName(string displayName)
{
    // Domänenkontext einrichten
    using(PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
    {
        // Benutzer anhand des Anzeigenamens finden
        UserPrincipal user = UserPrincipal.FindByIdentity(ctx, displayName);

        // 
        if (user != null)
        {
             return user.SamAccountName;
             // oder vielleicht benötigst du user.UserPrincipalName;
        }
        else
        {
             return string.Empty;
        }
    }
}

Ich sehe wirklich keine Notwendigkeit, zum zugrunde liegenden DirectoryEntry Objekt zu gehen - es sei denn, keines der Eigenschaften des UserPrincipal ist wirklich das, was du suchst.

PS: Wenn die Suche nach Anzeigenamen nicht funktionieren sollte (ich habe gerade keinen AD zur Hand, um es zu testen) - kannst du auch immer den PrincipalSearcher verwenden, um deinen Benutzer zu finden:

using System.DirectoryServices.AccountManagement;

private string GetUserIdFromDisplayName(string displayName)
{
    // Domänenkontext einrichten
    using(PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
    {
        // ein "Abfrage-nach-Beispiel" Prinzipal definieren - hier suchen wir nach einem UserPrincipal 
        // und mit dem übergebenen Anzeigenamen
        UserPrincipal qbeUser = new UserPrincipal(ctx);
        qbeUser.DisplayName = displayName;

        // Erstelle deinen Prinzipal-Sucher und verwende den QBE-Prinzipal    
        PrincipalSearcher srch = new PrincipalSearcher(qbeUser);

        // Übereinstimmung finden - falls vorhanden
        UserPrincipal user = srch.FindOne() as UserPrincipal;

        if (user != null)
        {
             return user.SamAccountName;
             // oder vielleicht benötigst du user.UserPrincipalName;
        }
        else
        {
             return string.Empty;
        }
    }
}

8voto

David Punkte 1143

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X