.net 如何在System.DirectoryServices中跨调用保留连接凭据?

.net 如何在System.DirectoryServices中跨调用保留连接凭据?,.net,active-directory,directoryservices,.net,Active Directory,Directoryservices,我正在尝试连接到其他林中的Active Directory域(W2K8R2 DC)。为此,我将凭据传递到以下DirectoryEntry构造函数: DirectoryEntry(string path, string username, string password, AuthenticationTypes authenticationType) 这一切都很好。但我想做的是以某种方式保留连接,并在我对广告的所有调用中重用它,这样我就不需要重复传递凭据。这有可能吗 谢谢 如果您希望在连接级别使

我正在尝试连接到其他林中的Active Directory域(W2K8R2 DC)。为此,我将凭据传递到以下DirectoryEntry构造函数:

DirectoryEntry(string path, string username, string password, AuthenticationTypes authenticationType)
这一切都很好。但我想做的是以某种方式保留连接,并在我对广告的所有调用中重用它,这样我就不需要重复传递凭据。这有可能吗


谢谢

如果您希望在连接级别使用该控件,我建议您使用。您可以重用LDAP连接来进行不同的LDAP查询。然而,编程范例与
DirectoryEntry

如果需要使用
DirectoryEntry
,则必须将用户名和密码存储在某个位置,然后将它们传递给所有
DirectoryEntry
对象。我要做的是编写一个方法
GetDirectoryEntry(string dn)
,并让这个方法使用正确的用户名和密码为我创建
DirectoryEntry
。这看起来不优雅,但它没有做错任何事。如果您希望密码以明文形式存储在内存中,请使用存储密码

这没有错,因为
DirectoryEntry
正在维护自己的LDAP连接池。如果您有多个具有相同用户名和密码的
DirectoryEntry
,它将足够智能,可以共享LDAP连接。这与保持单个LDAP连接并执行不同的LDAP查询基本相同。它不会为每个
DirectoryEntry
对象重新向LDAP服务器进行身份验证

如果您不喜欢依赖
DirectoryEntry
中的黑盒功能,以下建议的解决方法可能会让您感觉更好

static DirectoryEntry GetObject(DirectoryEntry root, string dn)
{
    using (DirectorySearcher searcher = new DirectorySearcher(root))
    {
        searcher.Filter = "(distinguishedName=" + dn + ")";
        searcher.SearchScope = SearchScope.Subtree;
        SearchResult result = searcher.FindOne();
        if (result == null) return null;
        return result.GetDirectoryEntry();
    }
}

您只需要使用用户名和密码绑定到根对象。然后,您可以将根对象保持为静态变量或任何您喜欢的内容。然后,通过将
SearchRoot
设置为根对象进行LDAP查询,您将获得另一个
DirectoryEntry
对象。返回的
DirectoryEntry
仍将使用root用户的用户名和密码。同样,这并没有比简单地将用户名和密码传递给
DirectoryEntry
更好的方法。实际上,就性能而言,情况更糟,因为我们需要再执行一次LDAP查询来获取
DirectoryEntry

如果您希望在连接级别使用该控件,我建议您使用。您可以重用LDAP连接来进行不同的LDAP查询。然而,编程范例与
DirectoryEntry

如果需要使用
DirectoryEntry
,则必须将用户名和密码存储在某个位置,然后将它们传递给所有
DirectoryEntry
对象。我要做的是编写一个方法
GetDirectoryEntry(string dn)
,并让这个方法使用正确的用户名和密码为我创建
DirectoryEntry
。这看起来不优雅,但它没有做错任何事。如果您希望密码以明文形式存储在内存中,请使用存储密码

这没有错,因为
DirectoryEntry
正在维护自己的LDAP连接池。如果您有多个具有相同用户名和密码的
DirectoryEntry
,它将足够智能,可以共享LDAP连接。这与保持单个LDAP连接并执行不同的LDAP查询基本相同。它不会为每个
DirectoryEntry
对象重新向LDAP服务器进行身份验证

如果您不喜欢依赖
DirectoryEntry
中的黑盒功能,以下建议的解决方法可能会让您感觉更好

static DirectoryEntry GetObject(DirectoryEntry root, string dn)
{
    using (DirectorySearcher searcher = new DirectorySearcher(root))
    {
        searcher.Filter = "(distinguishedName=" + dn + ")";
        searcher.SearchScope = SearchScope.Subtree;
        SearchResult result = searcher.FindOne();
        if (result == null) return null;
        return result.GetDirectoryEntry();
    }
}

您只需要使用用户名和密码绑定到根对象。然后,您可以将根对象保持为静态变量或任何您喜欢的内容。然后,通过将
SearchRoot
设置为根对象进行LDAP查询,您将获得另一个
DirectoryEntry
对象。返回的
DirectoryEntry
仍将使用root用户的用户名和密码。同样,这并没有比简单地将用户名和密码传递给
DirectoryEntry
更好的方法。事实上,就性能而言,情况更糟,因为我们需要再执行一次LDAP查询来获取
DirectoryEntry

,我刚刚发现System.DirectoryServices.AccountManagement包含类似的功能;但这对我来说不起作用,因为我需要从Active Directory访问任意字段;但这对我来说不起作用,因为我需要从Active Directory访问任意字段;我想我会选择DirectorySearcher方法。非常感谢您的精彩和详细的回答!这真漂亮。我需要知道
DirectoryEntry
是否真的在维护自己的LDAP连接池,以及我是否真的应该在每次我想查询广告而不是单例时创建一个新的
DirectoryEntry
和关联的
DirectorySearcher
。这有助于回答我的问题并重构我的代码,因为建立LDAP连接的开销只执行一次,而所有其他
DirectoryEntry
实例化都使用连接池功能,并尽可能避免LDAP连接开销。谢谢很好-这看起来很可行;我想我会选择DirectorySearcher方法。非常感谢您的精彩和详细的回答!这真漂亮。我需要知道
DirectoryEntry
是否真的在维护自己的LDAP连接池,以及我是否真的应该在每次我想查询广告而不是单例时创建一个新的
DirectoryEntry
和关联的
DirectorySearcher
。这个帮手