我正在使用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 小时的宽限期。
除了我不想要宽限期,而且我不想更改域上的任何设置(因为我不知道域上的任何设置允许使用旧密码一小时的宽限期) .