From a1ee1775b869e3b1c9d7f9ac79e5fd5980fbae54 Mon Sep 17 00:00:00 2001 From: Tim Eertmoed Date: Mon, 11 Nov 2024 13:35:29 +0100 Subject: [PATCH] scripts/AD_SMB_RIGHTS.ps1 aktualisiert --- scripts/AD_SMB_RIGHTS.ps1 | 259 ++++++++++++++++++++++++++++++-------- 1 file changed, 205 insertions(+), 54 deletions(-) diff --git a/scripts/AD_SMB_RIGHTS.ps1 b/scripts/AD_SMB_RIGHTS.ps1 index ef03ba9..2eee6f1 100644 --- a/scripts/AD_SMB_RIGHTS.ps1 +++ b/scripts/AD_SMB_RIGHTS.ps1 @@ -1,24 +1,16 @@ Add-Type -AssemblyName System.Windows.Forms Import-Module ActiveDirectory -# Berechtigungen definieren -$permissions = @{ - "RO" = [System.Security.AccessControl.FileSystemRights]::Read - "RX" = [System.Security.AccessControl.FileSystemRights]::ReadAndExecute - "RW" = [System.Security.AccessControl.FileSystemRights]::Modify - "FA" = [System.Security.AccessControl.FileSystemRights]::FullControl -} - # Hauptform erstellen $form = New-Object System.Windows.Forms.Form $form.Text = "Verzeichnis- und OU-Auswahl" -$form.Size = New-Object System.Drawing.Size(648, 600) +$form.Size = New-Object System.Drawing.Size(648, 510) -# RichTextBox für Debug-Informationen hinzufügen (Breite verkleinert auf 600px) +# RichTextBox für Debug-Informationen hinzufügen $debugTextBox = New-Object System.Windows.Forms.RichTextBox $debugTextBox.Multiline = $true -$debugTextBox.Location = New-Object System.Drawing.Point(10, 380) -$debugTextBox.Size = New-Object System.Drawing.Size(610, 150) # Breite angepasst auf 600px +$debugTextBox.Location = New-Object System.Drawing.Point(10, 280) +$debugTextBox.Size = New-Object System.Drawing.Size(610, 150) $debugTextBox.ScrollBars = 'Vertical' $debugTextBox.ReadOnly = $true $form.Controls.Add($debugTextBox) @@ -29,21 +21,28 @@ $newDLs = @() # TreeView für die Ordnerstruktur (links) $folderTreeView = New-Object System.Windows.Forms.TreeView $folderTreeView.Location = New-Object System.Drawing.Point(10, 10) -$folderTreeView.Size = New-Object System.Drawing.Size(300, 300) # Höhe und Breite angepasst auf 300px +$folderTreeView.Size = New-Object System.Drawing.Size(300, 200) + +# Setze die folgenden Eigenschaften für den schreibgeschützten Zustand +$folderTreeView.LabelEdit = $false # Verhindert das Bearbeiten von Knoten +$folderTreeView.AllowDrop = $false # Verhindert Drag & Drop +$folderTreeView.HideSelection = $true # Deaktiviert die Auswahlanzeige +$folderTreeView.FullRowSelect = $false # Verhindert die vollständige Zeilenmarkierung +$folderTreeView.SelectedNode = $null # Setzt die Auswahl zurück $form.Controls.Add($folderTreeView) -# TextBox für den Hauptordner (zeigt den Pfad des ausgewählten Ordners) +# TextBox für den Hauptordner $folderTextBox = New-Object System.Windows.Forms.TextBox -$folderTextBox.Location = New-Object System.Drawing.Point(10, 315) -$folderTextBox.Size = New-Object System.Drawing.Size(300, 30) # Gleiche Breite wie die TreeView +$folderTextBox.Location = New-Object System.Drawing.Point(10, 215) +$folderTextBox.Size = New-Object System.Drawing.Size(300, 30) $folderTextBox.ReadOnly = $true $form.Controls.Add($folderTextBox) # Button für Ordnerauswahl $folderButton = New-Object System.Windows.Forms.Button $folderButton.Text = "Hauptordner auswählen" -$folderButton.Location = New-Object System.Drawing.Point(10, 340) -$folderButton.Size = New-Object System.Drawing.Size(300, 30) # Gleiche Breite wie die TextBox +$folderButton.Location = New-Object System.Drawing.Point(10, 240) +$folderButton.Size = New-Object System.Drawing.Size(300, 30) $form.Controls.Add($folderButton) # Ordnerauswahl-Funktion mit FolderBrowserDialog @@ -64,44 +63,43 @@ $folderButton.Add_Click({ $rootNode.Tag = $folderBrowser.SelectedPath # Pfad im Tag speichern $folderTreeView.Nodes.Add($rootNode) - # Lade nur die ersten Unterordner (maximal eine Ebene tief) - Load-Subfolders $folderBrowser.SelectedPath $rootNode + # Lade alle Unterordner des ausgewählten Ordners bis zur 2. Ebene (z.B. max. 2 Ebenen) + Load-Subfolders $folderBrowser.SelectedPath $rootNode 2 # Maximal 2 Ebenen laden # Expandiere den Root-Node $rootNode.Expand() } }) -# Funktion zum Laden der Unterordner in die TreeView (maximal 1 Ebene tief) +# Funktion zum Laden der Unterordner (max. 2 Ebenen) function Load-Subfolders { param ( [string]$parentFolder, - [System.Windows.Forms.TreeNode]$parentNode + [System.Windows.Forms.TreeNode]$parentNode, + [int]$maxDepth, + [int]$currentDepth = 0 ) + # Wenn die maximale Tiefe erreicht ist, breche ab + if ($currentDepth -ge $maxDepth) { + return + } + try { # Überprüfen, ob der Ordner existiert if (Test-Path $parentFolder) { # Hole alle Unterordner des aktuellen Ordners $subfolders = Get-ChildItem -Path $parentFolder -Directory -ErrorAction SilentlyContinue + # Füge alle Unterordner als Knoten hinzu foreach ($subfolder in $subfolders) { # Erstelle den Knoten für den Unterordner $node = New-Object System.Windows.Forms.TreeNode($subfolder.Name) $node.Tag = $subfolder.FullName # Pfad des Unterordners im Tag speichern $parentNode.Nodes.Add($node) - # Prüfe, ob dieser Ordner Unterordner hat (für den "+" Indikator) - $hasSubfolders = (Get-ChildItem -Path $subfolder.FullName -Directory -ErrorAction SilentlyContinue).Count -gt 0 - if ($hasSubfolders) { - # Wenn Unterordner vorhanden sind, den Knoten expandierbar machen (zeige +) - $node.Nodes.Add([System.Windows.Forms.TreeNode]::new("Dummy")) # Platzhalter hinzufügen - } - } - - # Expandiere den Node, wenn Unterordner vorhanden sind - if ($parentNode.Nodes.Count -gt 0) { - $parentNode.Expand() + # Lade Unterordner rekursiv für diesen Knoten (mit neuer Tiefe) + Load-Subfolders $subfolder.FullName $node $maxDepth ($currentDepth + 1) } } else { $debugTextBox.AppendText("Pfad nicht gefunden: $parentFolder" + [Environment]::NewLine) @@ -113,67 +111,220 @@ function Load-Subfolders { # Abschnitt für OU Auswahl -# ListBox für OUs (Höhe angepasst auf 300px) +# ListBox für OUs $ouListBox = New-Object System.Windows.Forms.ListBox -$ouListBox.Location = New-Object System.Drawing.Point(320, 10) # Etwas rechts vom TreeView -$ouListBox.Size = New-Object System.Drawing.Size(300, 305) # Gleiche Höhe wie die TreeView +$ouListBox.Location = New-Object System.Drawing.Point(320, 10) +$ouListBox.Size = New-Object System.Drawing.Size(300, 205) $ouListBox.SelectionMode = [System.Windows.Forms.SelectionMode]::MultiExtended $form.Controls.Add($ouListBox) # TextBox für die ausgewählte OU $ouTextBox = New-Object System.Windows.Forms.TextBox -$ouTextBox.Location = New-Object System.Drawing.Point(320, 315) -$ouTextBox.Size = New-Object System.Drawing.Size(300, 30) # Gleiche Breite wie ListBox +$ouTextBox.Location = New-Object System.Drawing.Point(320, 215) +$ouTextBox.Size = New-Object System.Drawing.Size(300, 30) $ouTextBox.ReadOnly = $true $form.Controls.Add($ouTextBox) # Button für OU-Auswahl $ouButton = New-Object System.Windows.Forms.Button $ouButton.Text = "OU auswählen" -$ouButton.Location = New-Object System.Drawing.Point(320, 340) -$ouButton.Size = New-Object System.Drawing.Size(300, 30) # Gleiche Breite wie TextBox +$ouButton.Location = New-Object System.Drawing.Point(320, 240) +$ouButton.Size = New-Object System.Drawing.Size(300, 30) $form.Controls.Add($ouButton) -# Funktion zum Laden der OUs in die ListBox direkt beim Start +# Event für den Button: Wenn der Button geklickt wird, öffnet sich das Fenster zur OU-Auswahl +$ouButton.Add_Click({ + # Funktion zur OU-Auswahl + function Select-OU { + Add-Type -AssemblyName System.Windows.Forms + $ous = Get-ADOrganizationalUnit -Filter * + $ouNames = $ous | ForEach-Object { $_.DistinguishedName } + + $ouForm = New-Object System.Windows.Forms.Form + $ouForm.Text = "OU auswählen" + $ouForm.Size = New-Object System.Drawing.Size(400, 300) + + $listBox = New-Object System.Windows.Forms.ListBox + $listBox.Dock = "Fill" + $listBox.Items.AddRange($ouNames) + $ouForm.Controls.Add($listBox) + + $okButton = New-Object System.Windows.Forms.Button + $okButton.Size = New-Object System.Drawing.Size(300, 30) + $okButton.Text = "OK" + $okButton.Dock = "Bottom" + $okButton.Add_Click({ + if ($listBox.SelectedItem) { + $ouForm.DialogResult = [System.Windows.Forms.DialogResult]::OK + } else { + [System.Windows.Forms.MessageBox]::Show("Bitte wählen Sie eine OU aus.") + } + }) + $ouForm.Controls.Add($okButton) + + # Zeige das Auswahlfenster und gebe die ausgewählte OU zurück + if ($ouForm.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) { + return $listBox.SelectedItem + } else { + return $null + } + } + + # Rufe die Select-OU Funktion auf und speichere die gewählte OU in der TextBox + $selectedOU = Select-OU + if ($selectedOU) { + $ouTextBox.Text = $selectedOU # Setze die ausgewählte OU in die TextBox + $debugTextBox.AppendText("Ausgewählte OU: $selectedOU" + [Environment]::NewLine) + } +}) + +# Funktion zum Laden der OUs in die ListBox function Load-OUs { try { - # Alle OUs abrufen und in die ListBox einfügen $ous = Get-ADOrganizationalUnit -Filter * | Select-Object -ExpandProperty DistinguishedName $ouListBox.Items.Clear() $ouListBox.Items.AddRange($ous) - $debugTextBox.AppendText("OUs wurden geladen." + [Environment]::NewLine) } catch { $debugTextBox.AppendText("Fehler beim Laden der OUs: $_" + [Environment]::NewLine) } } -# OUs laden, wenn das Formular geladen wird Load-OUs # Event für ListBox: Wenn eine OU ausgewählt wird $ouListBox.Add_SelectedIndexChanged({ if ($ouListBox.SelectedItem) { $ouTextBox.Text = $ouListBox.SelectedItem - $debugTextBox.AppendText("Ausgewählte OU: $($ouTextBox.Text)" + [Environment]::NewLine) } }) -# Starten Button +# Schließen Button +$closeButton = New-Object System.Windows.Forms.Button +$closeButton.Text = "Beenden" +$closeButton.Location = New-Object System.Drawing.Point(320, 435) # Direkt unterhalb der TextBox +$closeButton.Size = New-Object System.Drawing.Size(300, 30) +$closeButton.Add_Click({ + $form.Close() +}) +$form.Controls.Add($closeButton) + +# Starten Button (sichtbar und korrekt positioniert) $startButton = New-Object System.Windows.Forms.Button $startButton.Text = "Starten" -$startButton.Location = New-Object System.Drawing.Point(10, 640) -$startButton.Size = New-Object System.Drawing.Size(150, 30) +$startButton.Location = New-Object System.Drawing.Point(10, 435) # Direkt unterhalb des TextBox +$startButton.Size = New-Object System.Drawing.Size(300, 30) $startButton.Add_Click({ $mainFolderPath = $folderTextBox.Text $ouPath = $ouTextBox.Text - + if (-not $mainFolderPath) { - $debugTextBox.AppendText("Kein Hauptordner ausgewählt." + [Environment]::NewLine) - } else { - $debugTextBox.AppendText("Hauptordner: $mainFolderPath, OU: $ouPath" + [Environment]::NewLine) - # Weiterer Code für die Verarbeitung des Ordners und der OU + # Fehlernachricht (schwarz) + Add-DebugMessage -message "Bitte wählen Sie einen gültigen Ordner aus." -isPositive $false + return } + + if (-not $ouPath) { + # Fehlernachricht (schwarz) + Add-DebugMessage -message "Bitte wählen Sie eine gültige OU aus." -isPositive $false + return + } + + # Berechtigungen definieren + $permissions = @{ + "RO" = [System.Security.AccessControl.FileSystemRights]::Read + "RX" = [System.Security.AccessControl.FileSystemRights]::ReadAndExecute + "RW" = [System.Security.AccessControl.FileSystemRights]::Modify + "FA" = [System.Security.AccessControl.FileSystemRights]::FullControl + } + + # Liste für neu angelegte DLs und Rechte + $newDLs = @() + $newRights = @() + + # Unterordner im Hauptordner durchlaufen + $subfolders = Get-ChildItem -Path $mainFolderPath -Directory + foreach ($subfolder in $subfolders) { + $subfolderName = $subfolder.Name.Trim() + $subfolderNameClean = $subfolderName -replace ' ', '_' + + foreach ($permissionName in $permissions.Keys) { + $dlGroupName = "DL_${subfolderNameClean}_${permissionName}" + + # DL-Gruppe erstellen, wenn nicht vorhanden + $dlGroup = Get-ADGroup -Filter {Name -eq $dlGroupName} + if (-not $dlGroup) { + try { + New-ADGroup -Name $dlGroupName -GroupScope DomainLocal -Path $ouPath + $newDLs += $dlGroupName # Hinzufügen des DL-Namens zur Liste + # Erfolgsnachricht (grün) + Add-DebugMessage -message "Erstellt: $dlGroupName" -isPositive $true + } catch { + # Fehlernachricht (schwarz) + Add-DebugMessage -message "Fehler bei der Erstellung der Gruppe '$dlGroupName': $_" -isPositive $false + } + } + + # Berechtigungen auf Ordner setzen + try { + $acl = Get-Acl -Path $subfolder.FullName + $permission = $permissions[$permissionName] + $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule ( + $dlGroupName, + $permission, + "ContainerInherit,ObjectInherit", + "None", + "Allow" + ) + $acl.SetAccessRule($accessRule) + Set-Acl -Path $subfolder.FullName -AclObject $acl + # Füge die Berechtigungen zur Liste hinzu + $newRights += "Recht '$permissionName' auf $($subfolder.FullName) für $dlGroupName gesetzt" + # Erfolgsnachricht (grün) + Add-DebugMessage -message "Berechtigung '$permissionName' auf $($subfolder.FullName) für $dlGroupName gesetzt." -isPositive $true + } catch { + # Fehlernachricht (schwarz) + Add-DebugMessage -message "Fehler beim Setzen der Berechtigung auf $($subfolder.FullName) für '$dlGroupName': $_" -isPositive $false + } + } + } + + # Zeige die neu angelegten DLs im Debug-Fenster (grün) + Add-DebugMessage -message "Folgende DLs wurden erfolgreich angelegt:" -isPositive $true + Add-DebugMessage -message ($newDLs -join [Environment]::NewLine) -isPositive $true + + # Zeige die neu vergebenen Rechte im Debug-Fenster (grün) + Add-DebugMessage -message "Folgende Rechte wurden erfolgreich vergeben:" -isPositive $true + Add-DebugMessage -message ($newRights -join [Environment]::NewLine) -isPositive $true + + # Trennstrich + $separator = '+' * 90 # Zeichen '+' wiederholen + Add-DebugMessage -message $separator -isSeparator $true }) +$form.Controls.Add($startButton) + +# Funktion zum Hinzufügen von Text in die Debug-TextBox mit Farben +function Add-DebugMessage { + param ( + [string]$message, + [bool]$isPositive, + [bool]$isSeparator = $false # Standardwert für isSeparator auf false setzen + ) + + if ($isSeparator) { + # Setze die Textfarbe auf Schwarz für den Separator + $debugTextBox.SelectionColor = 'Black' + } elseif ($isPositive) { + # Setze die Textfarbe auf Grün für positive Nachrichten + $debugTextBox.SelectionColor = 'Green' + } else { + # Setze die Textfarbe auf Rot für negative Nachrichten + $debugTextBox.SelectionColor = 'Red' + } + + # Füge die Nachricht zum Textfeld hinzu + $debugTextBox.AppendText($message + [Environment]::NewLine) +} + # Formular anzeigen -$form.ShowDialog() +$form.ShowDialog() \ No newline at end of file