Una query LDAP su AD può fornire il nome di dominio netbios per un singolo account quando si utilizza il catalogo globale?


11

Sto usando ADSI Edit per esaminare le proprietà LDAP di un singolo account utente in AD. Vedo proprietà come userPrincipalName, ma non ne vedo uno per il nome di dominio completo (FQDN) o il nome di dominio netbios.

Configureremo il catalogo globale (GC) per darci l'accesso LDAP a più domini e attraverso la configurazione in un'applicazione mapperemo le proprietà LDAP alle proprietà del profilo utente all'interno dell'applicazione. Con AD tipico il nome di dominio completo e il nome di dominio netbios sono gli stessi per tutti gli utenti, ma con il GC coinvolto abbiamo bisogno di queste informazioni aggiuntive. Abbiamo davvero bisogno solo del nome di dominio netbios (il nome FQDN non è abbastanza buono).

Forse c'è una query LDAP che può essere fatta per richiedere queste informazioni da un oggetto di più alto livello in AD?

Risposte:


5

Penso di averlo capito. Usando ADSI Edit puoi guardare le proprietà di un oggetto (es. Un utente), ma per impostazione predefinita stava filtrando gli attributi "costruiti". Utilizzando il pulsante Filtro in basso a destra nella schermata delle proprietà sono stato in grado di mostrare questi attributi aggiuntivi.

"MsDS-PrincipalName" sembra avere "[nome dominio netbios] \ [sAMAccountName]" come valore.

Se vado in Utenti e computer AD e cambio il "Nome di accesso dell'utente" da "gwasington@test.kirkdev.local" a "gwash2ington@test.kirk2dev.local" questo influisce sull'attributo "userPrincipalName", ma non sul "msDS- PrincipalName "attributo. Questo va bene nel mio caso, perché anche il mio altro sistema (SharePoint) non riconosce questa modifica.

Se vado in Utenti e computer AD e cambio il "Nome accesso utente (pre-Windows 2000)" da "KIRKDEV \ gwashington" a "KIRKDEV \ g2washington" (nota che non posso cambiare la prima parte) ciò non influisce sul "userPrincipalName" attributo, ma non influisce l'attributo "msDS-PrincipalName". Questo è esattamente quello che voglio perché il mio altro sistema (SharePoint) riconosce questa modifica.

Nota a margine: ho detto che SharePoint riconosce la modifica, ma questo è solo se l'utente non ha mai effettuato l'accesso a quella raccolta siti di SharePoint prima. Una volta che l'utente ha effettuato l'accesso alla raccolta siti di SharePoint, il campo tp_Login nella tabella UserInfo è impostato con il valore "msDS-PrincipalName" e non sembra cambiare. Quindi, potrei dover trovare un modo per forzare tale modifica o semplicemente dire che questo scenario non è supportato.


Non ho verificato che possiamo effettivamente interrogare "msDS-PrincipalName" dal catalogo globale. Questo sarà il prossimo passo.
Kirk Liemohn,

Bene, stavo per contrassegnare la mia risposta come corretta, ma ora vedo che il catalogo globale non può interrogare msDS-PrincipalName. Ugh, ancora non sono sicuro di come scopriremo il nome di dominio netbios da lì senza fare alcune ipotesi (come se fosse la prima parte del nome di dominio completo).
Kirk Liemohn,

Per quanto riguarda la mia nota a margine , consultare serverfault.com/questions/234526/… per aiutare SharePoint a riconoscere la modifica dell'accesso.
Kirk Liemohn,

Questo è ciò che viene chiamato un attributo costruito, ovvero viene calcolato su richiesta quando viene effettuata una richiesta per un oggetto. Non puoi filtrarlo su una query per questo motivo.
Brian Desmond,

Grazie per queste informazioni - mi è stato molto utile durante le query tramite LDAP da SQL Server.
Ian Yates,

3

Per rispondere alla tua ultima domanda dovresti essere in grado di verificare manualmente il nome NetBios controllando la sezione Configurazione e quindi Directory Partitions in ADSIEdit:

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

Questo ha sia namee netBIOSNameproprietà. Altrimenti penso che dovresti prenderlo da un fqdn / DN come suggerisce squillman.


Grazie @BoyMars. Ho avuto dei problemi a trovare "CN = Configuration" al livello più alto nel mio dominio. Ho cercato un po 'in giro e non sono riuscito a trovare "Configurazione" o "Partizioni di directory". Tuttavia, penso che potrei averlo capito (in procinto di pubblicare una risposta).
Kirk Liemohn,

OK, ho appena capito come arrivare a CN = Configuration (scusate, sono passati circa 6 anni da quando ho giocato con LDAP e ADSI Edit). @BoyMars, capisco di cosa stai parlando. Sfortunatamente, per interrogare il nome di dominio netbios, sembra che sia necessario scorrere tutti gli oggetti in CN = Partitions, CN = Configuration e per ognuno vedere se ha un attributo "nETBIOSName". Forse una query che dice che mi dà tutti gli oggetti crossRef in cui l'attributo netBIOSName non è null farebbe il trucco. Questo sembra relativamente facile da fare nel codice, ma devo farlo attraverso la configurazione. :-(
Kirk Liemohn,

