Auslesen der SID aus SQL Server heraus mit folgender Abfrage:
SELECT name AS LoginName, sid AS LoginSID
FROM sys.server_principals
WHERE type IN ('U', 'G') -- Nur Benutzer und Gruppen
AND name LIKE '%\%'; -- Nur AD-Konten
Das Ergebnis speichert man als CSV-File und führt folgendes Powershell aus um die SID gegen das Active-Directory zu prüfen:
# Active Directory-Modul laden
Import-Module ActiveDirectory
# CSV-Datei mit AD-Logins einlesen
$SQLLogins = Import-Csv -Path "C:\tmp\sql_logins.csv"
# Verarbeite jede Zeile in der CSV-Datei
foreach ($Login in $SQLLogins) {
try {
# Sicherstellen, dass LoginName vorhanden ist
if (-not $Login.LoginName) {
Write-Output "Fehler: Kein LoginName in der CSV-Datei für einen Eintrag."
continue
}
# Extrahiere den SamAccountName aus LoginName (Teil nach '\')
$DomainUser = $Login.LoginName -split '\\'
if ($DomainUser.Count -eq 2) {
$Domain = $DomainUser[0]
$SamAccountName = $DomainUser[1]
} else {
Write-Output "Fehler: Ungültiges Login-Format für '$($Login.LoginName)'."
continue
}
# Prüfe zuerst, ob es ein Benutzer ist
$ADUser = Get-ADUser -Filter "SamAccountName -eq '$SamAccountName'" -ErrorAction SilentlyContinue
if ($null -ne $ADUser) {
#Write-Output "$($Login.LoginName): Benutzer existiert im AD."
# Optional: Benutzerdetails anzeigen
#Write-Output " Anzeigename: $($ADUser.DisplayName)"
#Write-Output " E-Mail: $($ADUser.EmailAddress)"
continue
}
# Falls kein Benutzer gefunden wurde, prüfen, ob es eine Gruppe ist
$ADGroup = Get-ADGroup -Filter "SamAccountName -eq '$SamAccountName'" -ErrorAction SilentlyContinue
if ($null -ne $ADGroup) {
#Write-Output "$($Login.LoginName): Gruppe existiert im AD."
# Optional: Gruppendetails anzeigen
#Write-Output " Gruppenname: $($ADGroup.Name)"
continue
}
# Weder Benutzer noch Gruppe gefunden
Write-Output "$($Login.LoginName)"#: Weder Benutzer noch Gruppe existiert im AD."
} catch {
# Fehlerbehandlung für unvorhergesehene Probleme
Write-Output "$($Login.LoginName): Fehler beim Abrufen des AD-Objekts. $_"
}
}
|