如何在后台查看由Get-ADUser执行的LDAP查询,即: 这个命令
Get-ADUser -Filter * -Properties * | Where { $_.Enabled -eq $True } | Where { $_.PasswordNeverExpires -eq $False } | Where { $_.PasswordExpired -eq $False }
我想知道确切的LDAP查询发送到Active Directory服务器。
编辑:我试图将一些Powershell脚本转换为Python,因此我需要原始的LDAP查询,我可以喂python-ldap。
编辑2:Active Directorypipe理中心有很好的学习LDAP查询function。 在全局search中,您可以使用关键字和勾选checkbox构build查询,然后单击转换为LDAP 。 享受漂亮和复杂的LDAP查询。

ActiveDirectory模块具有聪明的逻辑,可以计算“常用”属性,例如用户帐户是否已Enabled或是否设置了PasswordNeverExpires并将其显示为常规属性。
在内部,它们来自实际的账户属性,如userAccountControl和pwdLastSet 。
userAccountControl是一个位域,并包含一个长长的帐户安全相关设置列表,如“用户不能更改密码”和帐户“已禁用”。
微软的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帐户,我们可以使用以下filter语法:
(&(userAccountControl:1.2.840.113556.1.4.803:=2))
与往常一样,您可以用!来取消ldapexpression式! ,在这个例子中检索所有已Enabled帐户:
(!(userAccountControl:1.2.840.113556.1.4.803:=2))
同样,名为DONT_EXPIRE_PASSWORD的设置值为65536(0x10000),我们可以通过以下方式find这些帐户:
(&(userAccountControl:1.2.840.113556.1.4.803:=65536))
计算密码过期有点复杂 。 为了帮助开发人员和集成商,Microsoft实施了一个名为msDS-User-Account-Control-Computed的dynamic属性。
msDS-User-Account-Control-Computed透明地返回与userAccountControl相同的值,但增加了以下位,在查找时间内即时计算:
UF_LOCKOUT 0x0010 UF_PASSWORD_EXPIRED 0x800000 UF_PARTIAL_SECRETS_ACCOUNT 0x4000000 UF_USE_AES_KEYS 0x8000000
我没有testing过这个,但是如果内存为我提供了正确的帮助,这将有助于您使用此filter可靠地识别带有过期密码的帐户 :
(&(msDS-User-Account-Control-Computed:1.2.840.113556.1.4.803:=8388608))
不幸的是,你不能在LDAP查询filter中使用被构造的属性,所以你需要做的是过滤前两个语句:
(&(!userAccountControl:1.2.840.113556.1.4.803:=2)(!userAccountControl:1.2.840.113556.1.4.803:=65536))
请务必向目录服务器询问msDS-User-Account-Control-Computed值,然后在结果(客户端)上执行按位AND掩码。
如果您确实想知道Powershell Cmdlet正在执行哪些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查看由Get-ADUser调用的DLL中的方法的名称。
Trace-Command -Name CommandDiscovery -Expression { Get-ADUser bob } -PSHost
现在使用JetBrains DotPeek来反编译这个DLL,并自己查看代码。
或者,不要经历所有的混乱,为什么你不这样做:
Get-ADUser -LDAPFilter "(objectCategory=person)"
而现在你知道(并有控制权)到底使用了哪个LDAP查询。
我想你会有最好的运气花一些时间来学习AD架构和自己构build查询,而不是试图逆向工程微软自己的工具。 AD是足够的一个简单的香草LDAP目录,参考文章,谈论LDAP通常将适用。 例如, 从Windows NT 4.0inheritance的属性中有一些古怪的东西,例如对于系统pipe理员types查询来说相当重要的属性 。