在 Active Directory 中查找锁定的帐户(一种实际有效的方法!)

MrV*_*mes 8 active-directory windows-server-2008-r2

我已经用谷歌搜索了如何列出锁定的帐户,到目前为止发现了两种方法,这两种方法都不起作用......

已保存的查询 - (&(&(&(objectCategory=Person)(objectClass=User)(lockoutTime>=1))))

列出许多帐户,其中许多帐户未被锁定。如果我解锁我碰巧知道被锁定的一个,它仍然会被查询返回。

Powershell 命令 - Search-ADAccount -LockedOut

什么也没做。

所以要么 - 我做错了什么?或者 - 有没有真正有效的方法?

Rya*_*ies 11

我不一定信任Get-ADUser -LDAPFilter "(&(objectCategory=Person)(objectClass=User)(lockoutTime>=1))" -Properties LockedOut,因为它也不会为我返回可靠的结果,但是,此时我也无法直接联系我的 PDCe。为获得最佳结果,您可能希望直接针对您的 PDC 模拟器,因为它始终具有有关整个域中帐户锁定的最新信息。

这就是我打赌你在这里目睹的是复制延迟:

... 帐户锁定紧急复制到主域控制器 (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);
Run Code Online (Sandbox Code Playgroud)

所以它似乎Search-ADAccount -LockedOut也在查看 AccountLockoutTime 属性!

为大正义编辑更多内容:理查德·穆勒 (Richard Mueller),Dir。服务 MVP 是这样说的:

您不能使用 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
Run Code Online (Sandbox Code Playgroud)

最后,我想结束这篇关于该主题的博客文章,它解释了为什么lockoutTime>=1正在接近最佳解决方案,但这只是故事的一部分。您需要进一步过滤列表,以仅包含过去锁定时间大于 $(您的域锁定持续时间)分钟的用户。