2012-03-19 150 views
4

我打电话LogonUser尝试验证的一组凭据返回true:的LogonUser为禁用的帐户

LogonUser("forest", "avatopia.com" "stapler", 
     LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_WINNT50, out token); 

,并返回,即使该帐户已禁用:

enter image description here


我也尝试过使用SSPI directly to validate credentials,这 需要调用:

  • AcquireCredentialsHandle(..., "Negotiate", SECPKG_CRED_OUTBOUND, ..., ["forest", "stapler", "avatopia.com"], ...)
  • InitializeSecurityContext(...)
  • AcquireCredentialsHandle(..., "Negotiate", SECPKG_CRED_INBOUND, ...)
  • AcceptSecurityContext(...)
  • InitializeSecurityContext(...)
  • AcceptSecurityContext(...)

在大多数机器上,如果用户帐户被禁用,初始呼叫AcquireCredentialsHandle将失败 。但在这个特定的机器上,我 测试它完成整个周期和工作。


如果我无效密码尝试然后LogonUser没有(正确)失败

LogonUser("forest", "avatopia.com" "adf342sdf3", 
     LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_WINNT50, out token); 

回报,并GetLastError回报1326(登录失败:未知的用户名或密码)

试图SSPI使用无效密码也(正确)失败:

  • AcquireCredentialsHandle(..., "Negotiate", SECPKG_CRED_OUTBOUND, ..., ["forest", "adf342sdf3", "avatopia.com"], ...)
  • InitializeSecurityContext(...)
  • AcquireCredentialsHandle(..., "Negotiate", SECPKG_CRED_INBOUND, ...)
  • AcceptSecurityContext(...)失败8009030C登录尝试失败

什么是aggrevating是,这种行为只发生在一台机器。

为什么LogonUser以及整个安全支持提供程序接口指示特定加入域的计算机上禁用帐户的密码:有效?

  • 加入域的计算机,其中LogonUser(错误地)成功:Windows XP SP2的
  • 加入域的计算机,其中LogonUser(正确)将失败:Windows XP SP2的

更新:

没有本地用户调用Forest

enter image description here

也没有任何本地用户名为Forest

enter image description here

这是无关紧要的,因为我要求avatopia.com\Forest,而不是speeder\Forest

oi vay仅仅因为禁用用户被允许访问他们本不应该访问的东西,人们就把他们的内裤放在一堆。

+0

也许有一个同名的本地用户在域用户处于活动状态时被禁用?对我来说,看起来你正在查看本地管理管理单元中的用户。这是否也显示禁用的域用户? – 2012-03-19 14:09:44

+0

@ThorstenDittmar我检查了;我会添加屏幕截图到问题。 – 2012-03-19 14:11:54

+1

也许是一个愚蠢的问题,但是当这种情况发生时,你可以从那台机器到达域控制器吗?可能正在使用缓存的凭据。 – Luke 2012-03-20 14:25:49

回答

0

如果您改用LOGON32_LOGON_INTERACTIVE会发生什么?只需浏览文档和NETWORK选项就可以获得不同类型的标记,以便我可以设想您所看到的行为。

1

我同意Luke很可能使用缓存的凭据。能够ping域控制器并不意味着它能够正确地对话。

您可以尝试的一个测试是使用该林登录帐户登录该计算机。是的,您可能需要授予他交互式登录权才能执行此操作,但仅用于故障排除目的。

你可以做的另一件事是证明这是由于证书缓存问题是为了捕获域控制器和你的机器之间的网络流量。查看是否有任何NTLM或Kerberos流量。默认情况下,它应该使用Kerberos与KDC进行通信。如果失败,它应该使用NTLM与NetLogon服务器通信。

如果证书缓存是真正的问题,我怀疑你可以在AcquireCredentialsHandle的调用中使用“kerberos”而不是“negotiate”来修复它。