WIndows verwendet für die Kerberos Authentifizierung für die Ressource einen
ServicePrincipalName (SPN). Dieser darf nur einmalig vergeben werden und wird üblicherweise automatisch vom entsprechenden Dienst registriert.

Es kann aber vorkommen, das z.B. ein Dienst unter einen Benutzerkonto installiert und auch testweise gestartet wurde. Dann wird für dieses Konto der SPN registriert. Nun stellt man z.B. für den Dienst aber einen anderen Dienteuser ein dann kann der SPN nicht erneut registriert werden.

Mir ist das bei der Installation von MS Dynamics Mittelschichten passiert. Damit lassen sich dann aber einige Funktionen nicht mehr sauber benutzten. Das war in dem Falle die Einbindung des Webclients.

Um die SPNs zu verwalten gibt es das Tool setpn von Microsoft. Damit kann ich das alles bearbeiten.

In meinen Fall hatte der Install-User aber über 40 falsche SPNs registriert. Das war der Grund, es auszuskripten. Entstanden ist der SPN-Manager.

###################################
# SPN-Manager
# V1.0 20.02.2019 AK
# bulletproof-admin.de
###################################

# Module
# import-module ActiveDirectory

# Varialblen
$tempfile = $env:TEMP+"\spn.txt"

Remove-Item -Path $tempfile -Force -ErrorAction SilentlyContinue
cls
Write-Host "Mit diesem Tool können SPNs eines Users oder Computers ausgelesen und bei Bedarf gelöscht werden..." -ForegroundColor Green
Write-Host "Bitte Objekt auswählen..."

# AD Picker https://gallery.technet.microsoft.com/scriptcenter/Active-Directory-Object-a832f7bd

Add-Type -Path (Join-Path -Path (Split-Path $script:MyInvocation.MyCommand.Path) -ChildPath 'bin\CubicOrange.Windows.Forms.ActiveDirectory.dll')

$DialogPicker = New-Object CubicOrange.Windows.Forms.ActiveDirectory.DirectoryObjectPickerDialog

$DialogPicker.AllowedLocations = [CubicOrange.Windows.Forms.ActiveDirectory.Locations]::All
$DialogPicker.AllowedObjectTypes = [CubicOrange.Windows.Forms.ActiveDirectory.ObjectTypes]::Groups,[CubicOrange.Windows.Forms.ActiveDirectory.ObjectTypes]::Users,[CubicOrange.Windows.Forms.ActiveDirectory.ObjectTypes]::Computers
$DialogPicker.DefaultLocations = [CubicOrange.Windows.Forms.ActiveDirectory.Locations]::JoinedDomain
$DialogPicker.DefaultObjectTypes = [CubicOrange.Windows.Forms.ActiveDirectory.ObjectTypes]::Users
$DialogPicker.ShowAdvancedView = $false
$DialogPicker.MultiSelect = $true
$DialogPicker.SkipDomainControllerCheck = $true
$DialogPicker.Providers = [CubicOrange.Windows.Forms.ActiveDirectory.ADsPathsProviders]::Default

$DialogPicker.AttributesToFetch.Add('samAccountName')
$DialogPicker.AttributesToFetch.Add('title')
$DialogPicker.AttributesToFetch.Add('department')
$DialogPicker.AttributesToFetch.Add('distinguishedName')

# AUswählen, auf welches Object angewendet wird..

$DialogPicker.ShowDialog()


# Computer oder User?
$typ = $DialogPicker.SelectedObject.SchemaClassName

# Anmeldename
$account=  $DialogPicker.Selectedobject.FetchedAttributes[0]
$account =  $env:USERDOMAIN + "\"+$account

if (-not($account))
    {
    Write-Host "Keine Auswahl. Ende." -ForegroundColor Red
    exit
    }

Write-Host "Einlesen der Daten..." -ForegroundColor Green

Start-Process -filepath "setspn.exe" -ArgumentList ("-L "+$account) -RedirectStandardOutput $tempfile -NoNewWindow -Wait

$spn_list = Get-Content -Path $tempfile -ErrorAction SilentlyContinue
if (-not($spn_list))
{
    Write-Host "Keine SPNs für "$account "Registriert. Abbruch" -ForegroundColor Red
    exit
    }

if ($spn_list -isnot [system.array])
    {
    Write-Host "Keine SPNs für "$account "Registriert. Abbruch" -ForegroundColor Red
    exit
    }


# Erste Zeile löschen
$spn_list = $spn_list[1..($spn_list.Length-1)]
# Trimmen
$spn_list = $spn_list | ForEach-Object {($_).ToString().Trim()}

$anz = $spn_list.Count

# Ausgabe
$erg = $spn_list | Out-GridView -Title ("Bitte zu löschende SPNs wählen für "+$account) -OutputMode Multiple
if ($erg)
    {
    $count = 1
    $anz = $erg.Count
    foreach ($spn in $erg)
    {
    Write-Host "*****************************************************"
    Write-Host $count "von" $anz $spn
    $command = ' -D "'+$spn.trim()+'" "'+$account+'"'
    start setspn.exe -ArgumentList $command -NoNewWindow
    Start-Sleep -Seconds 1
    $count++
    }

    }
    else
    {
    Write-Host "Keine Auswahl bzw. Abbruch" -ForegroundColor Red
    }


# Fertig
Remove-Item -Path $tempfile -Force -ErrorAction SilentlyContinue

Was macht das kleine Powershell Script? Es öffnet einen AD-Picker, mit dem man einen User oder ein Computerobjekt aus seinem AD wählen kann. Nun werden für das Objekt die SPNs abgefragt.

Der AD-Picker ist ein Modul, das es hier gibt. Ihr benötigt daraus den Ordner BIN mit der CubicOrange.Windows.Forms.ActiveDirectory.dll Datei.

Wenn SPNs vorhanden sind werden diese in einem Gridview angezeigt. Hier kann man mit Filtern und Sortieren die SPNs auswählen, die entfernt werden müssen. Nach der Auswahl werden diese SPns nun gelöscht.

Wichtig ist, das Tools mit Domadmin Rechten zu starten. Es muss kein DC sein, es müssen aber die Powershell Module für das Active-Directory vorhanden sein.

Kategorien: IT

0 Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.