DE
Trytodelete ist ein Hilfsprogramm für Windows-Betriebssysteme, das die Entfernung von Dateisystemobjekten ermöglicht, die aufgrund restriktiver Zugriffssteuerungslisten (ACLs) oder des Besitzstatus durch privilegierte Konten (z. B. TrustedInstaller) für Standard-Benutzer oder Administratoren unzugänglich sind. Das Programm automatisiert die Interaktion mit den Windows-Systemwerkzeugen takeown.exe und icacls.exe. Durch die Übernahme des Besitzes und die anschließende Modifikation der ACLs auf Vollzugriff (Full Control) wird die Blockade der Zielobjekte aufgehoben.
EN
Trytodelete is a utility for Windows operating systems that enables the deletion of file system objects otherwise inaccessible to standard users or administrators due to restrictive access control lists (ACLs) or ownership by privileged accounts (e.g., TrustedInstaller). The program automates interaction with the Windows system tools takeown.exe and icacls.exe. By taking ownership and subsequently modifying the ACLs to grant "Full Control," the restrictions blocking the target objects are removed.
Download
Source
Imports System.Diagnostics
Imports System.IO
Imports System.Security.Cryptography
Public Class TTD
Dim FoldersToCleanup As New List(Of String)
' --- Datei/Ordner hinzufügen ---
Private Sub PFile_Click(sender As Object, e As EventArgs) Handles PFile.Click
Dim ofd As New OpenFileDialog()
ofd.Multiselect = True ' Erlaubt mehrere Dateien auf einmal
If ofd.ShowDialog() = DialogResult.OK Then
For Each file In ofd.FileNames
DeleteList.Items.Add(file)
FolderPath.Text = file ' Zeigt die zuletzt gewählte Datei an
RTBLog.AppendText("Datei hinzugefügt: " & file & vbCrLf)
Next
End If
End Sub
Private Sub PFolder_Click(sender As Object, e As EventArgs) Handles PFolder.Click
Dim fbd As New FolderBrowserDialog()
If fbd.ShowDialog() = DialogResult.OK Then
Dim selectedPath As String = fbd.SelectedPath
FolderPath.Text = selectedPath
FoldersToCleanup.Add(fbd.SelectedPath)
' Wir rufen eine Hilfsfunktion auf, die alle Dateien auflistet
AddFilesToList(selectedPath)
RTBLog.AppendText("Ordner eingelesen: " & selectedPath & vbCrLf)
End If
End Sub
Private Sub AddFilesToList(ByVal path As String)
Try
' 1. Alle Dateien im aktuellen Ordner hinzufügen
For Each file As String In Directory.GetFiles(path)
DeleteList.Items.Add(file)
Next
' 2. Rekursion: Alle Unterordner durchlaufen
For Each subDir As String In Directory.GetDirectories(path)
AddFilesToList(subDir)
Next
Catch ex As Exception
RTBLog.AppendText("Fehler beim Einlesen: " & ex.Message & vbCrLf)
End Try
End Sub
' --- Löschvorgang starten ---
' --- Angepasste Logik für POkay ---
Private Sub POkay_Click(sender As Object, e As EventArgs) Handles POkay.Click
If DeleteList.Items.Count = 0 Then Return
' 1. Dateien löschen (Die Liste in der Liste)
For Each item As String In DeleteList.Items
Dim path As String = item.ToString()
If File.Exists(path) Then
' Besitz übernehmen und löschen
TakeOwnership(path)
File.Delete(path)
RTBLog.AppendText("Datei gelöscht: " & path & vbCrLf)
End If
Next
' 2. Jetzt die Ordner löschen
' Wir nehmen hier die Ordner, die wir beim Einlesen in einer separaten Liste gespeichert haben
For Each folder As String In FoldersToCleanup
If Directory.Exists(folder) Then
TakeOwnership(folder)
Directory.Delete(folder, True) ' True = Löscht auch Inhalt, falls noch was da ist
RTBLog.AppendText("Ordner entfernt: " & folder & vbCrLf)
End If
Next
DeleteList.Items.Clear()
FoldersToCleanup.Clear()
RTBLog.AppendText("Säuberung abgeschlossen." & vbCrLf)
End Sub
' --- Die Kern-Funktion ---
Private Sub ProcessPath(path As String)
Try
RTBLog.AppendText("Bearbeite: " & path & vbCrLf)
' 1. Besitz übernehmen
RunCmd("takeown", "/F """ & path & """ /R /D J")
' 2. Rechte setzen (für Administratoren)
RunCmd("icacls", """" & path & """ /grant Administratoren:F /T /C /L")
' 3. Löschen
If Directory.Exists(path) Then
Directory.Delete(path, True)
ElseIf File.Exists(path) Then
File.Delete(path)
End If
RTBLog.AppendText("Erfolgreich gelöscht: " & path & vbCrLf)
Catch ex As Exception
RTBLog.AppendText("FEHLER bei " & path & ": " & ex.Message & vbCrLf)
End Try
End Sub
Private Sub RunCmd(filename As String, arguments As String)
Dim psi As New ProcessStartInfo()
psi.FileName = filename
psi.Arguments = arguments
psi.WindowStyle = ProcessWindowStyle.Hidden
psi.CreateNoWindow = True
psi.UseShellExecute = False
' WICHTIG: Damit Admin-Befehle funktionieren, muss das Programm
' als Administrator gestartet sein (Manifest!)
Using p As Process = Process.Start(psi)
p.WaitForExit()
End Using
End Sub
Private Sub TakeOwnership(path As String)
Try
' 1. Besitz übernehmen (für die Datei/den Ordner)
RunCmd("takeown", "/F """ & path & """ /A") ' /A weist die Gruppe Administratoren als Besitzer zu
' 2. Vollzugriff für die Gruppe Administratoren gewähren
RunCmd("icacls", """" & path & """ /grant Administratoren:F /T /C /L")
Catch ex As Exception
RTBLog.AppendText("Fehler bei Rechteänderung für " & path & ": " & ex.Message & vbCrLf)
End Try
End Sub
' --- Abbruch ---
Private Sub PAbbruch_Click(sender As Object, e As EventArgs) Handles PAbbruch.Click
' Hier könntest du laufende Prozesse stoppen, falls nötig
RTBLog.AppendText("Vorgang abgebrochen." & vbCrLf)
DeleteList.Items.Clear()
PB.Value = 0
End Sub
End Class