C # Active Directory: Abrufen des Domänennamens des Benutzers?

Ich weiß, dass diese Art von Frage gestellt wurde, bevor, aber andere Methoden Versagen, mich jetzt.

So wie es steht, unsere windows-Dienst fragt die ANZEIGE, da ein LDAP (z.B. LDAP://10.32.16.80) und eine Liste von Benutzergruppen innerhalb dieser AD-server zu suchen.
Es ruft alle Benutzer innerhalb dieser Gruppen gegeben, die rekursiv suchen, diese Gruppen weitere Gruppen als gut.
Jeder Benutzer wird dann Hinzugefügt, um andere Anwendungen, die authentifizierte Benutzer-Liste.

In diesem Teil der Anwendung läuft erfolgreich. Wir sind hier jedoch in der Notwendigkeit jeder Benutzer-freundliche domain-Namen (also den Teil Ihrer login-DOMÄNE/Benutzername)

Also, wenn es ein Benutzer, der Domäne TEST, namens Steve: TEST/steve ist seine login -.
Ich bin in der Lage zu finden, die steve in der AD, aber ich brauche auch "TEST" gespeichert werden, zusammen mit seinem AD-information.

Wieder, die ich finden kann 'steve' Ordnung mit einem Verzeichnis Suchenden und dem LDAP-IP ich bin da, aber angesichts der LDAP-IP, wie finde ich die freundliche domain-Namen?

Wenn ich versuche, den folgenden code, den ich bekomme eine Fehlermeldung, wenn Sie versuchen, Zugriff auf die "defaultNamingContext':

System.- Laufzeit.InteropServices.COMException (0x8007202A): Die Authentifizierungs-Mechanismus ist unbekannt.

Hier ist der code:

    private string SetCurrentDomain(string server)
    {
        string result = string.Empty;
        try
        {
            logger.Debug("'SetCurrentDomain'; Instantiating rootDSE LDAP");
            DirectoryEntry ldapRoot = new DirectoryEntry(server + "/rootDSE", username, password);
            logger.Debug("'SetCurrentDomain'; Successfully instantiated rootDSE LDAP");

            logger.Debug("Attempting to retrieve 'defaultNamingContext'...");
            string domain = (string)ldapRoot.Properties["defaultNamingContext"][0]; //THIS IS WHERE I HIT THE COMEXCEPTION
            logger.Debug("Retrieved 'defaultNamingContext': " + domain);
            if (!domain.IsEmpty())
            {

                logger.Debug("'SetCurrentDomain'; Instantiating partitions/configuration LDAP entry");
                DirectoryEntry parts = new DirectoryEntry(server + "/CN=Partitions,CN=Configuration," + domain, username, password);

                logger.Debug("'SetCurrentDomain'; Successfully instantiated partitions/configuration LDAP entry");
                foreach (DirectoryEntry part in parts.Children)
                {
                    if (part.Properties["nCName"] != null && (string)part.Properties["nCName"][0] != null)
                    {
                        logger.Debug("'SetCurrentDomain'; Found property nCName");
                        if ((string)part.Properties["nCName"][0] == domain)
                        {
                            logger.Debug("'SetCurrentDomain'; nCName matched defaultnamingcontext");
                            result = (string)part.Properties["NetBIOSName"][0];
                            logger.Debug("'SetCurrentDomain'; Found NetBIOSName (friendly domain name): " + result);
                            break;
                        }
                    }
                }
            }
            logger.Debug("finished setting current domain...");
        }
        catch (Exception ex)
        {
            logger.Error("error attempting to set domain:" + ex.ToString());
        }
        return result;
    }

Bearbeiten

Fügte ich dieses Beispiel-Methode, um zu versuchen, einen Vorschlag aber bin immer eine Ausnahme: "Unbekannter Fehler" wenn ich auf den "FindAll ()" - Aufruf auf der searcher.
Die Zeichenfolge wird übergeben: "CN=TEST USER,CN=Users,DC=tempe,DC=ktregression,DC=com"

        private string GetUserDomain(string dn)
    {
        string domain = string.Empty;
        string firstPart = dn.Substring(dn.IndexOf("DC="));
        string secondPart = "CN=Partitions,CN=Configuration," + firstPart;
        DirectoryEntry root = new DirectoryEntry(secondPart, textBox2.Text, textBox3.Text);
        DirectorySearcher searcher = new DirectorySearcher(root);
        searcher.SearchScope = SearchScope.Subtree;
        searcher.ReferralChasing = ReferralChasingOption.All;
        searcher.Filter = "(&(nCName=" + firstPart + ")(nETBIOSName=*))";
        try
        {
            SearchResultCollection rs = searcher.FindAll();
            if (rs != null)
            {
                domain = GetProperty(rs[0], "nETBIOSName");
            }
        }
        catch (Exception ex)
        {

        }


        return domain;
Kommentar zu dem Problem
Wird die TEST domain unter der gleichen Gesamtstruktur wie der aktuellen domain? Wenn ja, können Sie eine Abfrage der richtigen domain für diesen Benutzer, da der Benutzer möglicherweise gibt es in Ihrem aktuellen Domäne, aber nicht in der anderen. Kommentarautor: Will Marcouiller
Ja, die TEST-Domäne in der gleichen Gesamtstruktur wie die aktuelle Domäne. In dieser Hinsicht, wie gehe ich über die Abfragen der Domäne für einen bestimmten Benutzer? Beachten Sie meine ANZEIGE wissen ist begrenzt, ich bin nicht sehr versiert auf den Aufbau von LDAP-strings und so... Kommentarautor: ghost_mv
mögliche Duplikate von Get NT-style domain\user gegeben, DN - diese bietet Informationen darüber, wie zu konvertieren (DN) eines Benutzers, um seine NETBIOS-Domänennamen, die ist, was Sie hier wollen. Kommentarautor: Steve Townsend
Ich würde dann die Abfrage jede Domäne für Benutzer Steve und eine IList<string> der Domänen, in denen Steve ein Konto hat. Daher kann man nicht sagen, dass die absolute Benutzernamen TEST\Steve, da Steve vielleicht haben Sie ein anderes Benutzerkonto mit dem gleichen Namen für eine andere domain, sagen wir mal PROD\Steve. Kommentarautor: Will Marcouiller
Steve Townsend, habe ich versucht, die Verbindung als eine Lösung, aber bin immer ein unbekannter Fehler, wenn Sie den Aufruf "FindOne()" auf den Suchenden. Kommentarautor: ghost_mv

InformationsquelleAutor der Frage ghost_mv | 2010-11-22

Schreibe einen Kommentar