是否有一种简单的方法可以解析Active Directory中域名的Active Directory路径?
E.g。您的用户帐户可能是SITE \ Username或DEPARTMENT \ Username,但域SITE的实际路径可能是site.company.com或DEPARTMENT可能是dep.company.com等
我正在尝试找到一种方法将DEPARTMENT转换为DC = dep,DC = company,DC = com等,以便在Active Directory中正确搜索...
答案 0 :(得分:2)
您可能拥有的是一家公司,其中包含一个forrest(company.com)和一些子域名(在您的案例中为SITE和DEPARTMENT)。 SITE和DEPARTMENT位是域的NetBIOS表示。它们与相应的DNS名称不同并不常见,但它是可能的。请确保我们不是在讨论OU:s和“物理”Active Directory站点。
假设上述情况,这里有几个选项:
以下假设您的应用程序在具有“forrest-wide read access”的帐户下运行(能够访问您的不同域):
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);
(我还没有找到“System.DirectoryServices-built-in”方式将domain.company.com转换为DC = domain,DC = company,DC = com,但上面的简单字符串操作应该可以解决问题。 )
如果您使用的是非forrest范围的帐户(或者如果DEPARTMENT和SITE不是同一个forrest中的域,但本身是单独的forrests),那么您将必须维护一个用户名和密码列表以供使用取决于“DEPARTMENT”或“SITE”字符串:
// if(domainNetBios == "DEPARMENT")...
DirectoryContext directoryContext
= new DirectoryContext(DirectoryContextType.Domain,
"DEPARTMENT",
"UserInDEPARTMENT",
"PassForUserInDEPARTMENT");
如果您不愿意绑定到不同的forrests /域以获取域名/组件,您可以尝试以下方式:
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名称的第一部分相同,并且DNS解析正常工作。我们上面要做的是查询域控制器列表,然后从DNS名称中删除主机名。不是特别干净的选择...