Как получить доменное имя 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;
    }