#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 }