我已经在 Google 上搜索过如何列出已锁定的帐户,到目前为止发现了两种方法,但都不起作用……
已保存的查询 -(&(&(&(objectCategory=Person)(objectClass=User)(lockoutTime>=1))))
列出许多帐户,其中许多帐户未被锁定。如果我解锁一个恰好知道已被锁定的帐户,查询仍会返回该帐户。
Powershell 命令 -Search-ADAccount -LockedOut
什么也没做。
那么,要么 - 我做错了什么?要么 - 有实际有效的方法吗?
答案1
我不一定信任Get-ADUser -LDAPFilter "(&(objectCategory=Person)(objectClass=User)(lockoutTime>=1))" -Properties LockedOut
,因为它也没有为我返回可靠的结果,但另一方面,我目前也无法直接联系我的 PDCe。为了获得最佳结果,您需要直接定位您的 PDC 模拟器,因为它始终拥有有关整个域中帐户锁定的最新信息。
这就是我敢打赌你在这里看到的复制延迟:
... 帐户锁定被紧急复制到主域控制器 (PDC) 模拟器角色所有者,然后紧急复制到以下位置:
• 与 PDC 模拟器位于同一站点的同一域中的域控制器。
• 与处理帐户锁定的域控制器位于同一域且位于同一站点的域控制器。
• 位于同一域中的域控制器,这些域控制器位于已配置为允许站点之间进行更改通知(因此允许紧急复制)的站点,这些站点与包含 PDC 仿真器的站点或处理帐户锁定的站点位于同一站点链接中的任何站点,或与包含处理帐户锁定的域控制器的站点位于同一站点链接中的任何站点。
此外,当在 PDC 仿真器以外的域控制器上身份验证失败时,将在 PDC 仿真器上重试身份验证。因此,如果达到错误密码尝试阈值,PDC 仿真器将在处理失败密码尝试的域控制器之前锁定帐户。有关 PDC 仿真器角色所有者如何管理密码更改和帐户锁定的详细信息,请参阅本书中的“管理灵活的单主机操作”。
因此,请尝试Search-ADAccount -LockedOut -Server DC-PDCE
看看结果是否有所改善。
此外,围绕 lockoutTime 属性构建查询时还需要考虑以下几点:
此属性值仅在帐户成功登录时重置。这意味着此值可能不为零,但帐户并未被锁定。要准确确定帐户是否被锁定,您必须将 Lockout-Duration 添加到此时间,并将结果与当前时间进行比较,同时考虑当地时区和夏令时。
编辑:通过逆向工程Microsoft.ActiveDirectory.Management.dll
,我可以告诉你Search-ADAccount -LockedOut
,它运行以下代码,在我看来,它能产生非常可靠的结果:
else if ((bool) this._paramSet.LockedOut)
{
list.Add(ADAccountFactory<ADAccount>.AttributeTable[cmdletSessionInfo.ConnectedADServerType]["AccountLockoutTime"].InvokeToSearcherConverter(ADOPathUtil.CreateFilterClause(ADOperator.Ge, "AccountLockoutTime", (object) 1), cmdletSessionInfo));
this.OutputFilterFunction = new ADGetCmdletBase<SearchADAccountParameterSet, ADAccountFactory<ADAccount>, ADAccount>.OutputFilterDelegate(this.FilterIsLockedOut);
}
if (list.Count > 0)
this.OutputSearchResults(list.Count != 1 ? ADOPathUtil.CreateAndClause(list.ToArray()) : list[0]);
else
this.OutputSearchResults((IADOPathNode) null);
因此看起来也在Search-ADAccount -LockedOut
查看 AccountLockoutTime 属性!
为了实现伟大的正义,请再编辑一些内容:服务总监 Richard Mueller 表示:
您无法使用 userAccountControl 属性来识别被锁定的用户。有少量的 userAccountControl 文档记录了这一点,但并未使用。
我可以这样验证这一点:
PS C:\Users\ryan> $(Search-ADAccount -LockedOut).Count
11
PS C:\Users\ryan> $(Get-ADUser -LDAPFilter "(&(objectCategory=User)(userAccountControl:1.2.840.113556.1.4.803:=16))").Count
0
最后,我想结束一下这篇关于该主题的博客文章,这解释了为什么 正在lockoutTime>=1
接近最佳解决方案,但这只是故事的一部分。您需要进一步筛选列表,以仅包含过去 lockoutTime 大于 $(your domain lockout duration) 分钟的用户。