Kann eine LDAP-Abfrage in AD bei Verwendung des globalen Katalogs den NetBios-Domänennamen für ein einzelnes Konto bereitstellen?

11

Ich verwende ADSI Edit, um die LDAP-Eigenschaften eines einzelnen Benutzerkontos in AD zu überprüfen. Ich sehe Eigenschaften wie userPrincipalName, aber keine für den vollqualifizierten Domänennamen (FQDN) oder den NetBios-Domänennamen.

Wir werden den Global Catalog (GC) einrichten, um LDAP-Zugriff auf mehrere Domänen zu ermöglichen, und durch Konfiguration in einer Anwendung LDAP-Eigenschaften Benutzerprofileigenschaften innerhalb der Anwendung zuordnen. Bei typischer AD sind der FQDN und der NetBios-Domainname für alle Benutzer gleich, aber bei der beteiligten GC benötigen wir diese zusätzlichen Informationen. Wir brauchen wirklich nur den NetBios-Domainnamen (der FQDN ist nicht gut genug).

Möglicherweise gibt es eine LDAP-Abfrage, mit der diese Informationen von einem Objekt der obersten Ebene in AD angefordert werden können.

Kirk Liemohn
quelle

Antworten:

5

Ich glaube, ich habe es herausgefunden. Mit ADSI Edit können Sie Eigenschaften für ein Objekt (z. B. einen Benutzer) anzeigen, aber standardmäßig wurden "konstruierte" Attribute herausgefiltert. Mit der Schaltfläche Filter unten rechts im Eigenschaftenbildschirm konnte ich diese zusätzlichen Attribute anzeigen.

Der "msDS-PrincipalName" scheint "[netbios domain name] \ [sAMAccountName]" als Wert zu haben.

Wenn ich in AD-Benutzer und -Computer gehe und den "Benutzeranmeldenamen" von "[email protected]" in "[email protected]" ändere, wirkt sich dies auf das Attribut "userPrincipalName" aus, nicht jedoch auf das Attribut "msDS-" PrincipalName "-Attribut. Dies ist in meinem Fall gut, da mein anderes System (SharePoint) diese Änderung ebenfalls nicht erkennt.

Wenn ich in AD-Benutzer und -Computer gehe und den "Benutzernamen (vor Windows 2000)" von "KIRKDEV \ gwashington" in "KIRKDEV \ g2washington" ändere (beachten Sie, dass ich den ersten Teil nicht ändern kann), hat dies keine Auswirkungen auf Attribut "userPrincipalName", wirkt sich jedoch auf das Attribut "msDS-PrincipalName" aus. Dies ist genau das, was ich möchte, da mein anderes System (SharePoint) diese Änderung erkennt.

Randnotiz: Ich sagte, dass SharePoint die Änderung erkennt, dies jedoch nur, wenn sich der Benutzer noch nie zuvor bei dieser SharePoint-Websitesammlung angemeldet hat. Sobald sich der Benutzer bei der SharePoint-Websitesammlung angemeldet hat, wird das Feld tp_Login in der UserInfo-Tabelle mit dem Wert "msDS-PrincipalName" festgelegt, und dies scheint sich nicht zu ändern. Daher muss ich möglicherweise einen Weg finden, um eine Änderung zu erzwingen, oder einfach sagen, dass dieses Szenario nicht unterstützt wird.

Kirk Liemohn
quelle
Ich habe nicht überprüft, ob wir tatsächlich "msDS-PrincipalName" aus dem globalen Katalog abfragen können. Das wird der nächste Schritt sein.
Kirk Liemohn
Nun, ich wollte meine Antwort als die richtige markieren, aber jetzt sehe ich, dass der globale Katalog msDS-PrincipalName nicht abfragen kann. Ugh, ich bin mir immer noch nicht sicher, wie wir den Netbios-Domainnamen von dort aus herausfinden sollen, ohne einige Annahmen zu treffen (als wäre es der erste Teil des FQDN).
Kirk Liemohn
Informationen zu meiner Randnotiz finden Sie unter serverfault.com/questions/234526/… , damit SharePoint die Anmeldeänderung erkennt.
Kirk Liemohn
Dies wird als konstruiertes Attribut bezeichnet, dh es wird bei Bedarf berechnet, wenn eine Anforderung für ein Objekt gestellt wird. Aus diesem Grund können Sie in einer Abfrage nicht danach filtern.
Brian Desmond
Vielen Dank für diese Informationen - sehr nützlich für mich beim Abfragen über LDAP von SQL Server.
Ian Yates
3

