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