Get-aduser密码过期filter无法正常工作

运行这个命令会给我大量的结果,例如。

Get-Aduser -Properties * -Filter {PasswordExpired -eq $false} 

但是,如果我运行这个命令:

 Get-Aduser -Properties * -Filter {PasswordExpired -eq $true} 

我没有得到任何结果

但是,当我做一个get-aduser test.user -Properties *并看看PasswordExpired字段它说“真”。

所以我尝试在filter中使用“True”而不是$ true

 Get-Aduser -Properties * -Filter {PasswordExpired -eq 'True'} 

我仍然没有得到一个结果。

但是,如果我这样运行:

 Get-Aduser -filter {enabled -eq $true -or enabled -eq $false} -Properties * | where {$_.PasswordExpired -eq $true} 

它工作并列出所有密码已过期的帐户。 那么为什么在get-aduser中不能过滤“PasswordExpired -eq $ true”,但是在pipe道之后?

  PSVersion 4.0 WSManStackVersion 3.0 SerializationVersion 1.1.0.1 CLRVersion 4.0.30319.34209 BuildVersion 6.3.9600.17400 PSCompatibleVersions {1.0, 2.0, 3.0, 4.0} PSRemotingProtocolVersion 2.2 

这是因为cmdlet本身不会在PasswordExpired内部对象[property]中创build。 $ _。PasswordExpired是一个方法,而不是一个静态属性,所以它被填充时必须被调用。 由于大查询(具有这些属性数量)的(慢)速度,实现了-Filter以减less输出调用,与对象[property]pipe道不同。

所以你必须a)过滤对象,因为他们成为一个pipe道(我会推荐这个,我只是过滤几乎所有的[filter-]pipe道)或b)过滤文本输出(select-string)。

那么“正确的”方式就是你刚刚做的那样:

 Get-ADUser -Properties * -Filter * | ` # to get the whole object(s), most simple way # You can make the query faster here, by getting less properties # -Properties Name,PasswordExpired -Filter * ? { $_.PasswordExpired -eq $false } | ` # here it became an $_.property, # just filter what you need from the object stream ft Name,PasswordExpired # do some output 

在大多数情况下,我个人使用| select对象FOO | Out-GridView,所以没有隐藏的东西,我可以sorting/search结果集。

似乎在cmdLet中的一个小故障。 没有直接的属性来指示密码的过期状态。 所以虽然看起来像一个简单的问题,但有几个移动部分来确定状态。 每个帐户都有密码上次更改date的属性。 您可以运行您自己的查询,这将更有效,而不会在您的LDAP服务器上投入太多的负载。

 $pwAge = 30 # adjust this as needed to match your domain password policy $oldPassDate = ((get-date).adddays(-$pwAge)).ToFileTimeUtc() # Ldap notes # ADS_UF_ACCOUNTDISABLE 0x0002 2 # ADS_UF_DONT_EXPIRE_PASSWD 0x10000 65536 # Ldap bitwise AND = 803 # Ldap bitwise OR = 804 # This Ldap query asks for: # User objects that last set their password at least 30 days ago # and do not have "password never expires" or the disabled flags set get-adobject -ldapFilter "(&(objectCategory=person)(objectClass=user)(pwdlastset<=$oldPassDate)(!userAccountControl:1.2.840.113556.1.4.804:=65538))"