Uma consulta LDAP no AD pode fornecer o nome de domínio netbios para uma única conta ao usar o Catálogo Global?

11

Estou usando o ADSI Edit para examinar as propriedades LDAP de uma única conta de usuário no AD. Vejo propriedades como userPrincipalName, mas não vejo uma para o nome de domínio totalmente qualificado (FQDN) ou o nome de domínio netbios.

Estaremos configurando o Catálogo Global (GC) para nos dar acesso LDAP a vários domínios e, através da configuração em um aplicativo, mapeamos as propriedades LDAP para as propriedades do perfil do usuário no aplicativo. No AD típico, o nome de domínio FQDN e netbios são os mesmos para todos os usuários, mas com o GC envolvido, precisamos dessas informações adicionais. Nós realmente precisamos apenas do nome de domínio netbios (o FQDN não é bom o suficiente).

Talvez haja uma consulta LDAP que possa ser feita para solicitar essas informações de um objeto de nível superior no AD?

Kirk Liemohn
fonte

Respostas:

5

Eu acho que descobri. Usando o ADSI Edit, você pode examinar as propriedades de um objeto (por exemplo, um usuário), mas, por padrão, estava filtrando os atributos "construídos". Usando o botão Filtro no canto inferior direito da tela de propriedades, pude mostrar esses atributos adicionais.

O "msDS-PrincipalName" parece ter "[nome de domínio netbios] \ [sAMAccountName]" como seu valor.

Se eu for para Usuários e computadores do AD e alterar o "Nome de logon do usuário" de "[email protected]" para "[email protected]", isso afeta o atributo "userPrincipalName", mas não o "msDS- PrincipalName ". Isso é bom no meu caso, porque meu outro sistema (SharePoint) também não reconhece essa alteração.

Se eu for para Usuários e computadores do AD e alterar o "Nome de logon do usuário (anterior ao Windows 2000)" de "KIRKDEV \ gwashington" para "KIRKDEV \ g2washington" (observe que não posso alterar a primeira parte), isso não afeta o "userPrincipalName" atributo, mas não afeta o atributo "msDS-PrincipalName". É exatamente isso que eu quero, porque meu outro sistema (SharePoint) reconhece essa alteração.

Nota: Eu disse que o SharePoint reconhece a alteração, mas isso é apenas se o usuário nunca tiver efetuado login no conjunto de sites do SharePoint antes. Depois que o usuário faz logon no conjunto de sites do SharePoint, o campo tp_Login na tabela UserInfo é definido com o valor "msDS-PrincipalName" e isso parece não mudar. Portanto, talvez eu tenha que encontrar uma maneira de forçar isso a ser alterado ou apenas dizer que esse cenário não é suportado.

Kirk Liemohn
fonte
Não verifiquei se podemos realmente consultar "msDS-PrincipalName" no Catálogo Global. Esse será o próximo passo.
21411 Kirk Liemohn
Bem, eu estava prestes a marcar minha resposta como correta, mas agora vejo que o Catálogo Global não pode consultar o msDS-PrincipalName. Ugh, ainda não sei como descobriremos o nome de domínio netbios a partir daí sem fazer algumas suposições (como se fosse a primeira parte do FQDN).
Kirk Liemohn
Em relação à minha observação, consulte serverfault.com/questions/234526/… para ajudar a obter o SharePoint para reconhecer a alteração de logon.
21411 Kirk Liemohn
Isso é chamado de atributo construído - isto é, é calculado sob demanda quando uma solicitação é feita para um objeto. Você não pode filtrá-lo em uma consulta por causa disso.
Brian Desmond
Obrigado por esta informação - foi muito útil para mim ao consultar via LDAP do SQL Server.
11556 Ian Yates
3

Para responder à sua última pergunta, você poderá verificar o nome do NetBios manualmente, verificando a seção Configuração e, em seguida, Partições de diretório no ADSIEdit:

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

Isso tem propriedades namee netBIOSName. Caso contrário, acho que você precisaria obtê-lo de um fqdn / DN, como sugere o squillman.

