我正在使用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
此登录类型适用于将以交互方式使用计算机的用户,例如由terminal服务器,远程shell或类似进程登录的用户。此登录类型需要额外支出缓存已断开连接的操作的登录信息;因此,不适合某些客户端/服务器应用程序,例如邮件服务器。
LOGON32_LOGON_BATCH
此登录类型适用于批处理服务器,其中进程可能代表用户执行而无需直接干预。此类型也适用于一次处理许多纯文本身份验证尝试的性能较高的服务器,例如邮件或Web服务器。
我 am 验证纯文本密码,因此使用LOGON32_LOGON_NETWORK
。 交互式登录缓存凭据,此处不允许这样做。 批量,虽然没有记录应该何时使用,但却失败了。
更新:域名仅允许:
我很清楚,它是Active Directory的“功能”,可以提供1小时的宽限期。
除了我不想要宽限期,我不想更改域上的任何设置(因为我不知道域上的任何设置会允许你使用一小时的宽限期旧密码)。
答案 0 :(得分:4)
这是NTLM的一个特色。您可以更改默认的60分钟。通过在域控制器上向OldPasswordAllowedPeriod
密钥添加HKLM\SYSTEM\CurrentControlSet\Control\Lsa
DWORD值(以分钟为单位),或者您可以禁用“强制密码历史记录”策略。您也可以尝试使用其他登录提供程序,例如LOGON32_PROVIDER_WINNT50
。
顺便说一句,如果您已经提供了GUI,我认为使用LOGON32_LOGON_INTERACTIVE
没有任何不利之处。