对于已禁用的帐户,LogonUser返回true

时间:2012-03-19 14:06:09

标签: security winapi active-directory sspi

我打电话给LogonUser尝试验证一组凭据:

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

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

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);

返回 false 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 人们只是因为允许残疾用户访问他们应该不允许访问的内容而将他们的内裤放在一堆。

2 个答案:

答案 0 :(得分:1)

我同意Luke很可能,它正在使用缓存凭据。能够ping域控制器并不意味着它能够正确地与它通信。

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

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

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

答案 1 :(得分:0)

如果您使用LOGON32_LOGON_INTERACTIVE会怎样?只需浏览文档和NETWORK选项,您就可以获得不同类型的令牌,这样我就可以设想您所看到的行为。