PowerShell – Поиск пользователей домена с устаревшими паролями

В некоторых случаях может возникнуть ситуация, когда по какой либо причине в домене не работают глобальные  парольные политики безопасности. При этом, исходя из нормальных соображений поддержания должного уровня безопасности учетных данных, требуется найти всех доменных пользователей, у которых срок действия пароля больше определённого периода.

Для этой задачи как отправную точку я использовал 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 '---------------------------------------------------'

}

По умолчанию скрипт настроен только на вывод статистической информации с итоговыми показателями и его вывод выглядит примерно так:

image

Добавить комментарий