Настройка репликации SYSVOL с помощью утилиты Robocopy

В данном разделе приводится пример настройки односторонней репликации SYSVOL с контроллера домена под управлением ОС Windows Server на контроллеры домена Эллес с помощью утилиты Robocopy:

Рекомендуемая версия пакета inno-samba — 1.4.4 и выше.

Предварительные условия

Перед началом настройки:

  1. Убедитесь, что в конфигурационном файле /app/inno-samba/etc/smb.conf на контроллерах Эллес присутствуют следующие разделы с указанными настройками:

    [sysvol]
    path = /app/inno-samba/var/locks/sysvol
    read only = No
    
    [netlogon]
    path = /app/inno-samba/var/locks/sysvol/domain.name/scripts
    read only = No
  2. Убедитесь, что указанные в конфигурации Эллес каталоги sysvol и netlogon доступны по сети на Windows AD DC. Для этого откройте их в проводнике:

    \\SAMBA_DC_FQDN\sysvol
    \\SAMBA_DC_FQDN\netlogon

Настройка вручную

В данном варианте настройки все действия выполняются администратором на контроллерах домена.

Создание управляемой учетной записи (MSA)

Репликация содержимого SYSVOL должна осуществляться от имени учетной записи, входящей в группу Domain Admins.

В описываемом варианте настройке репликация будет выполняться:

  • от имени администратора домена (в данном примере — Administrator);

  • от имени управляемой учетной записи Managed Service Account (MSA, в примере используется имя msa_sysvol) или Group Managed Service Accounts (gMSA).

Для создания учетной записи MSA на контроллере Windows AD DC:

  1. Выполните следующую команду в командной строке Windows PowerShell:

    New-ADServiceAccount -SamAccountName "msa_sysvol" -Name "msa_sysvol" -RestrictToSingleCompute -Enabled $true
    Длина значения SamAccountName не должна превышать 14 символов.
  2. Для проверки корректности создания учетной записи:

    • откройте оснастку «Active Directory — пользователи и компьютеры» (Active Directory Users and Computers) любым доступным способом — например, нажмите сочетание клавиш Windows+R, введите "dsa.msc" и нажмите OK;

    • раскройте в доменном дереве контейнер Managed Service Accounts и убедитесь, что в списке присутствует запись msa_sysvol типа msDS-ManagedServiceAccount.

      По умолчанию контейнер Managed Service Accounts не отображается. Чтобы отобразить его, в строке меню оснастки нажмите View и выберите Advanced Features.
  3. Привяжите созданную учетную запись MSA к контроллеру Windows AD DC. Для этого выполните в командной строке Windows PowerShell:

    $Server = Get-ADComputer -identity "WIN AD DC HOSTNAME"
    echo $Server
    $Msa = Get-ADServiceAccount -Filter "Name -eq 'msa_sysvol'" -Properties *
    echo $Msa
    
    Add-ADComputerServiceAccount -Identity $Server -ServiceAccount $Msa.sAMAccountName
  4. Добавьте созданную учетную запись MSA на контроллер Windows AD DC:

    $Msa = Get-ADServiceAccount -Filter "Name -eq 'msa_sysvol'" -Properties *
    Install-ADServiceAccount -Identity $Msa.sAMAccountName
  5. Проверьте, что контроллер может использовать созданную и настроенную учетную запись MSA:

    Test-ADServiceAccount -Identity $Msa.sAMAccountName

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

Настройка репликации

