Как получить доменное имя NETBIOS, используя полное доменное имя в сложной среде
Получение доменного имени NETBIOS из полного доменного имени Active Directory иногда является утомительной задачей. Я нашел хороший ответВот.
Однако в среде с несколькими лесами этот подход не будет работать, если ПК не находится в лесу, к которому вы обращаетесь. Это потому чтоLDAP://RootDSE
запросит информацию для домена компьютера.
Кто-то может спросить: почему так сложно? Просто используйте имя перед первой точкой, полученной с помощью:
ActiveDirectory.Domain.GetComputerDomain().Name;
Или просто получите доменное имя пользователя:
Environment.GetEnvironmentVariable("USERDOMAIN");
или же
Environment.UserDomainName;
НО доменное имя NETBIOS может быть совершенно другим, и вы или ваш компьютер могут находиться в другом домене или лесу! Таким образом, этот подход применим только в простой среде.
DJ KRAZE's Решение требует только одну небольшую модификацию, чтобы разрешить междоменные запросы. Это предполагает доверительные отношения!
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;
}