【发布时间】:2013-01-02 09:41:44
【问题描述】:
从完全限定的 Active Directory 域名中获取 NETBIOS 域名有时是一项乏味的任务。我找到了一个很好的答案here。
但是,在具有多个林的环境中,如果 PC 不在您正在查询的林中,则此方法将不起作用。这是因为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;
}
【问题讨论】:
-
你应该以问答的形式写出来,或者(可能)你的改进答案应该与原始问题一致。
-
我的编辑请求被拒绝,因为“原帖中的编辑更改太多”
-
将其作为单独的答案发布。拥有更多代表的人以后应该能够合并它们。
-
另一个很好的理由,为什么 NetBIOS 垃圾应该立即和永远被埋葬,让 DNS 最终做到这一点。
标签: c# active-directory directoryservices