Get-ADUser commandlet 后面的 LDAP 查询

sva*_*kak 3 powershell active-directory

如何查看由 Get-ADUser在后台执行的 LDAP 查询,即。这个命令

Get-ADUser -Filter * -Properties * | Where { $_.Enabled -eq $True } | Where { $_.PasswordNeverExpires -eq $False } | Where { $_.PasswordExpired -eq $False }
Run Code Online (Sandbox Code Playgroud)

我想知道发送到 Active Directory 服务器的确切 LDAP 查询。

编辑:我正在尝试将一些 Powershell 脚本转换为 Python,因此我需要可以提供给 python-ldap 的原始 LDAP 查询。

Edit2:Active Directory 管理中心有很好的学习 LDAP 查询的功能。在全局搜索中,您可以使用关键字和勾选复选框来构建查询,然后单击Convert to LDAP。享受漂亮而复杂的 LDAP 查询。

图形用户界面

Rya*_*ies 7

如果您真的想知道 Powershell Cmdlets 正在执行哪些确切的 LDAP 查询,那么您可以使用 DotPeek 反编译它们,使用我在此处概述的方法:

https://www.myotherpcisacloud.com/post/2013/07/08/Taking-a-Peek-Inside-Powershell-Cmdlets.aspx

$(Get-Command Get-ADUser).DLL看什么DLL的cmdlet的进口。然后使用Trace-Command来查看 DLL 中调用的方法的名称Get-ADUser

Trace-Command -Name CommandDiscovery -Expression { Get-ADUser bob } -PSHost
Run Code Online (Sandbox Code Playgroud)

现在使用 JetBrains DotPeek 反编译该 DLL 并自己查看代码。


或者,与其经历所有这些混乱,不如这样做:

Get-ADUser -LDAPFilter "(objectCategory=person)"
Run Code Online (Sandbox Code Playgroud)

现在您确切地知道(并可以控制)它正在使用什么 LDAP 查询。

  • 对于几乎所有的“Get-Ad*”操作,我都会选择“-LDAPFilter”而不是“-Filter”。感谢您的 DotPeek 链接。 (3认同)
  • `-Filter` 在预编译匹配规则方面有其优点,例如 `Enabled -eq $True` 与 `(&(!userAccountControl:1.2.840.113556.1.4.803:=2))` (3认同)

Mat*_*sen 6

ActiveDirectory模块具有巧妙的逻辑,可以计算“流行”属性,例如用户帐户是否EnabledPasswordNeverExpires设置或已设置并像常规属性一样呈现它们。

在内部,它们源自实际帐户属性,例如userAccountControlpwdLastSet

帐号设定

userAccountControl 是一个位域,包含一长串与帐户安全相关的设置,例如“用户无法更改密码”和帐户“已禁用”。

Microsoft 的 LDAP 实现让您可以使用按位运算符过滤此类属性,由对象标识符 (OID) 标识:

  • LDAP_MATCHING_RULE_BIT_AND: 1.2.840.113556.1.4.803
  • LDAP_MATCHING_RULE_BIT_OR : 1.2.840.113556.1.4.804

要查找Disabled帐户,我们可以使用以下过滤器语法:

(&(userAccountControl:1.2.840.113556.1.4.803:=2))
Run Code Online (Sandbox Code Playgroud)

与往常一样,您可以使用 否定 ldap 表达式!,在此示例中检索所有Enabled帐户:

(!(userAccountControl:1.2.840.113556.1.4.803:=2))
Run Code Online (Sandbox Code Playgroud)

同样,名为DONT_EXPIRE_PASSWORD65536 (0x10000) 的设置,我们可以找到这些帐户:

(&(userAccountControl:1.2.840.113556.1.4.803:=65536))
Run Code Online (Sandbox Code Playgroud)

密码过期

计算密码过期时间有点复杂。为了帮助开发人员和集成商,Microsoft 实施了一个名为msDS-User-Account-Control-Computed.

msDS-User-Account-Control-Computed透明地返回与 相同的值userAccountControl,但增加了以下位,在查找时即时计算:

UF_LOCKOUT                     0x0010
UF_PASSWORD_EXPIRED          0x800000
UF_PARTIAL_SECRETS_ACCOUNT  0x4000000
UF_USE_AES_KEYS             0x8000000
Run Code Online (Sandbox Code Playgroud)

我还没有测试过这个,但是如果我没记错的话,这应该可以帮助您使用此过滤器可靠地识别密码过期的帐户

(&(msDS-User-Account-Control-Computed:1.2.840.113556.1.4.803:=8388608))
Run Code Online (Sandbox Code Playgroud)

不幸的是,您不能在 LDAP 查询过滤器中使用构造属性,因此您需要做的是过滤前两个语句:

(&(!userAccountControl:1.2.840.113556.1.4.803:=2)(!userAccountControl:1.2.840.113556.1.4.803:=65536))
Run Code Online (Sandbox Code Playgroud)

请务必向目录服务器询问该msDS-User-Account-Control-Computed值,然后在客户端对结果执行按位 AND 掩码。


归档时间:

查看次数:

4893 次

最近记录:

10 年,10 月 前