Для настройки репликации между контроллерами Windows AD DC и Эллес:

  1. На контроллере Windows AD DC создайте скрипт репликации sysvol_repl.cmd следующего вида, указав вместо SAMBA_DC_FQDN полное доменное имя контроллера Эллес, а вместо FULL_DOMAIN_NAME — полное имя домена:

    REM cd C:\Scripts\sysvol_repl\
    set DateStart=%DATE:~4,2%-%DATE:~7,2%-%DATE:~10,4%
    set LogName=sysvol_repl_%USERNAME%_%DateStart%.log
    echo ============== NEW RUN ==============
    echo %USERNAME% >> %LogName%
    robocopy C:\Windows\SYSVOL\domain\ \\SAMBA_DC_FQDN\SYSVOL\FULL_DOMAIN_NAME\ /COPY:DATSO /DCOPY:DAT /UNILOG+:%LogName%
    robocopy C:\Windows\SYSVOL\domain\Policies\ \\SAMBA_DC_FQDN\SYSVOL\FULL_DOMAIN_NAME\Policies\ /MIR /COPY:DATSO /DCOPY:DAT /UNILOG+:%LogName%
    robocopy C:\Windows\SYSVOL\domain\scripts\ \\SAMBA_DC_FQDN\SYSVOL\FULL_DOMAIN_NAME\scripts\ /MIR /COPY:DATSO /DCOPY:DAT /UNILOG+:%LogName%
  2. Поместите скрипт в каталог:

    C:\Scripts\sysvol_repl\

  3. Откройте планировщик заданий любым доступным способом. Например, нажмите сочетание клавиш Windows+R, введите "taskschd.msc" и нажмите OK.

  4. В левой панели щелкните правой кнопкой Task Scheduler Library и выберите Create Task.

  5. На вкладке General:

    • в поле Name укажите имя задачи (в данном примере — sysvol_repl);

    • в блоке Security options:

      • выберите Run whether user is logged on or not;

      • установите флажок Run with highest privileges.

    create repl task
    Рис. 1. Вкладка General
  6. На вкладке Triggers создайте новый триггер:

    • нажмите New;

    • задайте расписания запуска задачи;

    • нажмите OK.

    create repl trigger
    Рис. 2. Окно создания триггера
  7. На вкладке Actions настройте действие для задачи:

    • нажмите New;

    • в поле Action выберите Start a program;

    • в поле Program/script укажите полный путь к скрипту репликации; в данном примере:

      C:\Scripts\sysvol_repl\sysvol_repl.cmd

    • в поле Start in укажите путь к каталогу, в котором размещается скрипт репликации; в данном примере:

      C:\Scripts\sysvol_repl\

    • нажмите OK.

    create repl action
    Рис. 3. Окно создания действия
  8. Нажмите OK, чтобы сохранить настроенную задачу, и убедитесь, что она отображается в списке.

Созданная задача репликации SYSVOL обеспечивает запуск репликации от имени администратора домена.

Чтобы протестировать работу скрипта, выберите задачу в списке и нажмите Run. В результате относящееся к домену содержимое каталога /app/inno-samba/var/locks/sysvol на контроллере домена Эллес должно синхронизироваться с соответствующей частью каталога C:\Windows\SYSVOL на контроллере домена Windows AD DC.

Чтобы запускать задачу репликации от имени ранее созданной учетной записи MSA, на контроллере домена Windows AD DC выполните в Windows PowerShell следующую команду, указав вместо DOMAIN_NAME имя домена:

Set-ScheduledTask -TaskName sysvol_repl -Principal (New-ScheduledTaskPrincipal -UserID DOMAIN_NAME\msa_sysvol$ -LogonType Password -RunLevel Highest)

Для проверки успешности смены пользователя в планировщике заданий выберите задачу sysvol_rep и нажмите Properties.

После изменения пользователя задача репликации SYSVOL будет запускаться от имени учетной записи sysvol_repl.

Сброс прав на SYSVOL на контроллере домена Эллес

В случае получения ошибки "Access Denied" при попытке синхронизации SYSVOL на целевом контроллере домена Эллес требуется выполнить команду от имени пользователя с правами root:

samba-tool ntacl sysvolreset

Настройка с использованием скрипта

Следующий скрипт на PowerShell позволяет выполнить описанные выше шаги (кроме шага сброса прав) в автоматическом режиме:

Скрипт для автоматизации синхронизации SYSVOL
param (
    [string]$action,
    [string[]]$hosts,
    [string]$runInterval = "00:30:00",
    [string]$accName = "msa_sysvol"
)

$workFolder = "C:\sysvol_repl"
$taskName = "sysvol_repl"
$workTimeout = "00:10:00"

