В некоторых случаях может возникнуть ситуация, когда по какой либо причине в домене не работают глобальные парольные политики безопасности. При этом, исходя из нормальных соображений поддержания должного уровня безопасности учетных данных, требуется найти всех доменных пользователей, у которых срок действия пароля больше определённого периода.
Для этой задачи как отправную точку я использовал PS-скрипт User Counting and Password Age Checking с блога Steve Tibbetts, несколько переработав его. В частности была убрана ненужная мне в данной ситуации зависимость от командлетов Quest, добавлена возможность управления выводом отключенных учетных записей, изменён вывод в удобоваримый вид с сортировкой по дате установки пароля, добавлена возможность установки признака смены пароля для учетных записей с «прокисшими» паролями. Вот что получилось:
# Блок переменных
# $LDAPPath - ADSI путь к контейнеру с доменными учетными записями пользователей (в формате LDAP://distinguishedName)
# $CountDisabledUsers - Признак вывода сведений об отключенных учетных записях (1 или 0)
# $PWAgeDaysLimit - Максимально возможный период действия пароля в днях
# $PWDMustChange - Признак необходимости форсированной установки атрибута требующего смену пароля (1 или 0)
#
$LDAPPath = 'LDAP://OU=Domain Users,DC=mydom,DC=com'
$CountDisabledUsers = 0
$PWAgeDaysLimit = 90
$PWDMustChange = 0
#
# Блок поиска
#
$RootDomainOU = [ADSI]$LDAPPath
$Searcher = New-Object System.DirectoryServices.DirectorySearcher($RootDomainOU)
$Filter = '(objectCategory=person)(objectClass=user)'
If ($CountDisabledUsers -eq 0) { $Filter = $Filter + '(!(userAccountControl:1.2.840.113556.1.4.803:=2))' }
$Filter = '(&' + $Filter + ')'
$Searcher.Filter = $Filter
$Searcher.PageSize = 5000
[Void]$Searcher.PropertiesToLoad.Add("cn")
[Void]$Searcher.PropertiesToLoad.Add("sAMAccountName")
[Void]$Searcher.PropertiesToLoad.Add("pwdLastSet")
$Users = $Searcher.findall()
#
# Блок основного вывода
#
$PWDays = (Get-Date).AddDays(-$PWAgeDaysLimit)
$UsersOldPWD = $Users | Where-Object {[datetime]::FromFileTime(($_.properties.pwdlastset)[0]) -le $PWDays}
$UsersOldPWD | Select `
@{label='User Full Name';expression={$_.properties.cn}},`
@{label='sAMAccountName';expression={$_.properties.samaccountname}},`
@{label='Last Password Set';expression={[datetime]::FromFileTime(($_.properties.pwdlastset)[0])}}`
| Sort -Property 'Last Password Set'`
| Format-Table –AutoSize
Write-Host '---------------------------------------------------'
write-host 'Total user accounts in OU: ' $Users.Count
write-host 'Users with passwords not changed in' $PWAgeDaysLimit 'days: ' $UsersOldPWD.Count
Write-Host '---------------------------------------------------'
#
# Блок смены атрибута учетных записей
#
If ($PWDMustChange -eq 1) {
Write-Host 'Set for users with old password - Change PWD at next Logon'
If ($UsersOldPWD.Count -eq $null)
{ Write-Host 'Ops...No account needs to be changed.'}
Else
{
ForEach ($User in $UsersOldPWD)
{
Write-Host 'Modify user:' $User.Properties.cn
$Account=[ADSI]$User.Path
$Account.put("pwdLastSet", 0)
$Account.setinfo()
}
}
Write-Host '---------------------------------------------------'
}
По умолчанию скрипт настроен только на вывод статистической информации с итоговыми показателями и его вывод выглядит примерно так:
Обратная ссылка: PowerShell – Аудит использования парольной политики « ИТ Блог Алексея Максимова /