Advertisement
PiXLFAIL

ordnerstruktur berechtigungen v2

Jan 28th, 2025
16
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.64 KB | None | 0 0
  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. # Prüfe auf Admin-Rechte
  120. $isAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
  121. if (-not $isAdmin) {
  122. Write-Log "FEHLER: Dieses Skript benötigt Administrator-Rechte."
  123. Write-Log "Bitte PowerShell als Administrator ausführen."
  124. exit 1
  125. }
  126.  
  127. Write-Log "Skript wird gestartet..."
  128. Write-Log "Logdatei: $LogFile"
  129.  
  130. # Prüfe ob die Gruppe existiert
  131. $group = $null
  132. try {
  133. $group = [ADSI]"WinNT://./$ProductionGroup"
  134. $group.Get("Name")
  135. }
  136. catch {
  137. Write-Log "FEHLER: Die Gruppe '$ProductionGroup' existiert nicht im System."
  138. Write-Log "Bitte erstellen Sie die Gruppe oder geben Sie eine existierende Gruppe an."
  139. exit 1
  140. }
  141. Write-Log "Basispfad: $BasePath"
  142. Write-Log "Produktionsgruppe: $ProductionGroup"
  143. Write-Log "Testmodus: $TestModus"
  144.  
  145. if (-not (Test-Path $BasePath)) {
  146. Write-Log "FEHLER: Basispfad '$BasePath' existiert nicht."
  147. exit 1
  148. }
  149.  
  150. function Set-FolderPermissions {
  151. param(
  152. [string]$FolderPath,
  153. [string]$GroupName,
  154. [string]$Permission
  155. )
  156.  
  157. try {
  158. $acl = Get-Acl -Path $FolderPath
  159. $domainGroup = "$env:COMPUTERNAME\$GroupName"
  160. Write-Log "Verwende Gruppenname: $domainGroup"
  161. $rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
  162. $domainGroup,
  163. $Permission,
  164. "ContainerInherit,ObjectInherit",
  165. "None",
  166. "Allow"
  167. )
  168. $acl.SetAccessRule($rule)
  169. Set-Acl -Path $FolderPath -AclObject $acl
  170. return $true
  171. }
  172. catch {
  173. Write-Log "FEHLER beim Setzen der Berechtigungen fuer $FolderPath"
  174. Write-Log "Fehlermeldung: $_"
  175. Write-Log "Exception Details: $($_.Exception.Message)"
  176. return $false
  177. }
  178. }
  179.  
  180. # Versuche die Freigabe zu erstellen
  181. $shareName = Split-Path $BasePath -Leaf
  182. $existingShare = Get-SmbShare -Name $shareName -ErrorAction SilentlyContinue
  183.  
  184. if ($existingShare) {
  185. Write-Log "Freigabe '$shareName' existiert bereits."
  186. }
  187. else {
  188. if ($TestModus) {
  189. Write-Log "[TEST] Wuerde Freigabe erstellen:"
  190. Write-Log "[TEST] - Name: $shareName"
  191. Write-Log "[TEST] - Pfad: $BasePath"
  192. Write-Log "[TEST] - Berechtigungen: Administrators (Vollzugriff)"
  193. Write-Log "[TEST] - Access Based Enumeration wird aktiviert"
  194. }
  195. else {
  196. try {
  197. New-SmbShare -Name $shareName -Path $BasePath -FullAccess "Administrators" -ErrorAction Stop
  198. # Access Based Enumeration aktivieren
  199. Set-SmbShare -Name $shareName -FolderEnumerationMode AccessBased
  200. Write-Log "Freigabe '$shareName' fuer '$BasePath' erfolgreich erstellt"
  201. Write-Log "Access Based Enumeration wurde aktiviert"
  202. }
  203. catch {
  204. Write-Log "WARNUNG: Freigabe konnte nicht erstellt werden: $_"
  205. Write-Log "Das Skript wird trotzdem fortgesetzt, um die Berechtigungen zu setzen."
  206. }
  207. }
  208. }
  209.  
  210. Write-Log "Suche nach Ordnern..."
  211.  
  212. # Finde alle Kundenordner
  213. $kundenOrdner = Get-ChildItem -Path $BasePath -Directory
  214. Write-Log "Gefundene Kundenordner: $($kundenOrdner.Count)"
  215.  
  216. $drawingFolders = @()
  217.  
  218. # Definiere den zu suchenden Ordnernamen
  219. $SearchPattern = "Zeichnungen*&*cklisten"
  220. Write-Log "Suche nach Ordnern die dem Muster entsprechen: $SearchPattern"
  221.  
  222. foreach ($kunde in $kundenOrdner) {
  223. Write-Log "Pruefe Kundenordner: $($kunde.Name)"
  224. $unterOrdner = Get-ChildItem -Path $kunde.FullName -Directory | Where-Object { $_.Name -like $SearchPattern }
  225. foreach ($ordner in $unterOrdner) {
  226. Write-Log " Gefunden: $($ordner.Name)"
  227. Write-Log " -> Ordner entspricht den Kriterien"
  228. $drawingFolders += $ordner.FullName
  229. }
  230. }
  231.  
  232. Write-Log "Gefundene Zielordner: $($drawingFolders.Count)"
  233.  
  234. foreach ($folder in $drawingFolders) {
  235. Write-Log "Verarbeite: $folder"
  236. if ($TestModus) {
  237. Write-Log "[TEST] Wuerde Berechtigungen setzen fuer:"
  238. Write-Log "[TEST] - Pfad: $folder"
  239. Write-Log "[TEST] - Gruppe: $ProductionGroup"
  240. Write-Log "[TEST] - Berechtigung: ReadAndExecute"
  241. }
  242. else {
  243. $success = Set-FolderPermissions -FolderPath $folder -GroupName $ProductionGroup -Permission "ReadAndExecute"
  244. if ($success) {
  245. Write-Log "Berechtigungen fuer '$folder' erfolgreich gesetzt"
  246. Write-Log "Aktuelle Berechtigungen:"
  247. $acl = Get-Acl -Path $folder
  248. $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
  249. foreach ($access in $acl.Access) {
  250. # Schreibe in die Logdatei
  251. $logMessage = "[$timestamp] - $($access.IdentityReference) : $($access.FileSystemRights)"
  252. [System.IO.File]::AppendAllText($LogFile, $logMessage + "`n", $Utf8NoBomEncoding)
  253.  
  254. # Farbige Konsolenausgabe
  255. Write-Host -NoNewline "[$timestamp] - "
  256. Write-Host -NoNewline -ForegroundColor Green $access.IdentityReference
  257. Write-Host -NoNewline " : "
  258. Write-Host -ForegroundColor Cyan $access.FileSystemRights
  259. }
  260. }
  261. }
  262. }
  263.  
  264. Write-Log "Skript wurde erfolgreich abgeschlossen"
  265.  
  266. Write-Host "`nDruecken Sie eine beliebige Taste zum Beenden..." -ForegroundColor Yellow
  267. pause
  268.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement