在Get-ADUser命令行后面的LDAP查询

如何在后台查看由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查询。

ADAC GUI

ActiveDirectory模块具有聪明的逻辑,可以计算“常用”属性,例如用户帐户是否已Enabled或是否设置了PasswordNeverExpires并将其显示为常规属性。

在内部,它们来自实际的账户属性,如userAccountControlpwdLastSet

帐号设定

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查询来说相当重要的属性 。