Advertisement
PiXLFAIL

ordnerberechtigungen anhand name

Jan 28th, 2025 (edited)
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <#
  2. .SYNOPSIS
  3.     Setzt Berechtigungen für Zeichnungsordner und erstellt optional Netzwerkfreigaben.
  4.  
  5. .DESCRIPTION
  6.     Dieses Skript automatisiert die Verwaltung von Berechtigungen für Zeichnungsordner in einer
  7.     vordefinierten Ordnerstruktur. Es durchsucht den angegebenen Basispfad nach Zeichnungsordnern,
  8.     setzt die entsprechenden Berechtigungen für eine Produktionsgruppe und erstellt bei Bedarf
  9.     die notwendigen Netzwerkfreigaben.
  10.  
  11.     Features:
  12.     - Automatische Erkennung von Zeichnungsordnern
  13.     - Setzen von Berechtigungen für die Produktionsgruppe
  14.     - Erstellung von Netzwerkfreigaben (optional)
  15.     - Umfangreiche Protokollierung in Konsole und Datei
  16.     - Testmodus für sichere Überprüfung
  17.     - UTF-8 Unterstützung für Sonderzeichen
  18.  
  19. .PARAMETER BasePath
  20.     Der Basispfad, in dem nach Zeichnungsordnern gesucht werden soll.
  21.     Standard: ".\TestFreigaben" (TestFreigaben im aktuellen Verzeichnis)
  22.  
  23. .PARAMETER ProductionGroup
  24.     Der Name der Produktionsgruppe, die Leserechte erhalten soll.
  25.     Standard: "produktion"
  26.  
  27. .PARAMETER TestModus
  28.     Wenn aktiviert, werden keine tatsächlichen Änderungen vorgenommen,
  29.     sondern nur protokolliert, was geändert werden würde.
  30.     Standard: $true
  31.  
  32. .EXAMPLE
  33.     PS> .\Setze-ZeichnungsordnerBerechtigungen.ps1
  34.     Führt das Skript mit Standardeinstellungen im Testmodus aus.
  35.     Sucht nach einem "TestFreigaben" Ordner im aktuellen Verzeichnis.
  36.  
  37. .EXAMPLE
  38.     PS> .\Setze-ZeichnungsordnerBerechtigungen.ps1 -BasePath "C:\Freigaben\Zeichnungen"
  39.     Führt das Skript für einen spezifischen Basispfad aus.
  40.  
  41. .EXAMPLE
  42.     PS> .\Setze-ZeichnungsordnerBerechtigungen.ps1 -BasePath "D:\Daten" -ProductionGroup "Produktion" -TestModus $false
  43.     Führt das Skript im Live-Modus mit angepasstem Pfad und Gruppennamen aus.
  44.  
  45. .NOTES
  46.     Dateiname: Setze-ZeichnungsordnerBerechtigungen.ps1
  47.     Autor: System Administrator
  48.     Voraussetzungen:
  49.     - PowerShell mit Administratorrechten
  50.     - Zugriff auf die Zielordner
  51.     - Berechtigung zum Erstellen von Freigaben (wenn benötigt)
  52.     - Existierende Produktionsgruppe im System
  53. #>
  54.  
  55. # Parameter definieren
  56. param(
  57.     [Parameter(Mandatory=$false)]
  58.     [string]$BasePath = ".\TestFreigaben",  # Standard: TestFreigaben im aktuellen Verzeichnis
  59.    
  60.     [Parameter(Mandatory=$false)]
  61.     [string]$ProductionGroup = "produktion",
  62.    
  63.     [Parameter(Mandatory=$false)]
  64.     [bool]$TestModus = $true
  65. )
  66.  
  67. $LogFile = Join-Path $PSScriptRoot "log.txt"
  68.  
  69. # Stelle sicher, dass das Encoding für die Logdatei korrekt ist
  70. $Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False
  71.  
  72. function Write-Log {
  73.     param([string]$Message)
  74.     $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
  75.    
  76.     # Schreibe in die Logdatei (ohne Farben)
  77.     $logMessage = "[$timestamp] $Message"
  78.     [System.IO.File]::AppendAllText($LogFile, $logMessage + "`n", $Utf8NoBomEncoding)
  79.    
  80.     # Pruefe auf [TEST] und faerbe es rot
  81.     if ($Message -match '^\[TEST\]') {
  82.         $parts = $Message -split '^\[TEST\]'
  83.         Write-Host -NoNewline "[$timestamp] "
  84.         Write-Host -NoNewline -ForegroundColor Red "[TEST]"
  85.         Write-Host $parts[1]
  86.         return
  87.     }
  88.    
  89.     # Pruefe auf BasePath und faerbe den Pfad orange
  90.     if ($Message -match "Basispfad: (.*)") {
  91.         Write-Host -NoNewline "[$timestamp] Basispfad: "
  92.         Write-Host -ForegroundColor DarkYellow $matches[1]
  93.         return
  94.     }
  95.    
  96.     # Pruefe auf Kundenordner oder Zeichnungen & Stücklisten und faerbe blau
  97.     if ($Message -match "Kundenordner: ([^:\n]+)") {
  98.         Write-Host -NoNewline "[$timestamp] Kundenordner: "
  99.         Write-Host -ForegroundColor Blue $matches[1]
  100.         return
  101.     }
  102.    
  103.     if ($Message -match "(Zeichnungen & Stücklisten)") {
  104.         $parts = $Message -split "(Zeichnungen & Stücklisten)"
  105.         Write-Host -NoNewline "[$timestamp] $($parts[0])"
  106.         Write-Host -NoNewline -ForegroundColor Blue $matches[1]
  107.         Write-Host $parts[2]
  108.         return
  109.     }
  110.    
  111.     # Standard Ausgabe ohne Farbe
  112.     Write-Host "[$timestamp] $Message"
  113. }
  114.  
  115. # Setze UTF-8 Encoding für Ein- und Ausgabe
  116. [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
  117. $OutputEncoding = [System.Text.Encoding]::UTF8
  118. [System.Console]::OutputEncoding = [System.Text.Encoding]::UTF8
  119. Write-Log "Skript wird gestartet..."
  120. Write-Log "Logdatei: $LogFile"
  121. Write-Log "Basispfad: $BasePath"
  122. Write-Log "Produktionsgruppe: $ProductionGroup"
  123. Write-Log "Testmodus: $TestModus"
  124.  
  125. if (-not (Test-Path $BasePath)) {
  126.     Write-Log "FEHLER: Basispfad '$BasePath' existiert nicht."
  127.     exit 1
  128. }
  129.  
  130. function Set-FolderPermissions {
  131.     param(
  132.         [string]$FolderPath,
  133.         [string]$GroupName,
  134.         [string]$Permission
  135.     )
  136.    
  137.     try {
  138.         $acl = Get-Acl -Path $FolderPath
  139.         $rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
  140.             $GroupName,
  141.             $Permission,
  142.             "ContainerInherit,ObjectInherit",
  143.             "None",
  144.             "Allow"
  145.         )
  146.         $acl.SetAccessRule($rule)
  147.         Set-Acl -Path $FolderPath -AclObject $acl
  148.         return $true
  149.     }
  150.     catch {
  151.             Write-Log "FEHLER beim Setzen der Berechtigungen fuer $FolderPath"
  152.             Write-Log "Fehlermeldung: $_"
  153.             Write-Log "Exception Details: $($_.Exception.Message)"
  154.         return $false
  155.     }
  156. }
  157.  
  158. # Versuche die Freigabe zu erstellen
  159. $shareName = Split-Path $BasePath -Leaf
  160. $existingShare = Get-SmbShare -Name $shareName -ErrorAction SilentlyContinue
  161.  
  162. if ($existingShare) {
  163.     Write-Log "Freigabe '$shareName' existiert bereits."
  164. }
  165. else {
  166.     if ($TestModus) {
  167.         Write-Log "[TEST] Wuerde Freigabe erstellen:"
  168.         Write-Log "[TEST] - Name: $shareName"
  169.         Write-Log "[TEST] - Pfad: $BasePath"
  170.         Write-Log "[TEST] - Berechtigungen: Administrators (Vollzugriff)"
  171.         Write-Log "[TEST] - Access Based Enumeration wird aktiviert"
  172.     }
  173.     else {
  174.         try {
  175.             New-SmbShare -Name $shareName -Path $BasePath -FullAccess "Administrators" -ErrorAction Stop
  176.             # Access Based Enumeration aktivieren
  177.             Set-SmbShare -Name $shareName -FolderEnumerationMode AccessBased
  178.             Write-Log "Freigabe '$shareName' fuer '$BasePath' erfolgreich erstellt"
  179.             Write-Log "Access Based Enumeration wurde aktiviert"
  180.         }
  181.         catch {
  182.             Write-Log "WARNUNG: Freigabe konnte nicht erstellt werden: $_"
  183.             Write-Log "Das Skript wird trotzdem fortgesetzt, um die Berechtigungen zu setzen."
  184.         }
  185.     }
  186. }
  187.  
  188. Write-Log "Suche nach Ordnern..."
  189.  
  190. # Finde alle Kundenordner
  191. $kundenOrdner = Get-ChildItem -Path $BasePath -Directory
  192. Write-Log "Gefundene Kundenordner: $($kundenOrdner.Count)"
  193.  
  194. $drawingFolders = @()
  195.  
  196. # Definiere den zu suchenden Ordnernamen
  197. $SearchPattern = "Zeichnungen*&*cklisten"
  198. Write-Log "Suche nach Ordnern die dem Muster entsprechen: $SearchPattern"
  199.  
  200. foreach ($kunde in $kundenOrdner) {
  201.     Write-Log "Pruefe Kundenordner: $($kunde.Name)"
  202.     $unterOrdner = Get-ChildItem -Path $kunde.FullName -Directory | Where-Object { $_.Name -like $SearchPattern }
  203.     foreach ($ordner in $unterOrdner) {
  204.         Write-Log "  Gefunden: $($ordner.Name)"
  205.         Write-Log "  -> Ordner entspricht den Kriterien"
  206.         $drawingFolders += $ordner.FullName
  207.     }
  208. }
  209.  
  210. Write-Log "Gefundene Zielordner: $($drawingFolders.Count)"
  211.  
  212. foreach ($folder in $drawingFolders) {
  213.     Write-Log "Verarbeite: $folder"
  214.     if ($TestModus) {
  215.         Write-Log "[TEST] Wuerde Berechtigungen setzen fuer:"
  216.         Write-Log "[TEST] - Pfad: $folder"
  217.         Write-Log "[TEST] - Gruppe: $ProductionGroup"
  218.         Write-Log "[TEST] - Berechtigung: ReadAndExecute"
  219.     }
  220.     else {
  221.         $success = Set-FolderPermissions -FolderPath $folder -GroupName $ProductionGroup -Permission "ReadAndExecute"
  222.         if ($success) {
  223.             Write-Log "Berechtigungen fuer '$folder' erfolgreich gesetzt"
  224.             Write-Log "Aktuelle Berechtigungen:"
  225.             $acl = Get-Acl -Path $folder
  226.             $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
  227.             foreach ($access in $acl.Access) {
  228.                 # Schreibe in die Logdatei
  229.                 $logMessage = "[$timestamp]   - $($access.IdentityReference) : $($access.FileSystemRights)"
  230.                 [System.IO.File]::AppendAllText($LogFile, $logMessage + "`n", $Utf8NoBomEncoding)
  231.                
  232.                 # Farbige Konsolenausgabe
  233.                 Write-Host -NoNewline "[$timestamp]   - "
  234.                 Write-Host -NoNewline -ForegroundColor Green $access.IdentityReference
  235.                 Write-Host -NoNewline " : "
  236.                 Write-Host -ForegroundColor Cyan $access.FileSystemRights
  237.             }
  238.         }
  239.     }
  240. }
  241.  
  242. Write-Log "Skript wurde erfolgreich abgeschlossen"
  243.  
  244. Write-Host "`nDruecken Sie eine beliebige Taste zum Beenden..." -ForegroundColor Yellow
  245. pause
  246.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement