猿问

如何使用 DirectoryServices AccountManagement 查找用户?

我使用 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();

    }

}

希望有人能看到我做错了什么。


万千封印
浏览 141回答 1
1回答

白衣染霜花

我认为 marc_s 走在正确的轨道上。但是您可以像使用DirectoryEntry. 您可以使用仅包含域名的构造函数,如下所示:using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "us.psy.com"))这将搜索您的整个域。也就是说,如果您已经知道如何使用DirectoryEntryand DirectorySearcher,那么最好坚持使用它。无论如何,命名AccountManagement空间只是在后台使用它们。它可以使一些事情变得更容易,但它对你隐藏了很多东西,这会损害性能。直接使用DirectoryEntryandDirectorySearcher几乎总是会执行得更快。
随时随地看视频慕课网APP
我要回答