您可能拥有的是一家拥有一个 forrest (company.com) 和几个子域(在您的情况下为 SITE 和 DEPARTMENT)的公司。 SITE 和 DEPARTMENT 位是域的 NetBIOS 表示。它们与相应的 DNS 名称不同并不常见,但这是可能的。请确保我们不是在谈论 OU:s 和“物理”Active Directory 站点。
假设上述情况,这里有几个选项:
以下假设您的应用程序在具有“forrest 范围的读取访问权限”(访问不同域的能力)的帐户下运行:
using System.DirectoryServices.ActiveDirectory;
// ...
DirectoryContext directoryContext
= new DirectoryContext(DirectoryContextType.Domain, "DEPARTMENT");
Domain domain = Domain.GetDomain(directoryContext);
String domainName = domain.Name;
String domainComponent = "DC=" + domainName.Replace(".", ",DC=");
Console.WriteLine(domainComponent);
(我还没有找到将 domain.company.com 转换为 DC=domain,DC=company,DC=com 的“System.DirectoryServices-built-in”方法,但上面的简单字符串操作应该可以解决问题。 )
如果您使用的是非 forrest 范围的帐户(或者如果 DEPARTMENT 和 SITE 不是同一个 forrest 中的域,而是各自独立的 forrest),那么您必须维护一个用户名和密码列表以使用取决于“DEPARTMENT”或“SITE”字符串:
// if(domainNetBios == "DEPARMENT")...
DirectoryContext directoryContext
= new DirectoryContext(DirectoryContextType.Domain,
"DEPARTMENT",
"UserInDEPARTMENT",
"PassForUserInDEPARTMENT");
如果您不愿意绑定到不同的 forrest/域来获取域名/组件,您可以尝试以下方式:
IPAddress[] addresses = Dns.GetHostAddresses("DEPARTMENT");
IPHostEntry host = Dns.GetHostEntry(addresses[0]);
Int32 dotIndex = host.HostName.IndexOf('.');
String domain =
host.HostName.Substring(dotIndex + 1, host.HostName.Length - dotIndex - 1);
Console.WriteLine(domain);
但以上假设 NETBios-name 与 DNS-name 的第一部分相同,并且 DNS 解析工作正常。我们在上面所做的是查询域控制器列表,然后从 DNS 名称中删除主机名。不是一个特别干净的选择...