Ecco una pagina che discute su come interrogare il netbiosname. Stanno usando il codice, comunque. Ho il sospetto che questo non funzionerà per me. geekswithblogs.net/Tariq/archive/2009/07/30/133813.aspx
Kirk Liemohn

ma spiega la posizione "AD memorizza il nome netbios nel contenitore di denominazione delle partizioni che è memorizzato nel contenitore di denominazione della configurazione".
BoyMars,

Questa è l'unica fonte autorevole di informazioni. In particolare, l'oggetto crossRef menzionato.
Brian Desmond,

3

Per un'applicazione? Microsoft lo rende abbastanza semplice in .NET. Ciò dovrebbe fornire un elenco di nomi Netbios di dominio che è possibile utilizzare per creare un elenco di oggetti personalizzati con i nomi DN / DNS / Netbios di dominio o dizionari con riferimenti incrociati.

Inoltre, ciò che determina se un attributo è disponibile nel catalogo globale è (ancora un altro) attributo chiamato isMemberOfPartialAttributeSet. Utilizzando Microsoft SysInternals AD Explorer, è possibile cercare il contenitore Schema in un dominio e cercare qualsiasi oggetto che abbia isMemberOfPartialAttributeSet = true per visualizzare tutti gli attributi disponibili per una query GC.

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;
}

Grazie per la risposta, ma devo eseguirlo da un computer non Windows. Tuttavia, se necessario, immagino di poter creare il mio servizio Web in .NET e fornire queste informazioni all'altra macchina. Questo può essere un approccio di fallback.
Kirk Liemohn,

2
Anche questo dovrebbe essere semplice. Imposta il tuo DN di base su "CN = Partitions, CN = Configuration" + il DN di base dell'attributo domain distinguishedName e il filtro di ricerca su (& (nETBIOSName = *) (dnsRoot = <dns name of AD domain>)). È inoltre possibile cercare l'attributo ncName anziché dnsRoot, se si desidera abbinare il suffisso dn del dominio anziché il nome dns.
Greg Askew,

1

Dovrai analizzarlo da dn(distinguishedName) o dagli AdsDSPathattributi. Le entità dei nomi di dominio sono precedute da "DC="questi attributi. L'estrema sinistra DC=conterrà il tuo nome di dominio netbios.

Per esempio: cn=myuser,ou=users,dc=mydomain,dc=mycompany,dc=com

mydomain è il nome di dominio netbios.

EDIT:
Come sottolinea Brian Desmond, questo non è necessariamente il modo autorevole per trovare il nome attuale di netbios, è solo una coincidenza che di solito si correlano. Vedi la risposta di BoyMars per il modo autorevole.


attenzione al limite netbios di 15 caratteri quando si utilizzano i valori di una stringa fqdn o DN, non ho visto molti domini che usano una stringa così a lungo :)
BoyMars

Grazie @squillman, ma quando ho creato questo dominio ho volutamente fatto in modo che il nome di dominio netbios non fosse la prima parte dell'FQDN solo perché era possibile e ho bisogno di controllare i confini poiché il mio codice deve funzionare in più ambienti. Quindi nel mio caso il nome di dominio completo è test.kirkdev.local (esempio utente dn è "CN = George Washington, CN = Users, DC = test, DC = kirkdev, DC = local") ma il nome di dominio netbios è kirkdev.
Kirk Liemohn,

Se stai usando Windows, dsquery computer OU=OU,OU=You,OU=Need,DC=local.domain -o rdnti dà quello che vuoi, con il nome NetBIOS tra virgolette. Poiché è relativo, non sarà necessario ottenere il percorso completo. Non sono sicuro se questo aiuterà l'OP; ha chiesto di LDAP, quindi questa non è una risposta LDAP pura.
songei2f,

@alharaka grazie per il commento, ma stiamo interrogando AD da un computer non MS. Potremmo potenzialmente gestirlo, ma vogliamo davvero che questo faccia parte di una query LDAP. Sembra che dsquery sia uno strumento da riga di comando di Windows Server.
Kirk Liemohn,

1
Siamo spiacenti ma questo non è corretto. Non esiste assolutamente alcuna relazione tra il componente di dominio principale (ad esempio dc = mydomain) e il nome NetBIOS del dominio. È solo una coincidenza comune che siano d'accordo.
Brian Desmond,

0

Se si dispone del nome principale utente o del DN, è possibile utilizzare la libreria COM ActiveDS per tradurre i valori. Di seguito è riportato un esempio per tradurre UserPrincipalName in nome 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);
        }
    }
}

Grazie per la risposta, ma devo farlo da un computer non Windows e idealmente tramite una query LDAP.
Kirk Liemohn,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.