Invoke-ADConnectSync — wymuś synchronizację ADConnect

🏢 Active Directory POWERSHELL

Uruchamia delta lub pełną synchronizację Azure AD Connect z oczekiwaniem na wynik

Pobierz .ps1

Opis

Skrypt do ręcznego wyzwalania synchronizacji ADConnect. Typy synchronizacji: - Delta (domyślnie) — tylko zmiany od ostatniej sync, szybka (~2-5 min) - Initial — pełna synchronizacja wszystkich obiektów, wolna (używaj rzadko) Funkcje: - Sprawdza staging mode przed uruchomieniem (ostrzeżenie) - Czeka na zakończenie synchronizacji i wyświetla wynik - Timeout 5 minut z informacją o postępie - Obsługa zdalna (-ComputerName) Kiedy używać delta sync: po zmianie atrybutów użytkownika, dodaniu konta, zmianie grupy. Kiedy używać initial sync: po zmianie reguł synchronizacji lub po długiej przerwie.

🕒 2026-04-13 📦 Źródło: own
skrypt.ps1
#Requires -Modules ADSync
<#
.SYNOPSIS
    Wymusza synchronizację Azure AD Connect (delta lub pełna).

.DESCRIPTION
    Uruchamia cykl synchronizacji ADConnect:
    - Delta sync — tylko zmiany od ostatniej synchronizacji (domyślnie, szybka)
    - Full sync — pełna synchronizacja wszystkich obiektów (wolna, używaj rzadko)

    Po synchronizacji wyświetla wyniki i ewentualne błędy.
    Można uruchomić zdalnie przez Invoke-Command.

.PARAMETER SyncType
    Typ synchronizacji: Delta (domyślnie) lub Initial (pełna).

.PARAMETER ComputerName
    Nazwa serwera ADConnect (jeśli uruchamiasz zdalnie).
    Domyślnie: lokalnie.

.PARAMETER WaitForCompletion
    Czekaj na zakończenie synchronizacji przed wyjściem (domyślnie: $true).

.EXAMPLE
    .\Invoke-ADConnectSync.ps1
    .\Invoke-ADConnectSync.ps1 -SyncType Initial
    .\Invoke-ADConnectSync.ps1 -ComputerName ADConnect01
#>

param(
    [ValidateSet('Delta', 'Initial')]
    [string]$SyncType = 'Delta',
    [string]$ComputerName = $env:COMPUTERNAME,
    [bool]$WaitForCompletion = $true
)

$syncBlock = {
    param($SyncType, $Wait)
    Import-Module ADSync -ErrorAction Stop

    # Sprawdź czy scheduler nie jest w staging mode
    $sched = Get-ADSyncScheduler
    if ($sched.StagingModeEnabled) {
        Write-Warning "ADConnect działa w STAGING MODE — synchronizacja nie wyeksportuje zmian do Azure AD!"
    }
    if (-not $sched.SyncCycleEnabled) {
        Write-Warning "Scheduler jest wyłączony (SyncCycleEnabled = False)."
    }

    Write-Host "`nUruchamianie synchronizacji [$SyncType]..." -ForegroundColor Cyan
    Write-Host "Czas startu: $(Get-Date -Format 'HH:mm:ss')"

    $policy = if ($SyncType -eq 'Initial') { 'Initial' } else { 'Delta' }
    Start-ADSyncSyncCycle -PolicyType $policy | Out-Null

    if ($Wait) {
        Write-Host "Czekam na zakończenie..." -ForegroundColor Yellow
        $timeout  = 300  # max 5 minut
        $elapsed  = 0
        $interval = 5

        while ($elapsed -lt $timeout) {
            Start-Sleep -Seconds $interval
            $elapsed += $interval

            $running = Get-ADSyncRunProfileResult -NumberRequested 1
            $last = $running | Select-Object -First 1

            if ($last -and $last.EndDate -and $last.StartDate -and $last.StartDate -gt (Get-Date).AddMinutes(-10)) {
                Write-Host "`n[OK] Synchronizacja zakończona po $elapsed s" -ForegroundColor Green
                Write-Host "Wynik    : $($last.Result)"
                Write-Host "Connector: $($last.ConnectorName)"
                Write-Host "Czas     : $($last.StartDate.ToString('HH:mm:ss')) → $($last.EndDate.ToString('HH:mm:ss'))"

                if ($last.Result -notin 'success', 'stopped-server-shutdown') {
                    Write-Warning "Synchronizacja zakończyła się ze statusem: $($last.Result)"
                }
                break
            }

            Write-Host "  ... $elapsed s — jeszcze trwa" -ForegroundColor DarkGray
        }

        if ($elapsed -ge $timeout) {
            Write-Warning "Timeout — synchronizacja trwa dłużej niż $timeout s. Sprawdź Synchronization Service Manager."
        }
    }
}

if ($ComputerName -eq $env:COMPUTERNAME) {
    & $syncBlock $SyncType $WaitForCompletion
} else {
    Write-Host "Łączę zdalnie z: $ComputerName" -ForegroundColor Cyan
    Invoke-Command -ComputerName $ComputerName -ScriptBlock $syncBlock -ArgumentList $SyncType, $WaitForCompletion
}