¿Puede una consulta LDAP en AD proporcionar el nombre de dominio netbios para una sola cuenta cuando se utiliza el Catálogo global?

11

Estoy usando ADSI Edit para ver las propiedades LDAP de una sola cuenta de usuario en AD. Veo propiedades como userPrincipalName, pero no veo una para el nombre de dominio completo (FQDN) o el nombre de dominio netbios.

Configuraremos el Catálogo global (GC) para darnos acceso LDAP a múltiples dominios y, mediante la configuración en una aplicación, asignaremos las propiedades LDAP a las propiedades del perfil de usuario dentro de la aplicación. Con AD típico, el FQDN y el nombre de dominio de netbios son los mismos para todos los usuarios, pero con el GC involucrado necesitamos esta información adicional. Realmente solo necesitamos el nombre de dominio netbios (el FQDN no es lo suficientemente bueno).

¿Tal vez hay una consulta LDAP que se puede hacer para solicitar esta información de un objeto de nivel superior en AD?

Kirk Liemohn
fuente

Respuestas:

5

Creo que lo descubrí. Con ADSI Edit puede ver las propiedades de un objeto (por ejemplo, un usuario), pero de forma predeterminada filtraba los atributos "construidos". Usando el botón Filtro en la parte inferior derecha de la pantalla de propiedades pude mostrar estos atributos adicionales.

El "msDS-PrincipalName" parece tener "[nombre de dominio netbios] \ [sAMAccountName]" como su valor.

Si entro en AD Users and Computers y cambio el "Nombre de inicio de sesión del usuario" de "[email protected]" a "[email protected]", esto afecta el atributo "userPrincipalName", pero no el "msDS- PrincipalName "atributo. Esto es bueno en mi caso, porque mi otro sistema (SharePoint) tampoco reconoce este cambio.

Si entro en AD Users and Computers y cambio el "Nombre de inicio de sesión del usuario (anterior a Windows 2000)" de "KIRKDEV \ gwashington" a "KIRKDEV \ g2washington" (nota, no puedo cambiar la primera parte), esto no afecta el "userPrincipalName" atributo, pero no afectará el atributo "msDS-PrincipalName". Esto es exactamente lo que quiero porque mi otro sistema (SharePoint) reconoce este cambio.

Nota al margen: Dije que SharePoint reconoce el cambio, pero eso es solo si el usuario nunca ha iniciado sesión en esa colección de sitios de SharePoint antes. Una vez que el usuario ha iniciado sesión en la colección de sitios de SharePoint, el campo tp_Login en la tabla UserInfo se establece con el valor "msDS-PrincipalName" y eso no parece cambiar. Por lo tanto, es posible que tenga que encontrar una manera de forzar el cambio o simplemente decir que este escenario no es compatible.

Kirk Liemohn
fuente
No he verificado que realmente podemos consultar "msDS-PrincipalName" del Catálogo global. Ese será el próximo paso.
Kirk Liemohn
Bueno, estaba a punto de marcar mi respuesta como la correcta, pero ahora veo que el Catálogo global no puede consultar msDS-PrincipalName. Ugh, todavía no estoy seguro de cómo descubriremos el nombre de dominio de netbios a partir de ahí sin hacer algunas suposiciones (como si fuera la primera parte del FQDN).
Kirk Liemohn
Con respecto a mi nota al margen, consulte serverfault.com/questions/234526/… para ayudar a que SharePoint reconozca el cambio de inicio de sesión.
Kirk Liemohn
Esto es lo que se llama un atributo construido, es decir, se calcula a pedido cuando se realiza una solicitud para un objeto. No puede filtrarlo en una consulta debido a esto.
Brian Desmond
Gracias por esta información, fue muy útil para mí al realizar consultas a través de LDAP desde SQL Server.
Ian Yates
3

Para responder a su última pregunta, debería poder verificar el nombre de NetBios manualmente al consultar la sección Configuración y luego las Particiones de directorio en ADSIEdit:

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

Esto tiene ambas namey netBIOSNamepropiedades. De lo contrario, creo que tendrías que obtenerlo de un fqdn / DN como sugiere Squillman.

