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