PowerShell – Поддержание группы безопасности для Password Settings objects (PSOs) в актуальном состоянии

imageПо мотивам применения Password Settings objects (PSOs) с нацеливанием объектов PSO на доменные группы безопасности встаёт вопрос о поддержании состава этих групп в актуальном состоянии. В моём окружении все учетные записи, находящиеся в определённом OU, должны быть включены в доменную группу безопасности, к которой применяется PSO, что само по себе уже есть критерий, по которому можно автоматизировать задачу поддержания группы в актуальном состоянии с помощью PowerShell. Представляю соответствующий скрипт.

В скрипте в блоке переменных необходимо указать DN имя OU, в котором расположены пользователи и DN имя доменной группы безопасности.

# Блок переменных
# $LDAPPathOU - ADSI путь к контейнеру с доменными учетными записями пользователей (в формате LDAP://distinguishedName)
# $LDAPPathSG - ADSI путь к доменной группе безопасности (в формате LDAP://distinguishedName)
# $CountDisabledUsers - Признак необходимости обработки отключенных учетных записей пользователей (1 или 0)
# $CountServiceUsers - Признак необходимости обработки сервисных учетных записей пользователей (1 или 0) 
# $CountAdministrators - Признак необходимости обработки административных учетных записей пользователей (1 или 0) 
#
$LDAPPathOU = 'LDAP://OU=Branch Users,DC=mydom,DC=com'
$LDAPPathSG = 'LDAP://CN=KOM-SRV-PSO-Users,OU=My Groups,DC=mydom,DC=com'
$CountDisabledUsers = 0
$CountServiceUsers = 0
$CountAdministrators = 0
#
# Блок поиска
#
$DomainOU = [ADSI]$LDAPPathOU
$DomainSG = [ADSI]$LDAPPathSG
$Searcher = New-Object System.DirectoryServices.DirectorySearcher($DomainOU)
$Filter = '(objectCategory=person)(objectClass=user)'
If ($CountDisabledUsers -eq 0) { $Filter = $Filter + '(!(userAccountControl:1.2.840.113556.1.4.803:=2))' }
If ($CountServiceUsers -eq 0) { $Filter = $Filter + '(!(sAMAccountName=s-*))' }
If ($CountAdministrators -eq 0) { $Filter = $Filter + '(!(sAMAccountName=a-*))' }
$Filter = '(&' + $Filter + ')'
$Searcher.Filter = $Filter
$Searcher.PageSize  = 5000
[Void]$Searcher.PropertiesToLoad.Add('cn')
[Void]$Searcher.PropertiesToLoad.Add('distinguishedName')
$Users = $Searcher.findall()
#
# Блок наполнения группы безопасности
#
$OldMembers = $DomainSG.member
$NewMembers = $null
ForEach ($User in $Users){
      $UserDN = $User.Properties.distinguishedname
      If ($OldMembers -notcontains $UserDN) {
            $NewMembers = $NewMembers + $UserDN
            Write-Host 'Add user:' $User.Properties.cn
            }
}
#
Write-Host '--------------------------------------------'
Write-Host 'Total user accounts in OU: ' $Users.Count
#
If ($NewMembers -ne $null){
      $AllMembers = $OldMembers + $NewMembers
      $DomainSG.member = $AllMembers
      $DomainSG.SetInfo()
      Write-Host 'Old users in group: ' $OldMembers.Count
      Write-Host 'New users in group: ' $NewMembers.Count
}
Write-Host 'Current users in group: ' $AllMembers.Count
Write-Host '--------------------------------------------'

Для запуска скрипта на периодической основе, на контроллере домена в планировщике задач создаем новую задачу с следующими настройками:

Запуск задачи выполняем с повышенными привилегиями от имени системы

clip_image001

Задаем расписание выполнения скрипта , например один раз в сутки будет в большинстве случаев вполне достаточно.

clip_image002

В качестве основного действия укажем запуск PowerShell с передачей в качестве параметра полного пути к скрипту

clip_image003

Теперь после появления в целевом OU новой учетной записи, она по заданному расписанию будет включена в группу безопасности, к которой применяются настройки Password Settings objects (PSOs).

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