我正在呼叫LogonUser尝试验证一组凭据:

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


即使帐户已禁用,它也会返回true:






我也尝试使用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);


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


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


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



令人不安的是,此行为仅在一台计算机上发生。

为什么LogonUser和整个安全支持提供程序界面会指出在加入特定域的计算机上禁用帐户的凭据有效?


已成功加入LogonUser的域加入计算机:Windows XP SP2
LogonUser(正确)失败的域加入的计算机:Windows XP SP2




更新:

没有名为Forest的本地用户:

security - LogonUser对禁用的帐户返回true-LMLPHP

也没有任何称为Forest的本地用户:

security - LogonUser对禁用的帐户返回true-LMLPHP

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

人们得到一堆内裤的原因仅仅是因为允许残障用户访问他们本不应被允许访问的内容。

最佳答案

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

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

可以证明这是由于凭据缓存问题引起的另一件事是捕获域控制器和计算机之间的网络流量。查看是否有任何NTLM或Kerberos通信。默认情况下,它应该使用Kerberos与KDC对话。如果失败,则应使用NTLM与NetLogon服务器对话。

如果凭据缓存是真正的问题,我怀疑您可以通过在AcquireCredentialsHandle调用中使用“ kerberos”而不是“ negotiate”来解决它。

09-25 18:52