scripts/AD_SMB_RIGHTS.ps1 aktualisiert

This commit is contained in:
2024-11-11 13:35:29 +01:00
parent fcbca8d20e
commit a1ee1775b8

View File

@@ -1,24 +1,16 @@
Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Windows.Forms
Import-Module ActiveDirectory 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 # Hauptform erstellen
$form = New-Object System.Windows.Forms.Form $form = New-Object System.Windows.Forms.Form
$form.Text = "Verzeichnis- und OU-Auswahl" $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 = New-Object System.Windows.Forms.RichTextBox
$debugTextBox.Multiline = $true $debugTextBox.Multiline = $true
$debugTextBox.Location = New-Object System.Drawing.Point(10, 380) $debugTextBox.Location = New-Object System.Drawing.Point(10, 280)
$debugTextBox.Size = New-Object System.Drawing.Size(610, 150) # Breite angepasst auf 600px $debugTextBox.Size = New-Object System.Drawing.Size(610, 150)
$debugTextBox.ScrollBars = 'Vertical' $debugTextBox.ScrollBars = 'Vertical'
$debugTextBox.ReadOnly = $true $debugTextBox.ReadOnly = $true
$form.Controls.Add($debugTextBox) $form.Controls.Add($debugTextBox)
@@ -29,21 +21,28 @@ $newDLs = @()
# TreeView für die Ordnerstruktur (links) # TreeView für die Ordnerstruktur (links)
$folderTreeView = New-Object System.Windows.Forms.TreeView $folderTreeView = New-Object System.Windows.Forms.TreeView
$folderTreeView.Location = New-Object System.Drawing.Point(10, 10) $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) $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 = New-Object System.Windows.Forms.TextBox
$folderTextBox.Location = New-Object System.Drawing.Point(10, 315) $folderTextBox.Location = New-Object System.Drawing.Point(10, 215)
$folderTextBox.Size = New-Object System.Drawing.Size(300, 30) # Gleiche Breite wie die TreeView $folderTextBox.Size = New-Object System.Drawing.Size(300, 30)
$folderTextBox.ReadOnly = $true $folderTextBox.ReadOnly = $true
$form.Controls.Add($folderTextBox) $form.Controls.Add($folderTextBox)
# Button für Ordnerauswahl # Button für Ordnerauswahl
$folderButton = New-Object System.Windows.Forms.Button $folderButton = New-Object System.Windows.Forms.Button
$folderButton.Text = "Hauptordner auswählen" $folderButton.Text = "Hauptordner auswählen"
$folderButton.Location = New-Object System.Drawing.Point(10, 340) $folderButton.Location = New-Object System.Drawing.Point(10, 240)
$folderButton.Size = New-Object System.Drawing.Size(300, 30) # Gleiche Breite wie die TextBox $folderButton.Size = New-Object System.Drawing.Size(300, 30)
$form.Controls.Add($folderButton) $form.Controls.Add($folderButton)
# Ordnerauswahl-Funktion mit FolderBrowserDialog # Ordnerauswahl-Funktion mit FolderBrowserDialog
@@ -64,44 +63,43 @@ $folderButton.Add_Click({
$rootNode.Tag = $folderBrowser.SelectedPath # Pfad im Tag speichern $rootNode.Tag = $folderBrowser.SelectedPath # Pfad im Tag speichern
$folderTreeView.Nodes.Add($rootNode) $folderTreeView.Nodes.Add($rootNode)
# Lade nur die ersten Unterordner (maximal eine Ebene tief) # Lade alle Unterordner des ausgewählten Ordners bis zur 2. Ebene (z.B. max. 2 Ebenen)
Load-Subfolders $folderBrowser.SelectedPath $rootNode Load-Subfolders $folderBrowser.SelectedPath $rootNode 2 # Maximal 2 Ebenen laden
# Expandiere den Root-Node # Expandiere den Root-Node
$rootNode.Expand() $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 { function Load-Subfolders {
param ( param (
[string]$parentFolder, [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 { try {
# Überprüfen, ob der Ordner existiert # Überprüfen, ob der Ordner existiert
if (Test-Path $parentFolder) { if (Test-Path $parentFolder) {
# Hole alle Unterordner des aktuellen Ordners # Hole alle Unterordner des aktuellen Ordners
$subfolders = Get-ChildItem -Path $parentFolder -Directory -ErrorAction SilentlyContinue $subfolders = Get-ChildItem -Path $parentFolder -Directory -ErrorAction SilentlyContinue
# Füge alle Unterordner als Knoten hinzu
foreach ($subfolder in $subfolders) { foreach ($subfolder in $subfolders) {
# Erstelle den Knoten für den Unterordner # Erstelle den Knoten für den Unterordner
$node = New-Object System.Windows.Forms.TreeNode($subfolder.Name) $node = New-Object System.Windows.Forms.TreeNode($subfolder.Name)
$node.Tag = $subfolder.FullName # Pfad des Unterordners im Tag speichern $node.Tag = $subfolder.FullName # Pfad des Unterordners im Tag speichern
$parentNode.Nodes.Add($node) $parentNode.Nodes.Add($node)
# Prüfe, ob dieser Ordner Unterordner hat (für den "+" Indikator) # Lade Unterordner rekursiv für diesen Knoten (mit neuer Tiefe)
$hasSubfolders = (Get-ChildItem -Path $subfolder.FullName -Directory -ErrorAction SilentlyContinue).Count -gt 0 Load-Subfolders $subfolder.FullName $node $maxDepth ($currentDepth + 1)
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()
} }
} else { } else {
$debugTextBox.AppendText("Pfad nicht gefunden: $parentFolder" + [Environment]::NewLine) $debugTextBox.AppendText("Pfad nicht gefunden: $parentFolder" + [Environment]::NewLine)
@@ -113,67 +111,220 @@ function Load-Subfolders {
# Abschnitt für OU Auswahl # 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 = New-Object System.Windows.Forms.ListBox
$ouListBox.Location = New-Object System.Drawing.Point(320, 10) # Etwas rechts vom TreeView $ouListBox.Location = New-Object System.Drawing.Point(320, 10)
$ouListBox.Size = New-Object System.Drawing.Size(300, 305) # Gleiche Höhe wie die TreeView $ouListBox.Size = New-Object System.Drawing.Size(300, 205)
$ouListBox.SelectionMode = [System.Windows.Forms.SelectionMode]::MultiExtended $ouListBox.SelectionMode = [System.Windows.Forms.SelectionMode]::MultiExtended
$form.Controls.Add($ouListBox) $form.Controls.Add($ouListBox)
# TextBox für die ausgewählte OU # TextBox für die ausgewählte OU
$ouTextBox = New-Object System.Windows.Forms.TextBox $ouTextBox = New-Object System.Windows.Forms.TextBox
$ouTextBox.Location = New-Object System.Drawing.Point(320, 315) $ouTextBox.Location = New-Object System.Drawing.Point(320, 215)
$ouTextBox.Size = New-Object System.Drawing.Size(300, 30) # Gleiche Breite wie ListBox $ouTextBox.Size = New-Object System.Drawing.Size(300, 30)
$ouTextBox.ReadOnly = $true $ouTextBox.ReadOnly = $true
$form.Controls.Add($ouTextBox) $form.Controls.Add($ouTextBox)
# Button für OU-Auswahl # Button für OU-Auswahl
$ouButton = New-Object System.Windows.Forms.Button $ouButton = New-Object System.Windows.Forms.Button
$ouButton.Text = "OU auswählen" $ouButton.Text = "OU auswählen"
$ouButton.Location = New-Object System.Drawing.Point(320, 340) $ouButton.Location = New-Object System.Drawing.Point(320, 240)
$ouButton.Size = New-Object System.Drawing.Size(300, 30) # Gleiche Breite wie TextBox $ouButton.Size = New-Object System.Drawing.Size(300, 30)
$form.Controls.Add($ouButton) $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 { function Load-OUs {
try { try {
# Alle OUs abrufen und in die ListBox einfügen
$ous = Get-ADOrganizationalUnit -Filter * | Select-Object -ExpandProperty DistinguishedName $ous = Get-ADOrganizationalUnit -Filter * | Select-Object -ExpandProperty DistinguishedName
$ouListBox.Items.Clear() $ouListBox.Items.Clear()
$ouListBox.Items.AddRange($ous) $ouListBox.Items.AddRange($ous)
$debugTextBox.AppendText("OUs wurden geladen." + [Environment]::NewLine)
} catch { } catch {
$debugTextBox.AppendText("Fehler beim Laden der OUs: $_" + [Environment]::NewLine) $debugTextBox.AppendText("Fehler beim Laden der OUs: $_" + [Environment]::NewLine)
} }
} }
# OUs laden, wenn das Formular geladen wird
Load-OUs Load-OUs
# Event für ListBox: Wenn eine OU ausgewählt wird # Event für ListBox: Wenn eine OU ausgewählt wird
$ouListBox.Add_SelectedIndexChanged({ $ouListBox.Add_SelectedIndexChanged({
if ($ouListBox.SelectedItem) { if ($ouListBox.SelectedItem) {
$ouTextBox.Text = $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 = New-Object System.Windows.Forms.Button
$startButton.Text = "Starten" $startButton.Text = "Starten"
$startButton.Location = New-Object System.Drawing.Point(10, 640) $startButton.Location = New-Object System.Drawing.Point(10, 435) # Direkt unterhalb des TextBox
$startButton.Size = New-Object System.Drawing.Size(150, 30) $startButton.Size = New-Object System.Drawing.Size(300, 30)
$startButton.Add_Click({ $startButton.Add_Click({
$mainFolderPath = $folderTextBox.Text $mainFolderPath = $folderTextBox.Text
$ouPath = $ouTextBox.Text $ouPath = $ouTextBox.Text
if (-not $mainFolderPath) { if (-not $mainFolderPath) {
$debugTextBox.AppendText("Kein Hauptordner ausgewählt." + [Environment]::NewLine) # Fehlernachricht (schwarz)
} else { Add-DebugMessage -message "Bitte wählen Sie einen gültigen Ordner aus." -isPositive $false
$debugTextBox.AppendText("Hauptordner: $mainFolderPath, OU: $ouPath" + [Environment]::NewLine) return
# Weiterer Code für die Verarbeitung des Ordners und der OU
} }
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 # Formular anzeigen
$form.ShowDialog() $form.ShowDialog()