PowerShell – Обновление групп безопасности политик репликации паролей RODC в Windows Server 2012 R2

imageКак и в предыдущей заметке было решено оптимизировать скрипт изложенный ранее в заметке PowerShell – Поддержание групп безопасности политики репликации паролей RODC в актуальном состоянии для выполнения с использованием новых командлетов из PowerShell модуля ActiveDirectory на Windows Server 2012 R2 таким образом, чтобы в результате работы скрипта не происходило полное переписывание членства пользователей в группах безопасности.

Для работы скрипта потребуется конфигурационный файл в формате *.csv, в котором будет содержаться информация о том, какие OU в домене будут использоваться для поиска учетных записей пользователей и заполнения ими определённых групп репликации паролей. Каждая строчка файла представляет собой связку DN доменной группы безопасности репликации паролей и DN OU. Файл должен иметь примерно такое содержание:

RODCAllowGroupDN;UsersOUDN 
CN=RODC-Group1,OU=Groups,DC=mydom,DC=com;OU=Branch1,DC=mydom,DC=com 
CN=RODC-Group2,OU=Groups,DC=mydom,DC=com;OU=Branch2,DC=mydom,DC=com 
CN=RODC-Group3,OU=Groups,DC=mydom,DC=com;OU=Branch3,DC=mydom,DC=com

В самом скрипте в блоке переменных в переменной $DataFile нужно указать полный путь к соответствующему CSV файлу.

# Блок переменных
# $DataFile - Путь к файлу для сопоставления групп безопасности c OU
# $CountDisabledUsers - Признак обработки отключенных учетных записей пользователей (1 или 0)
# $CountServiceUsers - Признак обработки сервисных учетных записей пользователей (1 или 0) 
# $CountAdministrators - Признак обработки административных учетных записей пользователей (1 или 0) 
#
$DataFile = '.\RODC-AddUsersToGroupsFromOUs.csv'
$CountDisabledUsers = 0
$CountServiceUsers = 1
$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 + ')'
#
# Функция сравнения и наполнения группы безопасности
#
Function AddUsersToGroupFromOU ($GroupDN, $OUDN) {
    Write-Host 'Processing group: ' $GroupDN
    Write-Host 'Search in OU: ' $OUDN
    $UsersInOU = @()
    $OldMembers = @()
    $NewMembers = @()
    #
    $UsersInOU = Get-ADObject -LDAPFilter $LAPF -SearchBase $OUDN
    $OldMembers = Get-ADGroupMember -Identity $GroupDN    
    ForEach ($User in $UsersInOU){
        If ($OldMembers.DistinguishedName -notcontains $User.distinguishedName) {
            $NewMembers = $NewMembers + $User
            }
    }
    #
    Write-Host 'Users count in OU: ' $UsersInOU.Count
    Write-Host 'Users count in group: ' $OldMembers.Count
    #
    If ($NewMembers.Count -gt 0){
        Add-ADGroupMember -Identity $GroupDN -Members $NewMembers -Confirm:$False
        Write-Host 'Add new users in group: ' $NewMembers.Count
        Write-Host $NewMembers.Name
        $NewCount = (Get-ADGroupMember -Identity $GroupDN).Count
        Write-Host 'New users conut in group: ' $NewCount 
    }
}
#
# Обработка входных данных файла 
#
$ConvFile = $DataFile + '_unicode'
Get-Content $DataFile | Set-Content $ConvFile -Encoding Unicode
Import-CSV $ConvFile -Delimiter ';' | ForEach-Object { 
    AddUsersToGroupFromOU $_.RODCAllowGroupDN $_.UsersOUDN
}
Remove-Item $ConvFile

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