完全修飾 Active Directory ドメイン名から NETBIOS ドメイン名を取得するのは、面倒な作業になる場合があります。ここで良い答えを見つけました。
ただし、複数のフォレストがある環境では、PC が照会しているフォレストにない場合、このアプローチは機能しません。これは、LDAP://RootDSE
がコンピューターのドメインの情報を照会するためです。
「なぜそんなに複雑なの?」と尋ねる人もいるかもしれません。次の方法で取得した最初のドットの前に名前を使用するだけです。
ActiveDirectory.Domain.GetComputerDomain().Name;
または、ユーザーのドメイン名を取得します。
Environment.GetEnvironmentVariable("USERDOMAIN");
また
Environment.UserDomainName;
しかし、NETBIOS ドメイン名はまったく異なるものである可能性があり、あなたまたはあなたのコンピューターは別のドメインまたはフォレストにある可能性があります! したがって、このアプローチは単純な環境でのみ使用できます。
DJ KRAZE のソリューションは、クロスドメイン クエリを可能にするために 1 つの小さな変更を加えるだけで済みます。これは信頼関係を前提としています!
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;
}