PowerShell – Обновление группы безопасности для Password Settings objects (PSOs) в Windows Server 2012 R2

imageПосле внедрения Audit Collector из состава System Center 2012 R2 Operations Manager при анализе изменений членства глобальных доменных групп безопасности стало очевидно, что вариант описанного ранее скрипта в заметке PowerShell – Поддержание группы безопасности для Password Settings objects (PSOs) в актуальном состоянии не является оптимальным, так как в результате его выполнения каждый раз фактически происходит переписывание состава членства группы безопасности, что судя по последующему анализу журналов безопасности на контроллере домена, порождает множественные события удаления/добавления пользователей в эту самую группу. Привожу вариант измененного скрипта, использующего новые командлеты из PowerShell модуля ActiveDirectory на Windows Server 2012 R2. В обновлённом скрипте используется поиск и добавление в группу только конкретных учетных записей, а не полное переписывание членства как это было ранее.

# Блок переменных
# $SearchOUDN - Контейнер с доменными учетными записями пользователей в формате distinguishedName
# $LDAPPathSG - Доменная группа безопасности в формате distinguishedName
# $CountDisabledUsers - Признак обработки отключенных учетных записей пользователей (1 или 0)
# $CountServiceUsers - Признак обработки сервисных учетных записей пользователей (1 или 0) 
# $CountAdministrators - Признак обработки административных учетных записей пользователей (1 или 0) 
#
$SearchOUDN = "OU=Branch Users,DC=holding,DC=com"
$SecGroupDN = "CN=KOM-SRV-PSO-Users,OU=My Groups,DC=holding,DC=com"
#
$CountDisabledUsers = 0
$CountServiceUsers = 0
$CountAdministrators = 1
#
# Блок поиска
#
$LAPF = '(objectCategory=person)(objectClass=user)'
If ($CountDisabledUsers -eq 0) { 
    $LAPF = $LAPF + '(!(userAccountControl:1.2.840.113556.1.4.803:=2))' 
    }
If ($CountServiceUsers -eq 0) { 
    $LAPF = $LAPF + '(!(sAMAccountName=s-*))' 
    }
If ($CountAdministrators -eq 0) { 
    $LAPF = $LAPF + '(!(sAMAccountName=a-*))' 
    }
$LAPF = '(&' + $LAPF + ')'
$UsersInOU = Get-ADObject -LDAPFilter $LAPF -SearchBase $SearchOUDN
#
# Блок наполнения группы безопасности
#
$OldMembers = Get-ADGroupMember -Identity $SecGroupDN
$NewMembers = @()
ForEach ($User in $UsersInOU){
    If ($OldMembers.DistinguishedName -notcontains $User.distinguishedName) {
        $NewMembers = $NewMembers + $User
        }
}
#
Write-Host 'Total user accounts in OU: ' $UsersInOU.Count
Write-Host 'Current users in group: ' $OldMembers.Count
#
If ($NewMembers.Count -gt 0){
    Add-ADGroupMember -Identity $SecGroupDN -Members $NewMembers -Confirm:$False
    Write-Host 'Add new users in group: ' $NewMembers.Count
    Write-Host $NewMembers.Name
    $NewCount = (Get-ADGroupMember -Identity $SecGroupDN).Count
    Write-Host 'New users conut in group: ' $NewCount 
}

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