4

我正在调用LogonUser以尝试验证一组凭据:

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

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

在此处输入图像描述


我还尝试直接使用 SSPI 来验证凭据,这涉及调用:

  • 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

在此处输入图像描述

也没有任何本地用户调用Forest

在此处输入图像描述

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

oi vay人们只是因为允许残疾用户访问他们不应该被允许访问的东西而把他们的内裤弄成一堆。

4

2 回答 2

1

我很可能同意卢克的观点,它使用了缓存的凭据。能够 ping 域控制器并不意味着它能够正确地与它对话。

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

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

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

于 2012-03-22T00:30:08.853 回答
0

如果你LOGON32_LOGON_INTERACTIVE改为使用会发生什么?只需浏览文档和 NETWORK 选项即可获得不同类型的令牌,因此我可以设想您所看到的行为。

于 2012-03-19T16:22:47.353 回答