#Requires -Version 5.1 param( [Parameter(Mandatory=$true)] [string]$Path ) $ErrorActionPreference = "Stop" Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing function Get-Config { $configPaths = @( "$env:APPDATA\FreigabeKontextmenue\config.json", "$env:ProgramData\FreigabeKontextmenue\config.json" ) foreach ($configPath in $configPaths) { if (Test-Path $configPath) { return Get-Content $configPath -Raw | ConvertFrom-Json } } throw "Konfiguration nicht gefunden. Bitte zuerst installieren!" } function Get-FreigabeInfo { param([string]$TargetPath) $metaDirs = @( "$env:ProgramData\FreigabeKontextmenue\meta", "$env:APPDATA\FreigabeKontextmenue\meta" ) $pathHash = [System.BitConverter]::ToString([System.Security.Cryptography.MD5]::Create().ComputeHash([System.Text.Encoding]::UTF8.GetBytes($TargetPath))).Replace("-","") foreach ($metaDir in $metaDirs) { $metaFile = Join-Path $metaDir "$pathHash.json" if (Test-Path $metaFile) { return Get-Content $metaFile -Raw | ConvertFrom-Json } } return $null } function Save-FreigabeInfo { param( [string]$TargetPath, [array]$Users ) $metaDir = if (Test-Path "$env:ProgramData\FreigabeKontextmenue") { "$env:ProgramData\FreigabeKontextmenue\meta" } else { "$env:APPDATA\FreigabeKontextmenue\meta" } $pathHash = [System.BitConverter]::ToString([System.Security.Cryptography.MD5]::Create().ComputeHash([System.Text.Encoding]::UTF8.GetBytes($TargetPath))).Replace("-","") $metaFile = Join-Path $metaDir "$pathHash.json" if ($Users.Count -eq 0) { if (Test-Path $metaFile) { Remove-Item $metaFile -Force } } else { $meta = @{ TargetPath = $TargetPath Users = $Users } $meta | ConvertTo-Json | Set-Content -Path $metaFile -Encoding UTF8 } } function Show-UserRemoveDialog { param([array]$Users) $form = New-Object System.Windows.Forms.Form $form.Text = "Freigabe entfernen - Benutzer auswählen" $form.Size = New-Object System.Drawing.Size(400, 400) $form.StartPosition = "CenterScreen" $form.FormBorderStyle = "FixedDialog" $form.MaximizeBox = $false $label = New-Object System.Windows.Forms.Label $label.Text = "Freigabe entfernen für folgende Benutzer:" $label.Location = New-Object System.Drawing.Point(10, 15) $label.Size = New-Object System.Drawing.Size(360, 20) $form.Controls.Add($label) $checkedListBox = New-Object System.Windows.Forms.CheckedListBox $checkedListBox.Location = New-Object System.Drawing.Point(10, 40) $checkedListBox.Size = New-Object System.Drawing.Size(360, 260) $checkedListBox.Font = New-Object System.Drawing.Font("Segoe UI", 10) $checkedListBox.CheckOnClick = $true $form.Controls.Add($checkedListBox) foreach ($user in $Users) { $checkedListBox.Items.Add($user) | Out-Null } $selectAllBtn = New-Object System.Windows.Forms.Button $selectAllBtn.Text = "Alle auswählen" $selectAllBtn.Location = New-Object System.Drawing.Point(10, 310) $selectAllBtn.Size = New-Object System.Drawing.Size(100, 25) $selectAllBtn.Add_Click({ for ($i = 0; $i -lt $checkedListBox.Items.Count; $i++) { $checkedListBox.SetItemChecked($i, $true) } }) $form.Controls.Add($selectAllBtn) $okBtn = New-Object System.Windows.Forms.Button $okBtn.Text = "Entfernen" $okBtn.Location = New-Object System.Drawing.Point(190, 310) $okBtn.Size = New-Object System.Drawing.Size(85, 30) $okBtn.DialogResult = [System.Windows.Forms.DialogResult]::OK $form.AcceptButton = $okBtn $form.Controls.Add($okBtn) $cancelBtn = New-Object System.Windows.Forms.Button $cancelBtn.Text = "Abbrechen" $cancelBtn.Location = New-Object System.Drawing.Point(285, 310) $cancelBtn.Size = New-Object System.Drawing.Size(85, 30) $cancelBtn.DialogResult = [System.Windows.Forms.DialogResult]::Cancel $form.CancelButton = $cancelBtn $form.Controls.Add($cancelBtn) $script:selectedUsers = @() if ($form.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) { $script:selectedUsers = @($checkedListBox.CheckedItems) } return $script:selectedUsers } function Remove-FreigabePermission { param( [string]$TargetPath, [string]$QualifiedUserName ) try { $acl = Get-Acl -Path $TargetPath $rulesToRemove = $acl.Access | Where-Object { $_.IdentityReference.Value -eq $QualifiedUserName } foreach ($rule in $rulesToRemove) { $acl.RemoveAccessRule($rule) | Out-Null } Set-Acl -Path $TargetPath -AclObject $acl return $true } catch { Write-Warning "Fehler beim Entfernen der Berechtigung für $QualifiedUserName : $_" return $false } } function Remove-UserShortcut { param( [string]$TargetPath, [string]$QualifiedUserName, [string]$BasePath ) # SamAccountName aus QualifiedName extrahieren (für Ordnerpfad) $samAccountName = if ($QualifiedUserName -match '\\') { $QualifiedUserName.Split('\')[1] } else { $QualifiedUserName } $userFolder = Join-Path $BasePath $samAccountName if (-not (Test-Path $userFolder)) { return } $shortcuts = Get-ChildItem -Path $userFolder -Filter "*.lnk" -ErrorAction SilentlyContinue $shell = New-Object -ComObject WScript.Shell foreach ($shortcut in $shortcuts) { try { $lnk = $shell.CreateShortcut($shortcut.FullName) $shortcutTarget = $lnk.TargetPath $targetNormalized = $TargetPath.TrimEnd('\').ToLower() $shortcutTargetNormalized = $shortcutTarget.TrimEnd('\').ToLower() $targetName = Split-Path $TargetPath -Leaf $shortcutTargetName = Split-Path $shortcutTarget -Leaf if ($shortcutTargetNormalized -eq $targetNormalized -or ($targetName.ToLower() -eq $shortcutTargetName.ToLower() -and $shortcutTarget -match [regex]::Escape($targetName))) { Remove-Item -Path $shortcut.FullName -Force } } catch { Write-Warning "Fehler beim Prüfen der Verknüpfung: $($shortcut.Name)" } } [System.Runtime.Interopservices.Marshal]::ReleaseComObject($shell) | Out-Null $remainingItems = Get-ChildItem -Path $userFolder -ErrorAction SilentlyContinue if ($remainingItems.Count -eq 0) { Remove-Item -Path $userFolder -Force -ErrorAction SilentlyContinue } } try { $config = Get-Config $basePath = $config.LinkBasePath if (-not (Test-Path $Path)) { throw "Der Pfad existiert nicht: $Path" } $freigabeInfo = Get-FreigabeInfo -TargetPath $Path if (-not $freigabeInfo -or $freigabeInfo.Users.Count -eq 0) { [System.Windows.Forms.MessageBox]::Show( "Für dieses Element wurden keine Freigaben über das Kontextmenü erstellt.", "Keine Freigaben", [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Information ) exit 0 } $usersToRemove = Show-UserRemoveDialog -Users $freigabeInfo.Users if ($usersToRemove.Count -eq 0) { exit 0 } $removedUsers = @() $errors = @() foreach ($qualifiedUserName in $usersToRemove) { try { Remove-FreigabePermission -TargetPath $Path -QualifiedUserName $qualifiedUserName Remove-UserShortcut -TargetPath $Path -QualifiedUserName $qualifiedUserName -BasePath $basePath $removedUsers += $qualifiedUserName } catch { $errors += "Fehler bei $qualifiedUserName : $_" } } $remainingUsers = @($freigabeInfo.Users | Where-Object { $_ -notin $removedUsers }) Save-FreigabeInfo -TargetPath $Path -Users $remainingUsers $message = "Freigaben entfernt für:`n" + ($removedUsers -join "`n") if ($errors.Count -gt 0) { $message += "`n`nFehler:`n" + ($errors -join "`n") } [System.Windows.Forms.MessageBox]::Show( $message, "Freigaben entfernt", [System.Windows.Forms.MessageBoxButtons]::OK, $(if ($errors.Count -gt 0) { [System.Windows.Forms.MessageBoxIcon]::Warning } else { [System.Windows.Forms.MessageBoxIcon]::Information }) ) } catch { [System.Windows.Forms.MessageBox]::Show( "Fehler: $($_.Exception.Message)", "Fehler", [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Error ) exit 1 }