Назад | Перейти на главную страницу

Get-aduser Password Expired Filter не работает правильно

Выполнение этой команды дает мне множество результатов, за исключением.

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

Но если я запустил эту команду:

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

Я не получаю никакого результата

Но когда я делаю get-aduser test.user -Properties * и посмотрите на поле PasswordExpired, в котором написано «True».

Поэтому я пробую использовать в фильтре True вместо $ true.

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

Я все еще не получаю результата.

Но если я запустил это так:

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

Он работает и перечисляет все учетные записи с истекшим паролем. Так почему же невозможно отфильтровать «PasswordExpired -eq $ true» в get-aduser, но он находится после канала?

    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 

Это потому, что сам командлет не создает во внутреннем объекте [свойство] для PasswordExpired. $ _. PasswordExpired - это метод, а не статическое свойство, поэтому его нужно вызывать при заполнении. Из-за (медленной) скорости обработки больших запросов (с таким количеством свойств) фильтр -Filter был реализован для уменьшения количества выходных вызовов, а не так, как конвейер объекта [свойство].

Таким образом, вы должны: а) фильтровать объекты по мере их объединения в конвейер (я бы рекомендовал это, я просто фильтрую почти все в конвейерах [filter-]) или б) фильтровать текстовый вывод (строка выбора).

Тогда «правильный» путь будет таким, как вы это сделали:

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

В большинстве случаев я лично использую | выбрать объект FOO | Out-GridView, поэтому ничего не скрывается, и я могу впоследствии отсортировать / выполнить поиск в наборе результатов.

Похоже на глюк в cmdLet. Нет прямого атрибута, указывающего на истекшее состояние пароля. Таким образом, хотя это кажется простым вопросом, есть несколько движущихся частей для определения состояния. У каждой учетной записи есть свойство даты последнего изменения пароля. Вы можете запустить свой собственный запрос, который будет более эффективным и не будет сильно загружать ваши серверы 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))"