Invoke-ADConnectSync — wymuś synchronizację ADConnect
🏢 Active Directory POWERSHELLUruchamia delta lub pełną synchronizację Azure AD Connect z oczekiwaniem na wynik
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
}