Um Ihre letzte Frage zu beantworten, sollten Sie in der Lage sein, den NetBios-Namen manuell zu überprüfen, indem Sie den Abschnitt Konfiguration und dann Verzeichnispartitionen in ADSIEdit überprüfen:

CN=MYNETBIOSNAME,CN=Partitions,CN=Configuration,DC=mydomain,DC=internal

Dies hat beides nameund netBIOSNameEigenschaften. Ansonsten müsste man es wohl von einem fqdn / DN bekommen, wie Squillman vorschlägt.

BoyMars
quelle
Danke @BoyMars. Ich hatte einige Probleme, "CN = Configuration" auf der obersten Ebene meiner Domain zu finden. Ich stöberte ein bisschen herum und konnte "Konfiguration" oder "Verzeichnispartitionen" nicht finden. Ich glaube jedoch, dass ich dies herausgefunden habe (kurz vor der Veröffentlichung einer Antwort).
Kirk Liemohn
OK, ich habe gerade herausgefunden, wie ich zu CN = Configuration komme (sorry, es ist ungefähr 6 Jahre her, seit ich mit LDAP und ADSI Edit herumgespielt habe). @ BoyMars, ich sehe, wovon du sprichst. Um den Netbios-Domainnamen abzufragen, muss ich leider alle Objekte unter CN = Partitionen, CN = Konfiguration durchlaufen und für jedes Objekt prüfen, ob es ein "nETBIOSName" -Attribut hat. Vielleicht würde eine Abfrage, die besagt, dass ich alle crossRef-Objekte habe, bei denen das Attribut netBIOSName nicht null ist, den Trick tun würde. Dies scheint im Code relativ einfach zu sein, aber ich muss dies durch Konfiguration tun. :-(
Kirk Liemohn
Auf dieser Seite wird erläutert, wie der NetBiosname abgefragt wird. Sie verwenden jedoch Code. Ich vermute, dass das bei mir nicht funktioniert. geekswithblogs.net/Tariq/archive/2009/07/30/133813.aspx
Kirk Liemohn
Es erklärt jedoch den Speicherort "AD speichert den NetBIOS-Namen im Partitions-Benennungscontainer, der im Konfigurations-Benennungscontainer gespeichert ist."
BoyMars
Dies ist die einzige maßgebliche Informationsquelle. Insbesondere das erwähnte crossRef-Objekt.
Brian Desmond
3

Für eine Bewerbung? Microsoft macht dies in .NET ziemlich einfach. Auf diese Weise sollten Sie eine Liste der Domänen-Netbios-Namen erhalten, mit denen Sie eine Liste der benutzerdefinierten Objekte mit den Domänen-DN / DNS / Netbios-Namen oder Querverweisen auf Wörterbücher erstellen können.

Was bestimmt, ob ein Attribut im globalen Katalog verfügbar ist, ist (noch ein weiteres) Attribut namens isMemberOfPartialAttributeSet. Mit Microsoft SysInternals AD Explorer können Sie den Schema-Container in einer Domäne durchsuchen und nach jedem Objekt mit dem isMemberOfPartialAttributeSet = true suchen, um alle Attribute anzuzeigen, die für eine GC-Abfrage verfügbar sind.

using System.DirectoryServices;
using System.DirectoryServices.ActiveDirectory;

private void GetNetbiosNamesTest()
{
    DomainCollection domains = Forest.GetCurrentForest().Domains;
    foreach (Domain domain in domains)
    {
        Console.WriteLine("Domain Netbios name: {0}", this.GetDomainNetBiosName(domain));
    }
}

private string GetDomainNetBiosName(Domain domain)
{
    ForestRootDirectoryEntry = Forest.GetCurrentForest().RootDomain.GetDirectoryEntry();
    string forestConfigurationBindPath = String.Format("LDAP://CN=Partitions,CN=Configuration,{0}", ForestRootDirectoryEntry.Properties["distinguishedName"].Value);
    ForestRootConfigurationDirectoryEntry = new DirectoryEntry(forestConfigurationBindPath);

    string netBiosName = String.Empty;

    using (DirectorySearcher directorySearcher = new DirectorySearcher(ForestRootConfigurationDirectoryEntry))
    {
        directorySearcher.Filter = String.Format("(&(nETBIOSName=*)(dnsRoot={0}))", domain.Name);
        directorySearcher.PropertiesToLoad.AddRange(new String[] { "dnsRoot", "nETBIOSName" });
        var result = directorySearcher.FindOne();

        if ((result != null) && (result.Properties.Contains("nETBIOSName"))) netBiosName = result.Properties["nETBIOSName"][0].ToString();
    }
    return netBiosName;
}
Greg Askew
quelle
Vielen Dank für die Antwort, aber ich muss dies von einem Nicht-Windows-Computer ausführen. Bei Bedarf könnte ich jedoch meinen eigenen Webdienst in .NET erstellen und dem anderen Computer diese Informationen zur Verfügung stellen. Das kann ein Fallback-Ansatz sein.
Kirk Liemohn
2
Das sollte auch einfach sein. Setzen Sie Ihren Basis-DN auf "CN = Partitionen, CN = Konfiguration" + den Basis-DN des Domain-DistinguishedName-Attributs und den Suchfilter auf (& (nETBIOSName = *) (dnsRoot = <DNS-Name der AD-Domäne>)). Sie können auch nach dem Attribut ncName anstelle von dnsRoot suchen, wenn Sie das DNS-Suffix der Domäne anstelle des DNS-Namens abgleichen möchten.
Greg Askew
1

Sie müssen es entweder aus dem dn(DistinguishedName) oder den AdsDSPathAttributen analysieren . Domänennamenentitäten werden "DC="in diesen Attributen vorangestellt . DC=Ganz links wird Ihr NetBios-Domainname enthalten.

Beispielsweise: cn=myuser,ou=users,dc=mydomain,dc=mycompany,dc=com

mydomain ist der Netbios-Domainname.

EDIT:
Wie Brian Desmond betont, ist dies nicht unbedingt der maßgebliche Weg, um den tatsächlichen Netbios-Namen zu finden, es ist nur ein Zufall, dass sie normalerweise korrelieren. Siehe die Antwort von BoyMars für den maßgeblichen Weg.

Squillman
quelle
Achten Sie auf ein NetBIOS-Limit von 15 Zeichen, wenn Sie die Werte einer fqdn- oder DN-Zeichenfolge verwenden. Ich habe jedoch nicht viele Domänen gesehen, die eine so lange Zeichenfolge verwenden :)
BoyMars
Vielen Dank an @squillman, aber als ich diese Domain erstellt habe, habe ich den Netbios-Domainnamen absichtlich nicht zum ersten Teil des FQDN gemacht, nur weil dies möglich war und ich die Grenzen überprüfen muss, da mein Code in mehreren Umgebungen funktionieren muss. In meinem Fall lautet der vollqualifizierte Domänenname test.kirkdev.local (Beispielbenutzer dn ist "CN = George Washington, CN = Benutzer, DC = Test, DC = kirkdev, DC = lokal"), aber der NetBios-Domänenname lautet kirkdev.
Kirk Liemohn
Wenn Sie Windows verwenden, erhalten dsquery computer OU=OU,OU=You,OU=Need,DC=local.domain -o rdnSie das, was Sie möchten, mit dem NetBIOS-Namen in Anführungszeichen. Da es relativ ist, müssen Sie nicht den vollständigen Pfad erhalten. Ich bin mir nicht sicher, ob dies dem OP helfen wird. Er fragte nach LDAP, daher ist dies keine reine LDAP-Antwort.
songei2f
@alharaka, danke für den Kommentar, aber wir fragen AD von einem Nicht-MS-Computer ab. Wir könnten uns möglicherweise damit befassen, aber wir möchten wirklich, dass dies Teil einer LDAP-Abfrage ist. Es scheint, dass dsquery ein Windows Server-Befehlszeilentool ist.
Kirk Liemohn
1
Entschuldigung, aber das ist falsch. Es gibt absolut KEINE Beziehung zwischen der obersten Domänenkomponente (z. B. dc = mydomain) und dem NetBIOS-Namen der Domäne. Es ist nur ein häufiger Zufall, dass sie zustimmen.
Brian Desmond
0

Wenn Sie den Benutzerprinzipalnamen oder den DN haben, können Sie die ActiveDS COM-Bibliothek verwenden, um die Werte zu übersetzen. Unten finden Sie ein Beispiel für die Übersetzung von UserPrincipalName in NT4 (NetBios).

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ActiveDs;

namespace Foo.Repository.AdUserProfile
{
    public class ADUserProfileValueTranslate
    {
        public static string ConvertUserPrincipalNameToNetBiosName(string userPrincipleName)
        {
            NameTranslate nameTranslate = new NameTranslate();
            nameTranslate.Set((int)ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_USER_PRINCIPAL_NAME, userPrincipleName);
            return nameTranslate.Get((int) ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_NT4);
        }
    }
}
Jeff
quelle
Vielen Dank für die Antwort, aber ich muss dies von einem Nicht-Windows-Computer und idealerweise über eine LDAP-Abfrage tun.
Kirk Liemohn