Une requête LDAP sur AD peut-elle fournir le nom de domaine netbios pour un seul compte lors de l'utilisation du catalogue global?

11

J'utilise ADSI Edit pour examiner les propriétés LDAP d'un seul compte d'utilisateur dans AD. Je vois des propriétés telles que userPrincipalName, mais je n'en vois pas pour le nom de domaine complet (FQDN) ou le nom de domaine netbios.

Nous allons mettre en place le catalogue global (GC) pour nous donner un accès LDAP à plusieurs domaines et par le biais de la configuration dans une application, nous mappons les propriétés LDAP aux propriétés de profil utilisateur dans l'application. Avec AD typique, le nom de domaine complet et le nom de domaine netbios sont les mêmes pour tous les utilisateurs, mais avec le GC impliqué, nous avons besoin de ces informations supplémentaires. Nous n'avons vraiment besoin que du nom de domaine netbios (le nom de domaine complet n'est pas suffisant).

Peut-être existe-t-il une requête LDAP qui peut être effectuée pour demander ces informations à un objet de niveau supérieur dans AD?

Kirk Liemohn
la source

Réponses:

5

Je pense que je l'ai compris. En utilisant ADSI Edit, vous pouvez regarder les propriétés d'un objet (par exemple, un utilisateur), mais par défaut, il filtrait les attributs "construits". En utilisant le bouton Filtre en bas à droite de l'écran des propriétés, j'ai pu afficher ces attributs supplémentaires.

Le "msDS-PrincipalName" semble avoir "[nom de domaine netbios] \ [sAMAccountName]" comme valeur.

Si je vais dans Utilisateurs et ordinateurs AD et que je change le "Nom de connexion utilisateur" de "[email protected]" en "[email protected]", cela affecte l'attribut "userPrincipalName", mais pas l'attribut "msDS-" Attribut PrincipalName ". C'est bien dans mon cas, car mon autre système (SharePoint) ne reconnaît pas non plus ce changement.

Si je vais dans Utilisateurs et ordinateurs AD et que je change le "Nom de connexion utilisateur (avant Windows 2000)" de "KIRKDEV \ gwashington" en "KIRKDEV \ g2washington" (notez que je ne peux pas changer la première partie), cela n'affecte pas le attribut « userPrincipalName », mais n'affecte l'attribut « msDS-PrincipalName ». C'est exactement ce que je veux parce que mon autre système (SharePoint) reconnaît ce changement.

Note latérale: J'ai dit que SharePoint reconnaît le changement, mais ce n'est que si l'utilisateur ne s'est jamais connecté à cette collection de sites SharePoint auparavant. Une fois que l'utilisateur s'est connecté à la collection de sites SharePoint, le champ tp_Login dans la table UserInfo est défini avec la valeur "msDS-PrincipalName" et cela ne semble pas changer. Donc, je devrai peut-être trouver un moyen de forcer cela à changer ou simplement dire que ce scénario n'est pas pris en charge.

Kirk Liemohn
la source
Je n'ai pas vérifié que nous pouvons réellement interroger "msDS-PrincipalName" dans le catalogue global. Ce sera la prochaine étape.
Kirk Liemohn
Eh bien, j'étais sur le point de marquer ma réponse comme étant la bonne, mais maintenant je vois que le catalogue global ne peut pas interroger msDS-PrincipalName. Ugh, je ne sais toujours pas comment nous allons trouver le nom de domaine netbios à partir de là sans faire d'hypothèses (comme c'est la première partie du FQDN).
Kirk Liemohn
En ce qui concerne ma note latérale, voir serverfault.com/questions/234526/… pour aider à faire en sorte que SharePoint reconnaisse le changement de connexion.
Kirk Liemohn
C'est ce qu'on appelle un attribut construit - c'est-à-dire qu'il est calculé à la demande lorsqu'une demande est faite pour un objet. Vous ne pouvez pas le filtrer dans une requête pour cette raison.
Brian Desmond
Merci pour cette information - m'a été très utile lors d'une requête via LDAP à partir de SQL Server.
Ian Yates
3

Pour répondre à votre dernière question, vous devriez pouvoir vérifier le nom NetBios manuellement en vérifiant la section Configuration puis les partitions d'annuaire dans ADSIEdit:

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

Cela a à la fois nameet des netBIOSNamepropriétés. Sinon, je pense que vous devriez l'obtenir d'un fqdn / DN comme le suggère Squillman.

BoyMars
la source
Merci @BoyMars. J'ai eu du mal à trouver "CN = Configuration" au niveau supérieur de mon domaine. J'ai fouillé un peu et je n'ai pas pu trouver "Configuration" ou "Partitions d'annuaire". Cependant, je pense que j'ai peut-être compris cela (sur le point de publier une réponse).
Kirk Liemohn
OK, je viens de découvrir comment accéder à CN = Configuration (désolé, cela fait environ 6 ans que j'ai joué avec LDAP et ADSI Edit). @BoyMars, je vois de quoi vous parlez. Malheureusement, pour interroger le nom de domaine netbios, il semble que je doive parcourir tous les objets sous CN = Partitions, CN = Configuration et pour chacun voir s'il a un attribut "nETBIOSName". Peut-être qu'une requête qui dit me donner tous les objets crossRef où l'attribut netBIOSName n'est pas nul ferait l'affaire. Cela semble relativement facile à faire dans le code, mais je dois le faire via la configuration. :-(
Kirk Liemohn
Voici une page qui explique comment interroger le nom netbios. Ils utilisent cependant du code. Je soupçonne que cela ne fonctionnera pas pour moi. geekswithblogs.net/Tariq/archive/2009/07/30/133813.aspx
Kirk Liemohn
mais il explique l'emplacement "AD stocke le nom netbios dans le conteneur de nommage des partitions qui est stocké à l'intérieur du conteneur de nommage de configuration."
BoyMars
Il s'agit de la seule source d'information faisant autorité. Plus précisément, l'objet crossRef mentionné.
Brian Desmond
3

Pour une candidature? Microsoft rend cela assez simple dans .NET. Cela devrait vous fournir une liste de noms Netbios de domaine que vous pouvez utiliser pour créer une liste d'objets personnalisés avec les noms DN / DNS / Netbios de domaine ou des dictionnaires de références croisées.

En outre, ce qui détermine si un attribut est disponible dans le catalogue global est (encore un autre) attribut appelé isMemberOfPartialAttributeSet. À l'aide de Microsoft SysInternals AD Explorer, vous pouvez rechercher le conteneur Schéma dans un domaine et rechercher tout objet qui a isMemberOfPartialAttributeSet = true pour voir tous les attributs disponibles pour une requête 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;
}
Greg Askew
la source
Merci pour la réponse, mais je dois l'exécuter à partir d'une machine non Windows. Cependant, si nécessaire, je suppose que je pourrais créer mon propre service Web dans .NET et fournir à l'autre machine ces informations. Cela peut être une approche de secours.
Kirk Liemohn
2
Cela devrait également être simple. Définissez votre nom distinctif de base sur «CN = Partitions, CN = Configuration» + le nom distinctif de base de l'attribut domain distinctionName et le filtre de recherche sur (& (nETBIOSName = *) (dnsRoot = <nom DNS du domaine AD>)). Vous pouvez également rechercher l'attribut ncName au lieu de dnsRoot, si vous souhaitez faire correspondre le suffixe dn du domaine au lieu du nom dns.
Greg Askew
1

Vous devrez l'analyser à partir du dn(distinctionName) ou des AdsDSPathattributs. Les entités de nom de domaine sont préfixées "DC="dans ces attributs. Le plus à gauche DC=contiendra votre nom de domaine netbios.

Par exemple: cn=myuser,ou=users,dc=mydomain,dc=mycompany,dc=com

mydomain est le nom de domaine netbios.

EDIT:
Comme le souligne Brian Desmond, ce n'est pas nécessairement le moyen faisant autorité pour trouver le nom réel de netbios, c'est simplement une coïncidence qu'ils corrèlent généralement. Voir la réponse de BoyMars pour la manière autoritaire.

squillman
la source
surveillez la limite netbios de 15 caractères lorsque vous utilisez les valeurs d'une chaîne fqdn ou DN, je n'ai pas vu beaucoup de domaines qui utilisent une chaîne aussi longue :)
BoyMars
Merci @squillman, mais quand j'ai créé ce domaine, j'ai délibérément fait que le nom de domaine netbios ne soit pas la première partie du FQDN juste parce que c'était possible et j'ai besoin de vérifier les limites car mon code doit fonctionner dans plusieurs environnements. Donc, dans mon cas, le FQDN est test.kirkdev.local (par exemple, l'utilisateur dn est "CN = George Washington, CN = Users, DC = test, DC = kirkdev, DC = local"), mais le nom de domaine netbios est kirkdev.
Kirk Liemohn
Si vous utilisez Windows, dsquery computer OU=OU,OU=You,OU=Need,DC=local.domain -o rdnvous donne ce que vous voulez, avec le nom NetBIOS entre guillemets. Comme il est relatif, vous n'aurez pas besoin d'obtenir le chemin complet. Je ne sais pas si cela aidera le PO cependant; il a posé des questions sur LDAP, donc ce n'est pas une réponse LDAP pure.
songei2f
@alharaka merci pour le commentaire, mais nous interrogeons AD depuis un ordinateur non MS. Nous pourrions potentiellement y faire face, mais nous voulons vraiment que cela fasse partie d'une requête LDAP. Il semble que dsquery est un outil de ligne de commande Windows Server.
Kirk Liemohn
1
Désolé mais c'est incorrect. Il n'y a absolument AUCUNE relation entre le composant de domaine supérieur (par exemple dc = mydomain) et le nom NetBIOS du domaine. C'est juste une coïncidence commune qu'ils sont d'accord.
Brian Desmond
0

Si vous avez le nom d'utilisateur principal ou le nom distinctif, vous pouvez utiliser la bibliothèque ActiveDS COM pour traduire les valeurs. Voici un exemple pour traduire UserPrincipalName en nom 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
la source
Merci pour la réponse, mais je dois le faire à partir d'une machine non Windows et idéalement via une requête LDAP.
Kirk Liemohn