Ian*_*oyd 10 security authentication winapi active-directory
我正在使用LogonUser验证用户的域凭据集.
LogonUser(accountName, domain, password,
LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_WINNT50, ref token);
Run Code Online (Sandbox Code Playgroud)
令人不安的结果:
LogonType Current Password Old password
=========== ============================== ========================
Network Succeeds Succeeds
Batch Fails (0x00000569) Fails (invalid password)
Interactive Succeeds Fails (invalid password)
Run Code Online (Sandbox Code Playgroud)
失败代码:
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.交互式登录缓存凭据,此处不允许.批量,虽然没有记录何时应该使用它,但是简单地失败了.
更新:域只允许:
对我来说很明显,它是Active Directory的一个"功能",它给出了1小时的宽限期.
除了我不想要宽限期,我不想更改域上的任何设置(因为我不知道域上的任何设置将允许使用旧密码一小时的宽限期) .
这是 NTLM 的一个功能。您可以更改默认的 60 分钟。OldPasswordAllowedPeriod通过在几分钟内添加DWORD 值HKLM\SYSTEM\CurrentControlSet\Control\Lsa到域控制器上的密钥,或者您可以禁用“强制密码历史记录”策略。您也可以尝试使用其他登录提供程序,例如LOGON32_PROVIDER_WINNT50.
顺便说一句,如果您已经提供了 GUI,我认为使用LOGON32_LOGON_INTERACTIVE.