Advertisement
PiXLFAIL

Untitled

Jan 28th, 2025
24
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.73 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. $absolutePath = (Resolve-Path $BasePath).Path
  183. $existingShare = Get-SmbShare -Name $shareName -ErrorAction SilentlyContinue
  184.  
  185. if ($existingShare) {
  186. Write-Log "Freigabe '$shareName' existiert bereits."
  187. if (-not $TestModus) {
  188. try {
  189. # Aktualisiere Berechtigungen der existierenden Freigabe
  190. Grant-SmbShareAccess -Name $shareName -AccountName "$env:COMPUTERNAME\$ProductionGroup" -AccessRight Read -Force
  191. Write-Log "Berechtigungen der existierenden Freigabe wurden aktualisiert"
  192. }
  193. catch {
  194. Write-Log "WARNUNG: Konnte Berechtigungen der existierenden Freigabe nicht aktualisieren: $_"
  195. }
  196. }
  197. }
  198. else {
  199. if ($TestModus) {
  200. Write-Log "[TEST] Wuerde Freigabe erstellen:"
  201. Write-Log "[TEST] - Name: $shareName"
  202. Write-Log "[TEST] - Pfad: $absolutePath"
  203. Write-Log "[TEST] - Berechtigungen:"
  204. Write-Log "[TEST] - Administrators (Vollzugriff)"
  205. Write-Log "[TEST] - $ProductionGroup (Lesen)"
  206. Write-Log "[TEST] - Access Based Enumeration wird aktiviert"
  207. }
  208. else {
  209. try {
  210. # Erstelle die Freigabe mit Berechtigungen
  211. New-SmbShare -Name $shareName -Path $absolutePath -FullAccess "Administrators" -ReadAccess "$env:COMPUTERNAME\$ProductionGroup" -ErrorAction Stop
  212.  
  213. # Access Based Enumeration aktivieren
  214. Set-SmbShare -Name $shareName -FolderEnumerationMode AccessBased
  215.  
  216. Write-Log "Freigabe '$shareName' wurde erfolgreich erstellt"
  217. Write-Log "Freigabepfad: $absolutePath"
  218. Write-Log "Access Based Enumeration wurde aktiviert"
  219.  
  220. # Zeige die aktuellen Freigabeberechtigungen an
  221. $shareAccess = Get-SmbShareAccess -Name $shareName
  222. Write-Log "Aktuelle Freigabeberechtigungen:"
  223. foreach ($access in $shareAccess) {
  224. Write-Log " - $($access.AccountName): $($access.AccessRight)"
  225. }
  226. }
  227. catch {
  228. Write-Log "FEHLER: Freigabe konnte nicht erstellt werden: $_"
  229. Write-Log "Details: $($_.Exception.Message)"
  230. exit 1
  231. }
  232. }
  233. }
  234.  
  235. Write-Log "Suche nach Ordnern..."
  236.  
  237. # Finde alle Kundenordner
  238. $kundenOrdner = Get-ChildItem -Path $BasePath -Directory
  239. Write-Log "Gefundene Kundenordner: $($kundenOrdner.Count)"
  240.  
  241. $drawingFolders = @()
  242.  
  243. # Definiere den zu suchenden Ordnernamen
  244. $SearchPattern = "Zeichnungen*&*cklisten"
  245. Write-Log "Suche nach Ordnern die dem Muster entsprechen: $SearchPattern"
  246.  
  247. foreach ($kunde in $kundenOrdner) {
  248. Write-Log "Pruefe Kundenordner: $($kunde.Name)"
  249. $unterOrdner = Get-ChildItem -Path $kunde.FullName -Directory | Where-Object { $_.Name -like $SearchPattern }
  250. foreach ($ordner in $unterOrdner) {
  251. Write-Log " Gefunden: $($ordner.Name)"
  252. Write-Log " -> Ordner entspricht den Kriterien"
  253. $drawingFolders += $ordner.FullName
  254. }
  255. }
  256.  
  257. Write-Log "Gefundene Zielordner: $($drawingFolders.Count)"
  258.  
  259. foreach ($folder in $drawingFolders) {
  260. Write-Log "Verarbeite: $folder"
  261. if ($TestModus) {
  262. Write-Log "[TEST] Wuerde Berechtigungen setzen fuer:"
  263. Write-Log "[TEST] - Pfad: $folder"
  264. Write-Log "[TEST] - Gruppe: $ProductionGroup"
  265. Write-Log "[TEST] - Berechtigung: ReadAndExecute"
  266. }
  267. else {
  268. $success = Set-FolderPermissions -FolderPath $folder -GroupName $ProductionGroup -Permission "ReadAndExecute"
  269. if ($success) {
  270. Write-Log "Berechtigungen fuer '$folder' erfolgreich gesetzt"
  271. Write-Log "Aktuelle Berechtigungen:"
  272. $acl = Get-Acl -Path $folder
  273. $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
  274. foreach ($access in $acl.Access) {
  275. # Schreibe in die Logdatei
  276. $logMessage = "[$timestamp] - $($access.IdentityReference) : $($access.FileSystemRights)"
  277. [System.IO.File]::AppendAllText($LogFile, $logMessage + "`n", $Utf8NoBomEncoding)
  278.  
  279. # Farbige Konsolenausgabe
  280. Write-Host -NoNewline "[$timestamp] - "
  281. Write-Host -NoNewline -ForegroundColor Green $access.IdentityReference
  282. Write-Host -NoNewline " : "
  283. Write-Host -ForegroundColor Cyan $access.FileSystemRights
  284. }
  285. }
  286. }
  287. }
  288.  
  289. Write-Log "Skript wurde erfolgreich abgeschlossen"
  290.  
  291. Write-Host "`nDruecken Sie eine beliebige Taste zum Beenden..." -ForegroundColor Yellow
  292. pause
  293.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement