10

我正在使用LogonUser来验证用户的一组域凭据。

LogonUser(accountName, domain, password, 
      LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_WINNT50, ref token);

结果令人不安:

 LogonType    Current Password                Old password
 ===========  ==============================  ========================
 Network      Succeeds                        Succeeds
 Batch        Fails (0x00000569)              Fails (invalid password)
 Interactive  Succeeds                        Fails (invalid password)

故障码:

  • 0x00000569:登录失败:用户在这台计算机上没有被授予请求的登录类型
  • 0x0000052E:登录失败:未知的用户名或密码

细节:

  • 如果用户输入有效凭据,则函数返回true(好的)
  • 如果用户输入无效凭据,则函数返回false(好的)

  • 如果用户更改了密码,并输入了新的有效凭据,则函数返回true. (好的)

  • 如果用户输入无效凭据,则函数返回false(好的)

  • 如果用户输入他们的凭据,则函数返回true(坏的)

注意:如果用户移动到另一台机器(他们以前从未登录过的机器)并输入凭据,LogonUser则继续返回true。这意味着缓存不会发生在本地机器上——而是以某种方式“在网络上”发生。

  • 如果用户再次更改密码并输入的凭据,则函数返回true. (好的)
  • 如果用户输入他们的凭据,则函数返回true(坏的)
  • 如果用户输入他们的旧凭据,则函数返回false(好的)

如何,在调用LogonUser时我可以指示它指示域不使用缓存的凭据

注意:如果用户尝试使用其旧(或旧)密码登录 Windows,则会收到无效密码错误。


来自 MSDN:

LOGON32_LOGON_NETWORK
此登录类型旨在供高性能服务器验证明文密码。LogonUser 函数不缓存此登录类型的凭据。

LOGON32_LOGON_INTERACTIVE
此登录类型适用于将以交互方式使用计算机的用户,例如通过终端服务器、远程 shell 或类似进程登录的用户。这种登录类型需要为断开连接的操作缓存登录信息的额外费用;因此,它不适用于某些客户端/服务器应用程序,例如邮件服务器。

LOGON32_LOGON_BATCH 此登录类型适用于批处理服务器,其中进程可以代表用户执行而无需他们的直接干预。此类型也适用于一次处理许多纯文本身份验证尝试的高性能服务器,例如邮件或 Web 服务器。

正在验证纯文本密码,因此使用LOGON32_LOGON_NETWORK. 交互式登录缓存凭据,此处不允许这样做。Batch虽然没有记录何时应该使用它,但它只是失败了。


更新:该域仅允许:

  • 以前的密码(不再返回)
  • 仅60分钟

对我来说很明显,它是 Active Directory 的一个“功能”,它提供 1 小时的宽限期。

除了我不想要宽限期,而且我不想更改域上的任何设置(因为我不知道域上的任何设置允许使用旧密码一小时的宽限期) .

4

1 回答 1

4

这是 NTLM 的一个功能。您可以更改默认的 60 分钟。通过在几分钟内添加一个OldPasswordAllowedPeriodDWORD 值来HKLM\SYSTEM\CurrentControlSet\Control\Lsa键入域控制器,或者您可以禁用“强制密码历史记录”策略。您也可以尝试使用其他登录提供程序,例如LOGON32_PROVIDER_WINNT50.

顺便说一句,如果您已经提供了 GUI,我认为使用LOGON32_LOGON_INTERACTIVE.

于 2012-05-01T00:51:22.473 回答