Get-ADConnectSyncErrors — błędy synchronizacji ADConnect

🏢 Active Directory POWERSHELL

Pobiera i wyświetla błędy eksportu/importu ADConnect — obiekty blokujące synchronizację

Pobierz .ps1

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