BoyMars
fonte
Obrigado @BoyMars. Ocorreu um problema ao encontrar "CN = Configuration" no nível superior do meu domínio. Eu bisbilhotei um pouco e não consegui encontrar "Configuração" ou "Partições de Diretório". No entanto, acho que posso ter descoberto isso (prestes a postar a resposta).
Kirk Liemohn
OK, eu acabei de descobrir como chegar ao CN = Configuration (desculpe, já faz 6 anos desde que brinquei com o LDAP e o ADSI Edit). @ BoyMars, eu vejo o que você está falando. Infelizmente, é para consultar o nome de domínio netbios, parece que eu preciso percorrer todos os objetos em CN = Partitions, CN = Configuration e para cada um deles ver se ele possui um atributo "nETBIOSName". Talvez uma consulta que diga me fornecer todos os objetos crossRef em que o atributo netBIOSName não seja nulo faria o truque. Isso parece relativamente fácil de fazer no código, mas eu tenho que fazer isso através da configuração. :-(
Kirk Liemohn
Aqui está uma página que discute como consultar o netbiosname. Eles estão usando código, no entanto. Eu suspeito que isso não vai funcionar para mim. geekswithblogs.net/Tariq/archive/2009/07/30/133813.aspx
Kirk Liemohn
mas explica o local "O AD armazena o nome netbios no contêiner de nomeação de partições que é armazenado dentro do contêiner de nomeação de configuração".
BoyMars 12/02
Esta é a única fonte autorizada de informação. Especificamente, o objeto crossRef mencionado.
Brian Desmond
3

Para uma aplicação? A Microsoft torna isso bastante simples no .NET. Isso deve fornecer uma lista de nomes Netbios do domínio que você pode usar para criar uma lista de objetos personalizados com os nomes DN / DNS / Netbios do domínio ou dicionários de referência cruzada.

Além disso, o que determina se um atributo está disponível no Catálogo Global é (ainda outro) atributo chamado isMemberOfPartialAttributeSet. Usando o Microsoft SysInternals AD Explorer, você pode pesquisar o contêiner Schema em um domínio e procurar qualquer objeto que possua isMemberOfPartialAttributeSet = true para ver todos os atributos disponíveis para uma 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
fonte
Obrigado pela resposta, mas preciso executar isso em uma máquina que não seja Windows. No entanto, se necessário, acho que eu poderia criar meu próprio serviço da Web no .NET e fornecer à outra máquina essas informações. Essa pode ser uma abordagem alternativa.
Kirk Liemohn
2
Isso também deve ser direto. Defina o DN base como "CN = Partições, CN = Configuração" + o DN base do atributo distinguishedName do domínio e o filtro de pesquisa como (& (nETBIOSName = *) (dnsRoot = <nome DNS do domínio do AD>)). Você também pode procurar o atributo ncName em vez de dnsRoot, se desejar corresponder ao sufixo dn do domínio em vez do nome dns.
Greg Askew
1

Você precisará analisá-lo a partir do dn(distinguishedName) ou dos AdsDSPathatributos. As entidades de nome de domínio são prefixadas "DC="nesses atributos. O mais à esquerda DC=conterá o seu nome de domínio netbios.

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

mydomain é o nome de domínio netbios.

EDIT:
Como Brian Desmond aponta, esta não é necessariamente a maneira autorizada de encontrar o nome netbios real, é apenas coincidência que eles geralmente se correlacionam. Veja a resposta do BoyMars para obter autoridade.

squillman
fonte
prestar atenção para netbios limite de 15 caracteres ao usar os valores de uma fqdn ou string DN, eu não vi muitos domínios que usam uma cadeia que por muito tempo embora :)
BoyMars
Obrigado @squillman, mas quando criei esse domínio, propositadamente fiz com que o nome de domínio netbios não fosse a primeira parte do FQDN, apenas porque era possível e preciso verificar os limites, pois meu código precisa funcionar em vários ambientes. Portanto, no meu caso, o FQDN é test.kirkdev.local (o exemplo de usuário dn é "CN = George Washington, CN = Usuários, DC = teste, DC = kirkdev, DC = local"), mas o nome de domínio netbios é kirkdev.
21411 Kirk Liemohn
Se você estiver usando o Windows, dsquery computer OU=OU,OU=You,OU=Need,DC=local.domain -o rdnfornece o que deseja, com o nome NetBIOS entre aspas. Como é relativo, você não precisará obter o caminho completo. Não tenho certeza se isso vai ajudar o OP; ele perguntou sobre LDAP, portanto, essa não é uma resposta LDAP pura.
21811 Sonuei2f
@alharaka, obrigado pelo comentário, mas estamos consultando o AD a partir de um computador que não seja do MS. Poderíamos potencialmente lidar com isso, mas realmente queremos que isso faça parte de uma consulta LDAP. Parece que o dsquery é uma ferramenta de linha de comando do Windows Server.
Kirk Liemohn
1
Desculpe, mas isso está incorreto. Não existe absolutamente nenhuma relação entre o principal componente do domínio (por exemplo, dc = meudomínio) e o nome NetBIOS do domínio. É apenas uma coincidência comum que eles concordem.
Brian Desmond
0

Se você tiver o Nome Principal do Usuário ou o DN, poderá usar a biblioteca COM do ActiveDS para converter os valores. Abaixo está um exemplo para converter UserPrincipalName em 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
fonte
Obrigado pela resposta, mas preciso fazer isso em uma máquina que não seja Windows e, idealmente, por meio de uma consulta LDAP.
22911 Kirk Liemohn