BoyMars
fuente
Gracias @BoyMars. Tuve algunos problemas para encontrar "CN = Configuración" en el nivel superior de mi dominio. Busqué un poco y no pude encontrar "Configuración" o "Particiones de directorio". Sin embargo, creo que puedo haber resuelto esto (a punto de publicar la respuesta).
Kirk Liemohn
OK, acabo de descubrir cómo llegar a CN = Configuration (lo siento, han pasado unos 6 años desde que jugué con LDAP y ADSI Edit). @ BoyMars, veo de lo que estás hablando. Desafortunadamente, es consultar el nombre de dominio de netbios, parece que necesito recorrer todos los objetos en CN = Particiones, CN = Configuración y para cada uno ver si tiene un atributo "nETBIOSName". Tal vez una consulta que diga darme todos los objetos crossRef donde el atributo netBIOSName no sea nulo sería suficiente. Esto parece relativamente fácil de hacer en código, pero tengo que hacerlo a través de la configuración. :-(
Kirk Liemohn
Aquí hay una página que analiza cómo consultar el netbiosname. Sin embargo, están usando código. Sospecho que esto no funcionará para mí. geekswithblogs.net/Tariq/archive/2009/07/30/133813.aspx
Kirk Liemohn
pero explica la ubicación "AD almacena el nombre de la red en el contenedor de nombres de Particiones que se almacena dentro del contenedor de nombres de configuración".
BoyMars
Esta es la única fuente autorizada de información. Específicamente, el objeto crossRef mencionado.
Brian Desmond
3

Para una solicitud? Microsoft hace esto bastante sencillo en .NET. Esto debería proporcionarle una lista de nombres de Netbios de dominio que puede usar para crear una lista de objetos personalizados con los nombres de dominio DN / DNS / Netbios o diccionarios de referencias cruzadas.

Además, lo que determina si un atributo está disponible en el Catálogo global es (aún otro) atributo llamado isMemberOfPartialAttributeSet. Con Microsoft SysInternals AD Explorer, puede buscar el contenedor de esquemas en un dominio y buscar cualquier objeto que tenga isMemberOfPartialAttributeSet = true para ver todos los atributos disponibles para una consulta de 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
fuente
Gracias por la respuesta, pero necesito ejecutar esto desde una máquina que no sea Windows. Sin embargo, si es necesario, creo que podría crear mi propio servicio web en .NET y proporcionarle a la otra máquina esta información. Ese puede ser un enfoque alternativo.
Kirk Liemohn
2
Eso también debería ser sencillo. Establezca su DN base en "CN = Particiones, CN = Configuración" + el DN base del atributo de nombre distinguido de dominio y el filtro de búsqueda en (& (nETBIOSName = *) (dnsRoot = <nombre dns del dominio AD>)). También puede buscar el atributo ncName en lugar de dnsRoot, si desea hacer coincidir el sufijo dn del dominio en lugar del nombre dns.
Greg Askew
1

Tendrás que analizarlo desde el dn(distinguido) o los AdsDSPathatributos. Las entidades de nombre de dominio tienen el prefijo "DC="en estos atributos. El extremo izquierdo DC=contendrá su nombre de dominio netbios.

Por ejemplo: cn=myuser,ou=users,dc=mydomain,dc=mycompany,dc=com

mydomain es el nombre de dominio netbios.

EDITAR:
Como señala Brian Desmond, esta no es necesariamente la forma autorizada de encontrar el nombre real de netbios, es simplemente una coincidencia que generalmente se correlacionan. Vea la respuesta de BoyMars para conocer la forma autorizada.

squillman
fuente
Esté atento al límite de netbios de 15 caracteres al usar los valores de una cadena fqdn o DN, aunque no he visto muchos dominios que usan una cadena tan larga :)
BoyMars
Gracias @squillman, pero cuando creé este dominio, hice que el nombre de dominio netbios no fuera la primera parte del FQDN solo porque era posible y necesito verificar los límites ya que mi código tiene que funcionar en múltiples entornos. Entonces, en mi caso, el FQDN es test.kirkdev.local (el usuario de ejemplo dn es "CN = George Washington, CN = Users, DC = test, DC = kirkdev, DC = local") pero el nombre de dominio netbios es kirkdev.
Kirk Liemohn
Si está utilizando Windows, dsquery computer OU=OU,OU=You,OU=Need,DC=local.domain -o rdnle da lo que desea, con el nombre de NetBIOS entre comillas. Como es relativo, no necesitará obtener la ruta completa. Sin embargo, no estoy seguro de si esto ayudará al OP; preguntó sobre LDAP, por lo que esta no es una respuesta pura de LDAP.
songei2f
@alharaka gracias por el comentario, pero estamos consultando AD desde una computadora que no es MS. Podríamos tratarlo, pero realmente queremos que esto sea parte de una consulta LDAP. Parece que dsquery es una herramienta de línea de comandos de Windows Server.
Kirk Liemohn
1
Lo siento pero esto es incorrecto. No existe absolutamente ninguna relación entre el componente de dominio superior (por ejemplo, dc = midominio) y el nombre NetBIOS del dominio. Es solo una coincidencia común que estén de acuerdo.
Brian Desmond
0

Si tiene el Nombre principal de usuario o el DN, puede usar la biblioteca COM de ActiveDS para traducir los valores. A continuación se muestra un ejemplo para traducir UserPrincipalName al nombre 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
fuente
Gracias por la respuesta, pero necesito hacer esto desde una máquina que no sea Windows e idealmente a través de una consulta LDAP.
Kirk Liemohn