使用 LOGON32_LOGON_NETWORK 从 Delphi 反复调用 LogonUser 会导致帐户被锁定吗?
Posted
技术标签:
【中文标题】使用 LOGON32_LOGON_NETWORK 从 Delphi 反复调用 LogonUser 会导致帐户被锁定吗?【英文标题】:Will repeatedly calling LogonUser from Delphi with LOGON32_LOGON_NETWORK cause the account to be locked? 【发布时间】:2016-07-20 23:03:52 【问题描述】:当使用 LogonUser()
和 LOGON32_LOGON_NETWORK
验证用户的 Windows 登录名和密码时,即使错误密码的检查次数超过用户的安全策略允许的次数,它似乎也不会导致其帐户被锁定。
有一个类似的问题:
Incorrect password passed to LogonUser() but the Active Directory account is not locked as expected
但在他们的案例中,他们使用的是LOGON32_LOGON_INTERACTIVE
。
在我的情况下,域控制器可用于验证登录,但从documentation 中不清楚使用LOGON32_LOGON_NETWORK
是否意味着它不通过域控制器进行身份验证,只是它不会缓存凭据如果他们是正确的。
我正在寻找一个策略设置,如果 LogonUser()
使用错误密码的次数过多,它将锁定 Windows 域帐户。
编辑:帮助澄清情况的附加信息。
在我的 XE2 开发机器上使用正确的 domain\user 但不正确的 password 调用 LoginUser()
时,结果为 false。打电话给SysUtils.SysErrorMessage(System.GetLastError)
给我:
操作成功完成
在客户端站点的任何机器上执行的相同测试显示:
登录失败:未知用户名或密码错误
在他们的任何一台机器上继续测试最终会得到报告:
引用的帐户当前被锁定,可能无法登录
我想确定的是为什么该客户端的行为有所不同,因为我们希望我们域上的系统也锁定帐户。也许它是 Windows 帐户的属性?
【问题讨论】:
我认为您检查错误代码的方式一定有问题 - 如果调用失败,错误代码永远不应为零。 (我怀疑帐户没有被锁定的原因是登录尝试在检查密码之前失败。但没有实际的错误代码,这纯粹是猜测。)我可以确认使用@987654330 @ 登录类型不会阻止系统尝试对域控制器进行身份验证。如果域控制器不存在,我不确定它是否可以成功针对缓存的凭据。 (请注意,“LogonUser 不缓存此登录类型的凭据”这一行是在谈论不同类型的缓存凭据。) 【参考方案1】:您要查找的策略设置是Account Lockout Threshold。
我认为这与 Delphi 是调用 API 所涉及的语言这一事实没有任何关系。这纯粹是一个 Windows API / 安全策略问题。
【讨论】:
你是对的。开发域的阈值设置为 0。现在已修复,我们看到与客户端相同的结果。以上是关于使用 LOGON32_LOGON_NETWORK 从 Delphi 反复调用 LogonUser 会导致帐户被锁定吗?的主要内容,如果未能解决你的问题,请参考以下文章
LogonUser 返回 ERROR_NO_LOGON_SERVERS