• Startseite
  • Blog
  • Ein PowerShell-Skript zum Auffinden von AD FS 2.0-Fehlern

Ein PowerShell-Skript zum Auffinden von AD FS 2.0-Fehlern

Einer Ihrer Benutzer hat also eine Fehlermeldung von AD FS 2.0 erhalten, und Sie müssen herausfinden, wo das Problem liegt. Leider gibt die Fehlermeldung manchmal nicht viel Aufschluss - zum Beispiel die unten gezeigte Webseite.

Es gab ein Problem beim Zugriff auf die Website. Versuchen Sie erneut, die Website aufzurufen. Wenn das Problem weiterhin besteht, wenden Sie sich an den Administrator dieser Website und geben Sie die Referenznummer an, um das Problem zu identifizieren. Referenznummer:

Glücklicherweise gibt Ihnen AD FS eine Referenznummer, die normalerweise mit einigen Ereignisprotokolleinträgen übereinstimmt. Wenn Sie einen solchen Eintrag haben, können Sie das folgende PowerShell-Skript und die zugehörige Start-Batch-Datei verwenden, um den aktuellen Eintrag schnell zu finden.

Sie können das Skript entweder bearbeiten, um alle Ihre AD FS-Server hinzuzufügen, oder es einfach auf jedem AD FS-Server ausführen.

Zur Ausführung können Sie einfach auf find-adfs-error.bat doppelklicken und dann eine der Referenznummern einer Fehlerseite eingeben oder einfügen. Wenn Sie den genauen Ereignisprotokolleintrag gefunden haben, kann es nützlich sein, im Ereignisprotokoll nachzusehen, was in der Nähe der Zeit, in der der Fehler auftrat, sonst noch passiert ist.

Hier sind also die Skripte. Werfen Sie einen Blick darauf, vielleicht finden Sie einige nützliche Techniken. Wenn Sie sie nützlich finden, hinterlassen Sie bitte einen Kommentar. Wenn Sie Fragen haben, können Sie diese ebenfalls stellen, und wenn Sie Verbesserungsvorschläge haben, können Sie mir diese ebenfalls mitteilen.

Viel Spaß!

find-adfs-error.ps1

$ADFSServers = @($env:computername)
# Add your list of AD FS servers here (not proxies) to have this script search
# all your servers. The names should be the hostnames of the AD FS servers not
# the AD FS service name.
# Then uncomment the line with your servers by removing the leading #
# example: $ADFSServers = @("adfs01.example.com","adfs02.example.com")
#$ADFSServers = @("","")

Write-Host "Type or paste the reference number from an AD FS 2.0 error web page"
Write-Host "  this should be a string such as: 6906F0A7-BDF5-4EDB-B624-DE9CDAE7938F"
$userinput = Read-Host "Reference Number"

$CorrelationActivityID = $userinput.Trim()

$FilterXPath = "*[System/Correlation[@ActivityID='{" + $CorrelationActivityID + "}']]"
$LogName = "AD FS 2.0/Admin"
$DebugLogName = "AD FS 2.0 Tracing/Debug"
foreach ($ComputerName in $ADFSServers)
{

    try { #this requires "-ErrorAction Stop" on the commands
        $ADFSevent = Get-WinEvent -ComputerName $ComputerName -LogName $LogName `
            -FilterXPath $FilterXPath -ErrorAction Stop
        $ADFSevent | Format-list Id, MachineName, LogName, TimeCreated, Message

    }
    catch [Exception] {
        if ($_.Exception -match
            "No events were found that match the specified selection criteria") {
            # do nothing, it just means no events were found in this log
        }
        else
        {
            # Some other error happened so rethrow it so the user will see it
            Throw $_
        }
    }

    try { #this requires "-ErrorAction Stop" on the commands
        # You need to specify -Oldest when looking in Analytical and Debug/Trace logs
        $ADFSevent = Get-WinEvent -ComputerName $ComputerName -Oldest -LogName $DebugLogName `
            -FilterXPath $FilterXPath -ErrorAction Stop
        $ADFSevent | Format-list Id, MachineName, LogName, TimeCreated, Message
    }
    catch [Exception] {
        if ($_.Exception -match
            "No events were found that match the specified selection criteria") {
            # do nothing, it just means no events were found in this log
        }
        else
        {
            # Some other error happened so rethrow it so the user will see it
            Throw $_
        }
    }
}

 

Wenn Sie das PowerShell-Skript auf einfache Weise starten möchten, probieren Sie diese Batch-Datei aus. Doppelklicken Sie einfach darauf, und los geht's.

find-adfs-error.bat

powershell.exe -command ^
  "& {set-executionpolicy Remotesigned -Scope Process; .'.\find-adfs-error.ps1' }"
pause

 

Referenzen:

Diagnostik in AD FS 2.0
https://blogs.msdn.com/b/card/archive/2010/01/21/diagnostics-in-ad-fs-2-0.aspx

Konfigurieren von Computern für die Fehlersuche in AD FS 2.0
https://technet.microsoft.com/en-us/library/adfs2-troubleshooting-configuring-computers%28WS.10%29.aspx

Um mehr über die PowerShell-Ausführungsrichtlinie und das Signieren von Code oder signierten Skripts zu erfahren, öffnen Sie PowerShell und geben Sie command ein:

Get-Help Über_Signieren

 

Um das Auffinden dieser Skripte zu erleichtern, gebe ich hier einige Schlüsselwörter an, nach denen die Benutzer möglicherweise gesucht haben. Zu den Schlüsselwörtern gehören Active Directory Federation Services, ADFS, event log, eventid, event viewer, correlation id oder correlation identifier. Es gab ein Problem beim Zugriff auf die Website. Versuchen Sie erneut, die Website aufzurufen. Wenn das Problem weiterhin besteht, wenden Sie sich an den Administrator dieser Site und geben Sie die Referenznummer an, um das Problem zu identifizieren. Referenznummer: