Выполнение этой команды дает мне множество результатов, за исключением.
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))"