Get-aduser Password Expired Filtro não está funcionando corretamente

2

A execução desse comando me fornece muitos resultados, como exceção.

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

Mas se eu executar este comando:

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

Eu não obtenho nenhum resultado

Mas quando eu faço um get-aduser test.user -Properties * e olho no campo PasswordExpired ele diz "True".

Então, eu tento usar 'True' em vez de $ true no filtro

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

Eu ainda não recebo um resultado.

Mas se eu executar assim:

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

Funciona e lista todas as contas com senha expirada. Então, como é que não é possível filtrar "PasswordExpired -eq $ true" no get-aduser, mas depois de um 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 
    
por Jakodns 27.09.2016 / 09:49

2 respostas

4

Isso porque o próprio cmdlet não cria no objeto interno [property] para PasswordExpired . $ _. PasswordExpired é um método, não uma propriedade estática, por isso deve ser chamado quando estiver preenchido. Devido à velocidade (lenta) de grandes consultas (com esse número de propriedades), o -Filter foi implementado para reduzir as chamadas de saída, não da mesma maneira que o pipeline de [propriedade] do objeto.

Então você tem que a) filtrar os objetos à medida que eles se tornam um no pipe (eu recomendaria isso, eu apenas filtraria quase tudo em pipes [filter]) ou b) filtraria a saída de texto (string de seleção).

A maneira "correta" seria a maneira como você fez:

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

Na maioria dos casos, eu pessoalmente uso | objeto selecionado FOO | Out-GridView, então nada fica oculto e eu posso classificar / pesquisar o conjunto de resultados depois.

    
por 27.09.2016 / 15:38
0

Parece uma falha no cmdLet. Não existe um atributo direto para indicar o estado expirado da senha. Então, embora pareça uma pergunta simples, existem várias partes em movimento para determinar o estado. Cada conta tem uma propriedade da data em que a senha foi alterada pela última vez. Você pode executar sua própria consulta que será mais eficiente e não colocará muita carga em seus servidores 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))"
    
por 27.09.2016 / 17:29