Get-ADConnectSyncErrors — błędy synchronizacji ADConnect
🏢 Active Directory POWERSHELLPobiera i wyświetla błędy eksportu/importu ADConnect — obiekty blokujące synchronizację
Opis
Skrypt diagnostyczny do identyfikacji problemów synchronizacji ADConnect. Wyświetla: - Błędy eksportu z Connector Space (np. AttributeValueMustBeUnique) - Ostatnie przebiegi synchronizacji zakończone błędem - Statystyki wszystkich konektorów (CS Objects, Pending Add/Update/Delete) Typowe błędy eksportu: - AttributeValueMustBeUnique — duplikat UPN lub ProxyAddress - InvalidSoftMatch — konflikt tożsamości - ObjectTypeMismatch — niezgodność typu obiektu Parametry: - -ConnectorName — wskaż konkretny konektor - -ExportCSV — zapisz błędy do pliku
🕒 2026-04-13
📦 Źródło: own
skrypt.ps1
#Requires -Modules ADSync
<#
.SYNOPSIS
Wyświetla błędy synchronizacji ADConnect — obiekty z problemami w Connector Space.
.DESCRIPTION
Pobiera błędy z ADConnect Connector Space:
- Export errors (niewyeksportowane obiekty)
- Import errors
- Obiekty z atrybutem w konflikcie (AttributeValueMustBeUnique, ObjectTypeMismatch)
- Zduplikowane UPN/ProxyAddresses
Pomocny przy diagnozowaniu problemów z synchronizacją konkretnych obiektów.
.PARAMETER ConnectorName
Nazwa konektora (domyślnie: konektor Azure AD).
Użyj Get-ADSyncConnector | Select Name aby zobaczyć dostępne.
.PARAMETER ErrorType
Typ błędów do wyświetlenia: Export, Import, All (domyślnie: All).
.PARAMETER ExportCSV
Ścieżka do pliku CSV z błędami.
.EXAMPLE
.\Get-ADConnectSyncErrors.ps1
.\Get-ADConnectSyncErrors.ps1 -ConnectorName "contoso.com"
.\Get-ADConnectSyncErrors.ps1 -ExportCSV C:\Temp\sync-errors.csv
#>
param(
[string]$ConnectorName = "",
[ValidateSet('Export', 'Import', 'All')]
[string]$ErrorType = 'All',
[string]$ExportCSV = ""
)
Import-Module ADSync -ErrorAction Stop
# Pobierz konektory
$connectors = Get-ADSyncConnector
if (-not $ConnectorName) {
# Auto-wykryj konektor AAD (Azure AD)
$aadConnector = $connectors | Where-Object { $_.Type -eq 'Extensible2' -or $_.Name -like "*AAD*" -or $_.Name -like "*Azure*" }
$ConnectorName = if ($aadConnector) { $aadConnector[0].Name } else { $connectors[0].Name }
Write-Host "Auto-wykryto konektor: $ConnectorName" -ForegroundColor DarkGray
}
Write-Host "`n========================================" -ForegroundColor Cyan
Write-Host " BŁĘDY SYNCHRONIZACJI — $ConnectorName" -ForegroundColor Cyan
Write-Host "========================================`n" -ForegroundColor Cyan
$allErrors = @()
# Export errors
if ($ErrorType -in 'Export', 'All') {
Write-Host "--- BŁĘDY EKSPORTU ---" -ForegroundColor Yellow
try {
$exportErrors = Get-ADSyncCSObject -ConnectorName $ConnectorName -ExportErrors
if ($exportErrors) {
$allErrors += $exportErrors | ForEach-Object {
[PSCustomObject]@{
Type = 'Export'
DN = $_.DN
ErrorType = $_.ExportError
AttributeName = $_.ExportAttributeError
ObjectType = $_.ObjectType
}
}
$exportErrors | Select-Object DN, ExportError, ExportAttributeError, ObjectType |
Format-Table -AutoSize -Wrap
} else {
Write-Host " Brak błędów eksportu." -ForegroundColor Green
}
} catch {
Write-Warning "Nie udało się pobrać błędów eksportu: $_"
}
}
# Błędy z ostatnich uruchomień
Write-Host "`n--- OSTATNIE PRZEBIEGI Z BŁĘDAMI ---" -ForegroundColor Yellow
$runHistory = Get-ADSyncRunProfileResult -NumberRequested 20 |
Where-Object {
$_.ConnectorName -eq $ConnectorName -and
$_.Result -notin 'success', 'stopped-server-shutdown', 'stopped-user-request'
}
if ($runHistory) {
$runHistory | Select-Object RunProfileName, Result,
@{N='Start'; E={ $_.StartDate.ToString("yyyy-MM-dd HH:mm:ss") }},
@{N='AddErr'; E={ $_.ExportCounters?.ExportErrors }},
@{N='UpdateErr'; E={ $_.ExportCounters?.ExportErrorsUpdate }} |
Format-Table -AutoSize
} else {
Write-Host " Brak uruchomień z błędami (ostatnie 20)." -ForegroundColor Green
}
# Podsumowanie statystyk
Write-Host "`n--- STATYSTYKI KONEKTORÓW ---" -ForegroundColor Yellow
$connectors | ForEach-Object {
$stats = Get-ADSyncConnectorStatistics -ConnectorName $_.Name
[PSCustomObject]@{
Konektor = $_.Name
'CS Objects' = $stats.ConnectorSpaceObjects
'Pending Add' = $stats.PendingExportAdd
'Pending Update' = $stats.PendingExportUpdate
'Pending Delete' = $stats.PendingExportDelete
}
} | Format-Table -AutoSize
if ($ExportCSV -and $allErrors) {
$allErrors | Export-Csv -Path $ExportCSV -NoTypeInformation -Encoding UTF8
Write-Host "`nWyeksportowano $($allErrors.Count) błędów do: $ExportCSV" -ForegroundColor Green
}
Write-Host "`nAby przejrzeć szczegóły: otwórz Synchronization Service Manager → Operations" -ForegroundColor DarkGray