Перейти к содержимому

Как синхронизировать папку с помощью PowerShell с фильтром по AD и запустить синхронизацию одновременно со всеми серверами.

Задача синхронизировать одну папку со множеством сервером. Делается это для распространения базы Касперского на удалённые площадки.

function Write-Log {
    param (
        [string]$Message
    )

    # Получение текущей даты и времени
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    
    # Форматирование сообщения в формате "дата время: сообщение"
    $logMessage = "{0}: {1}" -f $timestamp, $Message
    
    # Запись сообщения в лог-файл
    $logMessage | Out-File -FilePath "D:\Programs\replica_kasper\Log.txt" -Append
}

# Установите модуль PSParallel, если у вас его нет
if (-not (Get-Module -Name PSParallel -ListAvailable)) {
    Install-Module PSParallel -Scope CurrentUser
}

# Загрузите модуль PSParallel
Import-Module PSParallel

# Получение списка серверов из AD
$servers = Get-ADComputer -Filter {OperatingSystem -like "*Server*" -and Enabled -eq $true -and Name -like "*FSR*" } | Select-Object -ExpandProperty Name

# Путь к исходной папке на первом сервере
$sourceFolderPath = "\\fsr\с$\Distrib"

# Путь к целевой папке на других серверах
$targetFolderPath = "\Distrib"

# Параметры Robocopy для синхронизации
$robocopyParams = '/MIR /COPY:DT /Z /XA:H /W:5 /MT:20  /XD "DfsrPrivate" /XJD /TEE   '

# Workflow для параллельной синхронизации папок с проверкой доступности сервера
workflow Sync-Folders {
    param ($servers, $sourceFolderPath, $targetFolderPath, $robocopyParams)

    foreach -parallel ($server in $servers) {
        # Проверка доступности сервера
        if (Test-Connection -ComputerName $server -Count 1 -Quiet) {
            # Запуск Robocopy для синхронизации папок
            $robocopyArgs = "$sourceFolderPath \\$server$targetFolderPath $robocopyParams  /LOG+:D:\Programs\replica_kasper\log_$server.txt"
            Start-Process -FilePath "robocopy.exe" -ArgumentList $robocopyArgs -Wait
            Write-Log "Синхронизация папок на сервере $server завершена"
        } else {
            Write-Log "Сервер $server недоступен. Синхронизация папок не выполнена."
        }
    }
}

# Вызов workflow с аргументами
Sync-Folders -servers $servers -sourceFolderPath $sourceFolderPath -targetFolderPath $targetFolderPath -robocopyParams $robocopyParams

Если этот скрипт добавить в task scheduler то будет ошибка

Task Scheduler did not launch task "\kasper replica"  because instance   of the same task is already running.

Что бы исправить надо в настройках поставить Run a new instance in parallel

Как синхронизировать папку с помощью PowerShell с фильтром по AD и запустить синхронизацию одновременно со всеми серверами.

 

Similar Posts:

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *