Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <#
- .SYNOPSIS
- Setzt Berechtigungen für Zeichnungsordner und erstellt optional Netzwerkfreigaben.
- .DESCRIPTION
- Dieses Skript automatisiert die Verwaltung von Berechtigungen für Zeichnungsordner in einer
- vordefinierten Ordnerstruktur. Es durchsucht den angegebenen Basispfad nach Zeichnungsordnern,
- setzt die entsprechenden Berechtigungen für eine Produktionsgruppe und erstellt bei Bedarf
- die notwendigen Netzwerkfreigaben.
- Features:
- - Automatische Erkennung von Zeichnungsordnern
- - Setzen von Berechtigungen für die Produktionsgruppe
- - Erstellung von Netzwerkfreigaben (optional)
- - Umfangreiche Protokollierung in Konsole und Datei
- - Testmodus für sichere Überprüfung
- - UTF-8 Unterstützung für Sonderzeichen
- .PARAMETER BasePath
- Der Basispfad, in dem nach Zeichnungsordnern gesucht werden soll.
- Standard: ".\TestFreigaben" (TestFreigaben im aktuellen Verzeichnis)
- .PARAMETER ProductionGroup
- Der Name der Produktionsgruppe, die Leserechte erhalten soll.
- Standard: "produktion"
- .PARAMETER TestModus
- Wenn aktiviert, werden keine tatsächlichen Änderungen vorgenommen,
- sondern nur protokolliert, was geändert werden würde.
- Standard: $true
- .EXAMPLE
- PS> .\Setze-ZeichnungsordnerBerechtigungen.ps1
- Führt das Skript mit Standardeinstellungen im Testmodus aus.
- Sucht nach einem "TestFreigaben" Ordner im aktuellen Verzeichnis.
- .EXAMPLE
- PS> .\Setze-ZeichnungsordnerBerechtigungen.ps1 -BasePath "C:\Freigaben\Zeichnungen"
- Führt das Skript für einen spezifischen Basispfad aus.
- .EXAMPLE
- PS> .\Setze-ZeichnungsordnerBerechtigungen.ps1 -BasePath "D:\Daten" -ProductionGroup "Produktion" -TestModus $false
- Führt das Skript im Live-Modus mit angepasstem Pfad und Gruppennamen aus.
- .NOTES
- Dateiname: Setze-ZeichnungsordnerBerechtigungen.ps1
- Autor: System Administrator
- Voraussetzungen:
- - PowerShell mit Administratorrechten
- - Zugriff auf die Zielordner
- - Berechtigung zum Erstellen von Freigaben (wenn benötigt)
- - Existierende Produktionsgruppe im System
- #>
- # Parameter definieren
- param(
- [Parameter(Mandatory=$false)]
- [string]$BasePath = ".\TestFreigaben", # Standard: TestFreigaben im aktuellen Verzeichnis
- [Parameter(Mandatory=$false)]
- [string]$ProductionGroup = "produktion",
- [Parameter(Mandatory=$false)]
- [bool]$TestModus = $true
- )
- $LogFile = Join-Path $PSScriptRoot "log.txt"
- # Stelle sicher, dass das Encoding für die Logdatei korrekt ist
- $Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False
- function Write-Log {
- param([string]$Message)
- $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
- # Schreibe in die Logdatei (ohne Farben)
- $logMessage = "[$timestamp] $Message"
- [System.IO.File]::AppendAllText($LogFile, $logMessage + "`n", $Utf8NoBomEncoding)
- # Pruefe auf [TEST] und faerbe es rot
- if ($Message -match '^\[TEST\]') {
- $parts = $Message -split '^\[TEST\]'
- Write-Host -NoNewline "[$timestamp] "
- Write-Host -NoNewline -ForegroundColor Red "[TEST]"
- Write-Host $parts[1]
- return
- }
- # Pruefe auf BasePath und faerbe den Pfad orange
- if ($Message -match "Basispfad: (.*)") {
- Write-Host -NoNewline "[$timestamp] Basispfad: "
- Write-Host -ForegroundColor DarkYellow $matches[1]
- return
- }
- # Pruefe auf Kundenordner oder Zeichnungen & Stücklisten und faerbe blau
- if ($Message -match "Kundenordner: ([^:\n]+)") {
- Write-Host -NoNewline "[$timestamp] Kundenordner: "
- Write-Host -ForegroundColor Blue $matches[1]
- return
- }
- if ($Message -match "(Zeichnungen & Stücklisten)") {
- $parts = $Message -split "(Zeichnungen & Stücklisten)"
- Write-Host -NoNewline "[$timestamp] $($parts[0])"
- Write-Host -NoNewline -ForegroundColor Blue $matches[1]
- Write-Host $parts[2]
- return
- }
- # Standard Ausgabe ohne Farbe
- Write-Host "[$timestamp] $Message"
- }
- # Setze UTF-8 Encoding für Ein- und Ausgabe
- [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
- $OutputEncoding = [System.Text.Encoding]::UTF8
- [System.Console]::OutputEncoding = [System.Text.Encoding]::UTF8
- Write-Log "Skript wird gestartet..."
- Write-Log "Logdatei: $LogFile"
- Write-Log "Basispfad: $BasePath"
- Write-Log "Produktionsgruppe: $ProductionGroup"
- Write-Log "Testmodus: $TestModus"
- if (-not (Test-Path $BasePath)) {
- Write-Log "FEHLER: Basispfad '$BasePath' existiert nicht."
- exit 1
- }
- function Set-FolderPermissions {
- param(
- [string]$FolderPath,
- [string]$GroupName,
- [string]$Permission
- )
- try {
- $acl = Get-Acl -Path $FolderPath
- $rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
- $GroupName,
- $Permission,
- "ContainerInherit,ObjectInherit",
- "None",
- "Allow"
- )
- $acl.SetAccessRule($rule)
- Set-Acl -Path $FolderPath -AclObject $acl
- return $true
- }
- catch {
- Write-Log "FEHLER beim Setzen der Berechtigungen fuer $FolderPath"
- Write-Log "Fehlermeldung: $_"
- Write-Log "Exception Details: $($_.Exception.Message)"
- return $false
- }
- }
- # Versuche die Freigabe zu erstellen
- $shareName = Split-Path $BasePath -Leaf
- $existingShare = Get-SmbShare -Name $shareName -ErrorAction SilentlyContinue
- if ($existingShare) {
- Write-Log "Freigabe '$shareName' existiert bereits."
- }
- else {
- if ($TestModus) {
- Write-Log "[TEST] Wuerde Freigabe erstellen:"
- Write-Log "[TEST] - Name: $shareName"
- Write-Log "[TEST] - Pfad: $BasePath"
- Write-Log "[TEST] - Berechtigungen: Administrators (Vollzugriff)"
- Write-Log "[TEST] - Access Based Enumeration wird aktiviert"
- }
- else {
- try {
- New-SmbShare -Name $shareName -Path $BasePath -FullAccess "Administrators" -ErrorAction Stop
- # Access Based Enumeration aktivieren
- Set-SmbShare -Name $shareName -FolderEnumerationMode AccessBased
- Write-Log "Freigabe '$shareName' fuer '$BasePath' erfolgreich erstellt"
- Write-Log "Access Based Enumeration wurde aktiviert"
- }
- catch {
- Write-Log "WARNUNG: Freigabe konnte nicht erstellt werden: $_"
- Write-Log "Das Skript wird trotzdem fortgesetzt, um die Berechtigungen zu setzen."
- }
- }
- }
- Write-Log "Suche nach Ordnern..."
- # Finde alle Kundenordner
- $kundenOrdner = Get-ChildItem -Path $BasePath -Directory
- Write-Log "Gefundene Kundenordner: $($kundenOrdner.Count)"
- $drawingFolders = @()
- # Definiere den zu suchenden Ordnernamen
- $SearchPattern = "Zeichnungen*&*cklisten"
- Write-Log "Suche nach Ordnern die dem Muster entsprechen: $SearchPattern"
- foreach ($kunde in $kundenOrdner) {
- Write-Log "Pruefe Kundenordner: $($kunde.Name)"
- $unterOrdner = Get-ChildItem -Path $kunde.FullName -Directory | Where-Object { $_.Name -like $SearchPattern }
- foreach ($ordner in $unterOrdner) {
- Write-Log " Gefunden: $($ordner.Name)"
- Write-Log " -> Ordner entspricht den Kriterien"
- $drawingFolders += $ordner.FullName
- }
- }
- Write-Log "Gefundene Zielordner: $($drawingFolders.Count)"
- foreach ($folder in $drawingFolders) {
- Write-Log "Verarbeite: $folder"
- if ($TestModus) {
- Write-Log "[TEST] Wuerde Berechtigungen setzen fuer:"
- Write-Log "[TEST] - Pfad: $folder"
- Write-Log "[TEST] - Gruppe: $ProductionGroup"
- Write-Log "[TEST] - Berechtigung: ReadAndExecute"
- }
- else {
- $success = Set-FolderPermissions -FolderPath $folder -GroupName $ProductionGroup -Permission "ReadAndExecute"
- if ($success) {
- Write-Log "Berechtigungen fuer '$folder' erfolgreich gesetzt"
- Write-Log "Aktuelle Berechtigungen:"
- $acl = Get-Acl -Path $folder
- $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
- foreach ($access in $acl.Access) {
- # Schreibe in die Logdatei
- $logMessage = "[$timestamp] - $($access.IdentityReference) : $($access.FileSystemRights)"
- [System.IO.File]::AppendAllText($LogFile, $logMessage + "`n", $Utf8NoBomEncoding)
- # Farbige Konsolenausgabe
- Write-Host -NoNewline "[$timestamp] - "
- Write-Host -NoNewline -ForegroundColor Green $access.IdentityReference
- Write-Host -NoNewline " : "
- Write-Host -ForegroundColor Cyan $access.FileSystemRights
- }
- }
- }
- }
- Write-Log "Skript wurde erfolgreich abgeschlossen"
- Write-Host "`nDruecken Sie eine beliebige Taste zum Beenden..." -ForegroundColor Yellow
- pause
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement