
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.