
Ich hatte die Problematik, dass während eines Projektes Gruppenberechtigungen datumsgesteuert entfernt werden sollten. Während des Projektes wurden mehrere Gruppen definiert, bei der Gruppenmitgliedschaften verarbeitet werden sollten.
Entsprechend wurden CSV-Dateien generiert als Grundlage für die Verarbeitung:
SamAccountName;ExpiryDate
jdoe;2025-05-12
asmith;2025-06-01
Die Dateien haben als Definition die folgende Struktur:
GroupExpLeave_<Gruppenname>.csv
Mit dem nun folgenden Skript werden die Mitglieder der Gruppen ermittelt und geprüft, ob das Ablaufdatum erreicht ist. Wenn dieses der Fall ist, wird der User aus der Mitgliedschaft entfernt.
# Verzeichnis mit den CSV-Dateien
$csvDirectory = "C:\CSC-Pfad"
$csvFiles = Get-ChildItem -Path $csvDirectory -Filter "GroupExpLeave_*.csv"
# Logdatei mit Tagesdatum
$logDate = Get-Date -Format "yyyy-MM-dd"
$logPath = Join-Path -Path $csvDirectory -ChildPath "GroupExpLeave_$logDate.log"
# Hashtable für Gruppenmitgliedschaften
$groupCache = @{}
foreach ($file in $csvFiles) {
# Gruppennamen aus dem Dateinamen extrahieren
if ($file.Name -match "^GroupExpLeave_(.+?)\.csv$") {
$groupName = $matches[1]
$csvPath = $file.FullName
# CSV mit Semikolon einlesen
$members = Import-Csv -Path $csvPath -Delimiter ";"
$today = Get-Date
$remainingMembers = @()
# Gruppenmitglieder einmalig abrufen und cachen
if (-not $groupCache.ContainsKey($groupName)) {
try {
$groupCache[$groupName] = Get-ADGroupMember -Identity $groupName | Select-Object -ExpandProperty SamAccountName
} catch {
Add-Content -Path $logPath -Value "[$(Get-Date)] Error Requesting GroupMembers $groupName: $_"
continue
}
}
$cachedMembers = $groupCache[$groupName]
foreach ($member in $members) {
$expiryDate = Get-Date $member.ExpiryDate
if ($expiryDate -lt $today) {
if ($cachedMembers -contains $member.SamAccountName) {
try {
Remove-ADGroupMember -Identity $groupName -Members $member.SamAccountName -Confirm:$false
Add-Content -Path $logPath -Value "[$(Get-Date)] User $($member.SamAccountName) from $groupName removed (Ablaufdatum: $expiryDate)."
} catch {
Add-Content -Path $logPath -Value "[$(Get-Date)] Error on removing user $($member.SamAccountName) from $groupName: $_"
$remainingMembers += $member
}
} else {
Add-Content -Path $logPath -Value "[$(Get-Date)] User $($member.SamAccountName) is not member of group $groupName – ignored."
}
} else {
$remainingMembers += $member
}
}
# Aktualisierte CSV-Datei schreiben
$remainingMembers | Export-Csv -Path $csvPath -Delimiter ";" -NoTypeInformation -Encoding UTF8
Add-Content -Path $logPath -Value "[$(Get-Date)] CSV-File $($file.Name) was created"
}
}
Die angewandte Datei für die jeweilige Gruppe wird mit den noch gültigen Benutzern nach deren Prüfung neu erstellt. Es ist bei der Einplanung des Tasks darauf zu achten, dass zu dem Zeitpunkt auf die Steuer-Dateien nicht zugegriffen wird.