Como obter o nome de domínio NETBIOS usando o FQDN em um ambiente complexo
Obter o nome de domínio NETBIOS de um nome de domínio totalmente qualificado do Active Directory às vezes é uma tarefa tediosa. Eu encontrei uma boa respostaAqui.
Em um ambiente com várias florestas, essa abordagem não funcionará se o PC não estiver na floresta que você está consultando. Isto é porqueLDAP://RootDSE
consultará informações sobre o domínio do computador.
Alguns podem perguntar: por que tão complicado? Basta usar o nome antes do primeiro ponto recuperado por:
ActiveDirectory.Domain.GetComputerDomain().Name;
Ou apenas obtenha o nome de domínio do usuário:
Environment.GetEnvironmentVariable("USERDOMAIN");
ou
Environment.UserDomainName;
Mas o nome de domínio NETBIOS pode ser algo completamente diferente e você ou seu computador podem estar em um domínio ou floresta diferente! Portanto, essa abordagem é utilizável apenas em um ambiente simples.
DJ KRAZE A solução precisa de apenas uma pequena modificação para permitir consultas entre domínios. Isso pressupõe uma relação de confiança!
private string GetNetbiosDomainName(string dnsDomainName)
{
string netbiosDomainName = string.Empty;
DirectoryEntry rootDSE = new DirectoryEntry(string.Format("LDAP://{0}/RootDSE",dnsDomainName));
string configurationNamingContext = rootDSE.Properties["configurationNamingContext"][0].ToString();
DirectoryEntry searchRoot = new DirectoryEntry("LDAP://cn=Partitions," + configurationNamingContext);
DirectorySearcher searcher = new DirectorySearcher(searchRoot);
searcher.SearchScope = SearchScope.OneLevel;
searcher.PropertiesToLoad.Add("netbiosname");
searcher.Filter = string.Format("(&(objectcategory=Crossref)(dnsRoot={0})(netBIOSName=*))", dnsDomainName);
SearchResult result = searcher.FindOne();
if (result != null)
{
netbiosDomainName = result.Properties["netbiosname"][0].ToString();
}
return netbiosDomainName;
}