@Brian Desmond 和@lordzero。可能有点晚了,但我最近自己也在研究这类东西,所以我想分享一下。
为了回答您的问题“您的搜索根是什么?”,lordzero,您可以在不知道 AD 服务器的情况下从它们中找到它。域注册的 PC 将知道 AD 基础设施/森林等。
首先,为“GC://rootDSE”创建一个 DirectoryEntry
您可以从中提取命名上下文、rootDomainNamingContext 或其他。您可以转储第一个根 DSE DirectoryEntry 的所有属性以查看可用的内容。
这是我对我们使用的目录服务服务提供商的实现。
这是取自 DirectorySearcher 包装类
我有一个成员变量。并在构造函数中实例化它。
DirectorySearcher directorySearcher;
在我的初始化方法中,我这样做
using (DirectoryEntry directoryEntry = new DirectoryEntry(DirectoryConstants.RootDSE))
{
// Create a Global Catalog Directory Service Searcher
string strRootName = directoryEntry.Properties[DirectoryConstants.RootDomainNamingContext].Value.ToString();
using (DirectoryEntry usersBinding = new DirectoryEntry(DirectoryConstants.GlobalCatalogProtocol + strRootName))
{
directorySearcher.SearchRoot = usersBinding;
directorySearcher.ClientTimeout = timeout;
directorySearcher.CacheResults = true;
result = true;
initialized = true;
}
}
DirectoryConstants 类属性
public static string RootDSE { get { return @"GC://rootDSE"; } }
public static string RootDomainNamingContext { get { return "rootDomainNamingContext"; } }
public static string GlobalCatalogProtocol { get { return @"GC://"; } }
我确信这仅适用于登录到域注册 PC 的域用户。身份验证在幕后自动处理。如果您的用户登录到本地帐户或计算机不在域中,您很可能会收到 DirectoryServicesCOMException。
希望这可以帮助。如果您不担心处置和 StyleCop/Sonar 编码违规,请放弃“使用”结构!
上述代码所在的 DirectorySearcherWrapper 类随后由服务提供者代码使用。它像这样分开,因此很容易被模拟,因为不能保证构建机器在执行我们的单元测试时注册到域。
...大部分来自 MSDN/.Net 文档。