我正在尝试使用.NET System.DirectoryServices.AccountManagement库来获取特定Active用户的UserPrincipal。
我有以下代码:
PrincipalContext context = new PrincipalContext(ContextType.Domain, "DomainName");
userPrincipal = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, username);这段代码是作为有效的域用户运行的,但是当我执行它时,我会得到以下异常:
System.DirectoryServices.DirectoryServicesCOMException (0x8007052E):登录失败:用户名未知或密码错误。
有趣的是,我可以使用相同的上下文进行以下调用,而不存在任何问题:
context.ValidateCredentials(username, password, ContextOptions.Negotiate)想法?
发布于 2011-03-01 19:57:45
您需要使用接受用户名和密码的PrincipalContext构造函数。
验证工作的原因是因为它使用提供的凭据绑定到目录。
发布于 2011-03-02 06:47:44
听起来你有一个存储的网络凭证。在Windows中,可以指定在试图访问网络资源时使用不同的网络凭据。我可以通过设置错误的网络凭据来重现与您所看到的问题完全相同的问题。
假设您的域名为yourdomain.com,您可以告诉Windows在与任何具有足够yourdomain.com的计算机对话时始终使用特定的用户名和密码。
=== Windows 7/2008 ===
启动“Manager".
Add a Windows credentials*.yourdomain.com=== Windows /2000/2003 ===
在“control keymgr.dll
*.yourdomain.com
如果这确实是您面临的问题,那么简单的解决方法就是删除存储的密码。
为什么context.ValidateCredentials(用户名,密码,ContextOptions.Negotiate)能工作?这只是因为您正在初始化另一个Kerberos/NTLM身份验证,因为您再次提供了uername和password。在幕后,如果选择Kerberos,它将向域控制器发送提供的用户名和密码,并交换Kerberos TGT票证。然后,您的机器使用这个TGT票据在LDAP服务器上获得一个服务票证。然后,您的机器将将此服务票证发送到LDAP服务器。请注意,此服务票证不会保留在当前登录会话中。
为什么UserPrincipal.FindByIdentity不能工作?如果您没有任何存储的密码,通常情况下,它应该可以工作,因为Windows将只使用当前登录用户TGT票证来交换LDAP服务器服务票证。没有涉及用户名/密码验证过程。但是,如果您有一个错误的用户名密码,Windows会认为它不应该使用当前登录用户TGT票证。相反,它应该使用存储的网络密码获得一个新的TGT票据。这就是你看到System.DirectoryServices.DirectoryServicesCOMException (0x8007052E): Logon failure: unknown user name or bad password.的原因
https://stackoverflow.com/questions/3579588
复制相似问题