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. Eu 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 fornecer acesso LDAP a vários domínios e, por meio da configuração em um aplicativo, mapeamos propriedades LDAP para propriedades de perfil de usuário no aplicativo. Com o AD típico, o FQDN e o nome de domínio netbios são os mesmos para todos os usuários, mas com o GC envolvido, precisamos dessas informações adicionais. Nós realmente só precisamos 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?

    
por Kirk Liemohn 10.02.2011 / 20:48

5 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, filtrou os atributos "construídos". Usando o botão Filtro na parte inferior direita da tela de propriedades, consegui mostrar esses atributos adicionais.

O "msDS-PrincipalName" parece ter "[nome do 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 Atributo "msDS-PrincipalName". Isso é bom no meu caso, porque meu outro sistema (SharePoint) também não reconhece essa mudança.

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 atributo "userPrincipalName", mas afeta o atributo "msDS-PrincipalName". Isso é exatamente o que eu quero porque meu outro sistema (SharePoint) reconhece essa mudança.

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

    
por 11.02.2011 / 16:45
3

Para responder sua última pergunta, você deve 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 as propriedades name e netBIOSName . Caso contrário, acho que você teria que obtê-lo de um fqdn / DN, como o squillman sugere.

    
por 10.02.2011 / 21:47
3

Para uma aplicação? A Microsoft torna isso bastante simples no .NET. Isso deve fornecer uma lista de nomes de domínio Netbios que você pode usar para criar uma lista de objetos personalizados com os nomes de domínio DN / DNS / Netbios 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) o atributo chamado isMemberOfPartialAttributeSet. Usando o Microsoft SysInternals AD Explorer, você pode pesquisar o contêiner Esquema em um domínio e procurar por qualquer objeto que tenha o isMemberOfPartialAttributeSet = true para ver todos os atributos que estão disponíveis para uma consulta do 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;
}
    
por 05.06.2011 / 17:27
1

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

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

mydomain é o nome de domínio do netbios.

EDITAR:
Como Brian Desmond aponta, isso não é necessariamente a maneira autoritária de encontrar o nome real do netbios, é apenas coincidência que eles geralmente se correlacionam. Veja a resposta do BoyMars para o modo autoritário.

    
por 10.02.2011 / 21:04
0

Se você tiver o Nome Principal do Usuário ou o DN, poderá usar a biblioteca COM do ActiveDS para traduzir os valores. Abaixo está um exemplo para traduzir o nome UserPrincipalName para 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);
        }
    }
}
    
por 05.06.2011 / 16:30