如何使用DirectoryServices AccountManagement查找用户?

时间:2019-06-29 02:47:59

标签: c# ldap directoryservices

我已经使用DirectoryEntry和DirectorySearcher相当一段时间了,并且它始终有效。最近,我了解了AccountManagement,并认为我会为一个新项目尝试一下。但是我找不到它。

此旧代码可以正常工作:

Using oDirectoryEntry As DirectoryEntry = New DirectoryEntry("LDAP://us.psy.com", "xxx2yyy", "MyStrongPwd")
    Using oDirectorySearcher As DirectorySearcher = New DirectorySearcher(oDirectoryEntry)
        oDirectorySearcher.Filter = "(&(sAMAccountType=805306368)(sAMAccountName=xxx2yyy))"
        Try
            Return oDirectorySearcher.FindOne IsNot Nothing
        Catch
            Return False
        End Try
    End Using
End Using

但是我无法完成这项工作:

using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "US", "DC=psy,DC=com"))
{
    MessageBox.Show(context.ConnectedServer); // This shows me the server name
    using (UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "xxx2yyy"))
    {
        MessageBox.Show(user.SamAccountName); // results in Object reference not set to an instance of an object
        user.ChangePassword("OldPwd", "NewPwd");
        user.Save();
    }
}

希望有人可以看到我在做错什么。

1 个答案:

答案 0 :(得分:1)

我认为marc_s走在正确的轨道上。但是您可以使用与DirectoryEntry相同的方式来指定域。可以将构造函数与only the domain name一起使用,如下所示:

using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "us.psy.com"))

这将搜索您的整个域。

也就是说,如果您已经知道如何使用DirectoryEntryDirectorySearcher,则最好坚持使用。无论如何,AccountManagement名称空间只是在后台使用它们。它可以使某些事情变得更容易,但对您而言却隐藏了很多东西,从而影响了性能。直接使用DirectoryEntryDirectorySearcher几乎总是会更快。

我在写的文章中谈到了这一点(以及如何从DirectoryEntryDirectorySearcher获得更好的性能):Active Directory: Better Performance