<# .SYNOPSIS Entfernt das H-Laufwerk (Home-Drive) bei Benutzern in bestimmten OUs und dokumentiert die Aktion im Beschreibungsfeld inkl. Logging. .DESCRIPTION Das Skript durchläuft ein Array von OUs, sucht alle Benutzer, die ein HomeDirectory (H:) haben, entfernt die Attribute 'HomeDirectory' und 'HomeDrive' und ergänzt das 'Description'-Feld um einen Zeitstempel. SICHERHEIT: - Standardmäßig läuft das Skript im SIMULATIONSMODUS (es werden nur Logs geschrieben, nichts im AD verändert). - Mit -WhatIf wird simuliert (PowerShell-Standardverhalten). - Mit -Force werden die Änderungen SCHarf in AD geschrieben. - -Confirm fragt vor jeder einzelnen Änderung nach. Empfehlung: Immer zuerst mit -WhatIf testen, erst dann mit -Force fahren. .PARAMETER OUList Array von Distinguished Names (DN) der OUs, die durchsucht werden. Jede OU MUSS ein eigenständiger, gültiger DN sein. .PARAMETER LogPath Verzeichnis für die Logdateien (Default: C:\Temp\H_Laufwerk\Logs). .PARAMETER Force Erzwingt die reale Ausführung (ohne Simulation). Vorsicht! .EXAMPLE .\H_Laufwerk_entfernen.ps1 -WhatIf Simuliert die Entfernung und schreibt nur ins Log. .EXAMPLE .\H_Laufwerk_entfernen.ps1 -Force Führt die Entfernung real im AD aus (Vorsicht!). #> [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Medium')] param ( [string[]]$OUList = @( "OU=NNG,OU=Users,OU=N-Tree,DC=n-ad,DC=n-ergie", "OU=NSG,OU=Users,OU=N-Tree,DC=n-ad,DC=n-ergie" ), [string]$LogPath = "C:\Temp\H_Laufwerk\Logs", [switch]$Force ) # --- SICHERHEIT: Simulation, solange weder -Force noch explizites -WhatIf --- $Simulate = -not $Force if ($WhatIfPreference) { $Simulate = $true } # --- FUNKTIONEN --- function Write-Log { [CmdletBinding()] param( [Parameter(Mandatory)] [string]$Message, [ValidateSet("INFO", "SUCCESS", "WARNING", "ERROR")] [string]$Type = "INFO" ) $TimeStamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" $LogLine = "[$TimeStamp] [$Type] $Message" switch ($Type) { "SUCCESS" { Write-Host $LogLine -ForegroundColor Green } "WARNING" { Write-Host $LogLine -ForegroundColor Yellow } "ERROR" { Write-Host $LogLine -ForegroundColor Red } default { Write-Host $LogLine -ForegroundColor Cyan } } try { $LogLine | Out-File -FilePath $script:LogFile -Append -Encoding utf8 } catch { Write-Warning "Logdatei konnte nicht geschrieben werden: $_" } } # --- INITIALISIERUNG --- try { if (-not (Test-Path $LogPath)) { New-Item -ItemType Directory -Path $LogPath -Force | Out-Null } } catch { Write-Error "Logverzeichnis konnte nicht erstellt werden: $_" exit 1 } $LogFile = Join-Path $LogPath "H-Laufwerk_Entfernung_$(Get-Date -Format 'yyyy-MM-dd').log" Write-Log "=== Skriptstart (Modus: $(if ($Simulate) { 'SIMULATION/WhatIf' } else { 'SCHARF' })) ===" "INFO" # AD-Modul prüfen if (-not (Get-Module -ListAvailable -Name ActiveDirectory)) { Write-Log "Das ActiveDirectory-Modul ist nicht installiert!" "ERROR" exit 1 } try { Import-Module ActiveDirectory -ErrorAction Stop } catch { Write-Log "ActiveDirectory-Modul konnte nicht geladen werden: $_" "ERROR" exit 1 } $CurrentDate = Get-Date -Format "dd.MM.yyyy" $AppendText = "H Laufwerk wurde entfernt Datum $CurrentDate" $Processed = 0 $Skipped = 0 $Failed = 0 # --- HAUPTTEIL --- foreach ($OU in $OUList) { Write-Log "Verarbeite OU: $OU" "INFO" try { # Nur Benutzer mit gesetztem HomeDirectory laden (effizienter Filter) $Users = Get-ADUser -SearchBase $OU -SearchScope Subtree ` -Filter { HomeDirectory -like "*" } ` -Properties Description, HomeDirectory, HomeDrive -ErrorAction Stop } catch { Write-Log "Fehler beim Lesen der OU '$OU': $_" "ERROR" $Failed++ continue } if ($null -eq $Users) { Write-Log "Keine Benutzer mit H-Laufwerk in der OU '$OU' gefunden." "WARNING" continue } # Bei genau einem Treffer liefert Get-ADUser ein Skalar -> in Array wandeln if ($Users -isnot [System.Array]) { $Users = @($Users) } foreach ($User in $Users) { # Neue Beschreibung: bestehende Beschreibung beibehalten + Anhang $NewDescription = if ([string]::IsNullOrEmpty($User.Description)) { $AppendText } else { "$($User.Description) | $AppendText" } $ActionMsg = "Benutzer $($User.SamAccountName) - Entferne Pfad: '$($User.HomeDirectory)' ($($User.HomeDrive)) | Neue Beschreibung: '$NewDescription'" if ($Simulate) { Write-Log "[SIMULATION] $ActionMsg" "INFO" $Processed++ continue } if (-not $PSCmdlet.ShouldProcess( $User.SamAccountName, "HomeDirectory/HomeDrive entfernen + Beschreibung aktualisieren")) { $Skipped++ continue } try { Set-ADUser -Identity $User.SamAccountName ` -Clear "HomeDirectory", "HomeDrive" ` -Description $NewDescription Write-Log "Erfolgreich angepasst: $($User.SamAccountName)" "SUCCESS" $Processed++ } catch { Write-Log "Fehler beim Verarbeiten von $($User.SamAccountName): $_" "ERROR" $Failed++ } } } Write-Log "=== Skript beendet | Verarbeitet: $Processed | Übersprungen: $Skipped | Fehler: $Failed ===" "INFO"