function msaAccountCreate {
    param (
        [string]$msaName
    )

    try {
        $Msa = Get-ADServiceAccount -Identity $msaName
        echo "Using existing account '$msaName'"
    } catch {}

    if (!$Msa) {
        echo "Creating account '$msaName'"
        New-ADServiceAccount -SamAccountName $msaName -Name $msaName -RestrictToSingleComputer -Enabled $True
        $Server = Get-ADComputer -identity $env:ComputerName
        $Msa = Get-ADServiceAccount -Identity $msaName
        Add-ADGroupMember -Identity "Domain Admins" -Members $Msa
        Add-ADComputerServiceAccount -Identity $Server -ServiceAccount $Msa.SamAccountName
        Install-ADServiceAccount -Identity $Msa.SamAccountName
    }

    Test-ADServiceAccount -Identity $Msa.SamAccountName | Out-Null
}

function scheduleTask {
    param (
        [string]$user
    )

    $task = Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue
    if ($task) {
        Unregister-ScheduledTask -TaskName $taskName -Confirm:$false
    }

    $action = New-ScheduledTaskAction -Execute "PowerShell" -Argument "$workFolder\sysvol_repl.ps1 replicate $hosts"
    $trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval ([Timespan]::Parse($runInterval))
    $principal = New-ScheduledTaskPrincipal -UserId "$($env:UserDomain)\$($user)$" -LogonType Password -RunLevel Highest
    $settings = New-ScheduledTaskSettingsSet -RunOnlyIfNetworkAvailable -WakeToRun -ExecutionTimeLimit ([Timespan]::Parse($workTimeout))
    $task = New-ScheduledTask -Action $action -Principal $principal -Trigger $trigger -Settings $settings
    Register-ScheduledTask -TaskName $taskName -InputObject $task

}

function install {
    param (
        [string]$accName
    )
    if (!(Test-Path $workFolder -PathType Container)) {
        New-Item -ItemType Directory -Force -Path $workFolder
    }
    if ($PSScriptRoot -ne $workFolder) {
        cp "$PSCommandPath" "$workFolder\sysvol_repl.ps1"
    }
    msaAccountCreate $accName
    echo "Scheduling SYSVOL replication task '$taskName' to run every $runInterval"
    scheduleTask $accName | Out-Null
}

function runCopy {
    param (
        [string]$path,
        [string]$logFile,
        [string]$opts
    )
    robocopy $env:SYSTEMROOT\SYSVOL\sysvol\$path \\$hst\SYSVOL\$path $opts /R:0 /MT /COPY:DATSO /DCOPY:DAT /FP /NDL /NJH /NJS /UNILOG+:$logFile | Out-Null
}

function sysvolReplicate {
    $dateStart = Get-Date -Format "yyyy-MM-dd"
    $logFile = "$workFolder\sysvol_repl_$($env:UserName)_$($dateStart).log"

    foreach ($hst in $hosts) {
        $dateTimeStart=Get-Date -Format "yyyy-MM-dd HH:mm:ss"
        echo "$dateTimeStart | $($env:UserName) | running SYSVOL replication for $hst" >> $logFile
        runCopy $env:UserDNSDomain\ $logFile
        runCopy $env:UserDNSDomain\Policies\ $logFile /MIR
        runCopy $env:UserDNSDomain\scripts\ $logFile /MIR
    }
}

if ($action -eq "install") {
    $res = Get-WindowsFeature "AD-Domain-Services"
    if (!$res) {
        echo "ERROR: AD-Domain-Services is not installed on the host"
        exit 1
    }
    install $accName
} else {
    sysvolReplicate
}

Для настройки репликации скопируйте скрипт на доменный контроллер Windows AD DC и установите его в Windows PowerShell, указав список имен целевых контроллеров домена Эллес через запятую и при необходимости — интервал репликации в формате HH:MM:SS (по умолчанию — 00:30:00, что соответствует 30 минутам):

sysvol_repl.ps1 install <dc-list> [<run-interval>]