我已经使用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();
}
}
希望有人可以看到我在做错什么。
答案 0 :(得分:1)
我认为marc_s走在正确的轨道上。但是您可以使用与DirectoryEntry
相同的方式来指定域。可以将构造函数与only the domain name一起使用,如下所示:
using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "us.psy.com"))
这将搜索您的整个域。
也就是说,如果您已经知道如何使用DirectoryEntry
和DirectorySearcher
,则最好坚持使用。无论如何,AccountManagement
名称空间只是在后台使用它们。它可以使某些事情变得更容易,但对您而言却隐藏了很多东西,从而影响了性能。直接使用DirectoryEntry
和DirectorySearcher
几乎总是会更快。
我在写的文章中谈到了这一点(以及如何从DirectoryEntry
和DirectorySearcher
获得更好的性能):Active Directory: Better Performance