|
Dieses Powershell nimmt einen Parameter zu Verarbeitung der CSV-Datei:
# Active Directory-Modul laden
Import-Module ActiveDirectory
param(
[string]$ServerName = "DefaultServer"
)
Write-Output "Verwende Server: $ServerName"
# CSV-Pfad mit dem Parameter zusammensetzen
$CSVPath = "C:\tmp\output$ServerName.csv"
# CSV einlesen
$SQLLogins = Import-Csv -Path $CSVPath -Delimiter "," -Header "LoginName", "LoginSID"
# Array für nicht existierende Logins
$NonExistingAccounts = @()
foreach ($Login in $SQLLogins) {
try {
Write-Output "Prüfe Login: $($Login.LoginName)"
Write-Output "Roh-SID: $($Login.LoginSID)"
# Hex-SID in lesbares Format konvertieren
$ReadableSID = Convert-HexSIDToADSID -HexSID $Login.LoginSID
Write-Output "Lesbare SID: $ReadableSID"
# Prüfen, ob SID im AD existiert
$ADObject = Get-ADObject -Filter { ObjectSID -eq $ReadableSID } -Properties SamAccountName, ObjectGUID
if ($null -ne $ADObject) {
Write-Output "$($Login.LoginName) existiert im AD."
} else {
Write-Output "$($Login.LoginName) existiert NICHT im AD."
# Füge den Login dem Array hinzu
$NonExistingAccounts += [PSCustomObject]@{
LoginName = $Login.LoginName
LoginSID = $Login.LoginSID
}
}
} catch {
Write-Output "Fehler beim Prüfen: $($_.Exception.Message)"
}
}
# Wenn es nicht existierende Accounts gibt, exportiere diese als CSV
if ($NonExistingAccounts.Count -gt 0) {
$OutputCSV = "C:\tmp\output$ServerName_filtered.csv"
$NonExistingAccounts | Export-Csv -Path $OutputCSV -NoTypeInformation -Delimiter ","
Write-Output "Die nicht existierenden Logins wurden in $OutputCSV gespeichert."
} else {
Write-Output "Alle Logins existieren im AD. Keine Daten für die CSV-Ausgabe."
}
function Convert-HexSIDToADSID {
param ([string]$HexSID)
if (-not $HexSID.StartsWith("0x")) {
throw "Ungültiges SID-Format: $HexSID. Muss mit '0x' beginnen."
}
try {
# Hex-String bereinigen
$CleanHexSID = $HexSID.Substring(2).Replace(" ", "").Replace("`t", "").Replace("`n", "")
if ($CleanHexSID.Length % 2 -ne 0) {
throw "Ungültige Länge des Hex-Strings: $HexSID."
}
# Byte-Array erstellen
$SIDBytes = for ($i = 0; $i -lt $CleanHexSID.Length; $i += 2) {
[Convert]::ToByte($CleanHexSID.Substring($i, 2), 16)
}
# SID-Komponenten extrahieren
$Revision = $SIDBytes[0]
$SubAuthCount = $SIDBytes[1]
# Identifier Authority (6 Bytes, manuell verarbeiten)
$IdentifierAuthorityBytes = $SIDBytes[2..7]
$IdentifierAuthority = 0
for ($i = 0; $i -lt $IdentifierAuthorityBytes.Length; $i++) {
$IdentifierAuthority += $IdentifierAuthorityBytes[$i] * [math]::Pow(256, (5 - $i))
}
# SubAuthorities verarbeiten
$SubAuthorities = @()
for ($i = 0; $i -lt $SubAuthCount; $i++) {
$StartIndex = 8 + ($i * 4)
$SubAuth = [BitConverter]::ToUInt32($SIDBytes[$StartIndex..($StartIndex + 3)] -as [byte[]], 0)
$SubAuthorities += $SubAuth
}
# SID zusammenstellen
$SID = "S-$Revision-$IdentifierAuthority"
foreach ($SubAuth in $SubAuthorities) {
$SID += "-$SubAuth"
}
return $SID
} catch {
throw "Fehler beim Konvertieren der SID: $HexSID. Details: $_"
}
}
###
Hier ist der Backlink zu diesem Beitrag https://itatservice.de/it-service/technischer-blog_AutomatisierterAccountLoginCheck.php
|