[VB.NET] User auslesen und bestimmte Dateien löschen

  • VB.NET

Es gibt 61 Antworten in diesem Thema. Der letzte Beitrag () ist von Drahuverar.

    [VB.NET] User auslesen und bestimmte Dateien löschen

    Hallo Leute ich bins mal wieder :)
    Ich wollte ein kleines Programm mit 2 Buttons (ButtonUserAbfragen und ButtonDatenLoeschen) erstellen, welches beim Klick auf ButtonUserAbfragen alle User unter C:\Users\ ausliest und anschließend unter jedem Benutzer in den Temp-Ordner geht und dort alles löscht.

    Leider habe ich keine Ahnung, wie ich bewerkstelligen kann, dass man in jedem Temp-Ordner der einzelnen Benutzer alles löscht. Ich vermute mal mit einer For-Schleife, aber damit tu ich mir momentan noch ein wenig schwer :/ Wäre echt dankbar für einen Lösungsansatz.

    Vielen Dank! :)
    @MS95 Für Deinen eigenen Temp-Ordner stellt das kein Problem dar.
    Für die Temp-Ordner der anderen User brauchst Du Admin-Rechte, sonst könnte ja jeder "einfache User" die Daten jedes anderen Users löschen. Das verhindert das Betriebssystem.
    Möglicherweise bietet Dein Virenscanner eine solche Aufräum-Option.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi,

    also du magst ermitteln welche User-Verzeichnisse unter "C:\Users" angelegt sind -dann kannst du folgendes nutzen:
    (In dem Beispiel nutze ich eine Listbox um die Werte aufzulisten)

    VB.NET-Quellcode

    1. For Each Dir As String In Directory.GetDirectories("c:\Users")
    2. Dim userpaths = Dir.Split(Path.DirectorySeparatorChar)
    3. ListBox1.Items.Add(userpaths(2))
    4. Next


    Ich nehme mal an, dass du diesen Pfad meinst, wenn du Temp sagst?
    C:\Users\<User>\AppData\Local\Temp

    Wie Rod schon gesagt hat, wenn der Nutzer Berechtigungen dazu hat, dann geht das, andernfalls immer als "aktiver" Nutzer.
    Mit Environment.UserName kannst du den aktiven Nutzer beziehen. So hättest du bereits die Möglichkeit in diesem Verzeichnis aufzuräumen, wenn jemand sich einwählt... Nur als Gedankengang.
    Option Strict On!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Drahuverar“ ()

    Hallo @Drahuverar,
    danke, das klappt super! Wegen der Berechtigungen ist alles in Ordnung, ich und meine Kollegen haben lokale Admin-Rechte auf allen Rechnern... aber wie bekomme ich das nun hin, dass eben genau der Pfad, den @RodFromGermany beschrieben hat, zu säubern?!

    Gruß

    EDIT: Habe bis jetzt diesen Code zum löschen der temporären Dateien der abgefragten User... bekomme aber eine Fehlermeldung weil der Pfad wohl falsch angegeben ist. Stimmt das Grundgerüst?

    VB.NET-Quellcode

    1. Private Sub ButtonDatenLoeschen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonDatenLoeschen.Click
    2. For Each benutzer As String In ListBoxGefundeneUser.Items
    3. My.Computer.FileSystem.DeleteFile("\AppData\Local\Temp")
    4. Next
    5. TextBoxStatus.Text = "Temporäre Dateien aller lokalen Benutzer gelöscht."
    6. End Sub

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MS95“ ()

    Jede Datei in dem Verzeichnis ermitteln und ab in den Mülleimer. :D

    VB.NET-Quellcode

    1. For Each DocumentFile In My.Computer.FileSystem.GetFiles("<DeinPfad>")
    2. My.Computer.FileSystem.DeleteFile(DocumentFile, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin)
    3. Next


    Hier kannst du auch noch mit ein paar "Cases" ausnahmen einbauen.
    Übrigens kannst die Daten auch "permanent" löschen, indem du "DeletePermanently" anstelle "SendToRecycleBin" nimmst.
    Allerdings mag ich "My.Computer" nicht so, vielleicht könnte man hier auch mit der File-Klasse was ermitteln/anstellen.
    Option Strict On!
    Danke für deine Hilfe, das mit dem löschen sollte klappen. Mein Problem ist für mich gerade eher, wie ich angeben, dass das Programm bei jedem einzelnen User dieser ListBox in den Pfad rein geht und dort alles löscht - das verstehe ich nicht ganz :( Das grundsätzliche Löschen sollte klappen :)
    Zuerst ermittelst du ja alle User mit:

    VB.NET-Quellcode

    1. Dim l as new List (Of String)
    2. For Each Dir As String In Directory.GetDirectories("c:\Users")
    3. l.Add(Dir.Split(Path.DirectorySeparatorChar)(2))
    4. Next


    Anschließend kannst du mit einer einfachen Schleife diese Ordner durchlaufen lassen.

    VB.NET-Quellcode

    1. For each item in l
    2. For Each DocumentFile In My.Computer.FileSystem.GetFiles(item)
    3. My.Computer.FileSystem.DeleteFile(DocumentFile, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin)
    4. 'WOBEI dies den Ganzen User Ordner löscht sehe ich.
    5. Next
    6. Next


    Aber Edit://
    Schon mal die Methode gesehen:

    VB.NET-Quellcode

    1. result As String = Path.GetTempPath()
    2. Console.WriteLine(result)

    msdn.microsoft.com/de-de/libra…ettemppath(v=vs.110).aspx

    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Gather schrieb:

    'WOBEI dies den Ganzen User Ordner löscht sehe ich.

    Nein, löscht nur die Daten in dem Verzeichnis (Daten, nicht die Ordner).

    Mit Environment.GetFolderPath kann man auch einiges an Information erhalten, sehe ich gerade. So oft genutzt und doch so selten damit auseinander gesetzt

    VB.NET-Quellcode

    1. MessageBox.Show(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile))

    _________________
    Was Gather macht ist ganz einfach, er füllt eben nicht die ListBox sondern seine eigene List Dim l as new List (Of String).
    Anschließend nimmt er sich jedes Element in dieser List Of und haut die Dateien weg.

    Die Frage nun ist eher, wie du nun vorgehen magst?
    Soll der Nutzer was auswählen oder soll es automatisch geschehen?

    Option Strict On!
    tut mir leid :(
    Ich bin mir, durch den von Drahuverar gegebenen Code nichtmal ganz sicher was genau du willst.
    Verstehe ich das richtig, du willst den TEMP Order, also : C:\\Users\Beispiel\Appdata\Local\Temp löschen?

    Edit://

    Drahuverar schrieb:

    Nein, löscht nur die Daten

    Ist klar.... Nur wenn du den Folder C:\\USERS\ Ermittelst, wie du das machst in deinem Beitrag [VB.NET] User auslesen und bestimmte Dateien löschen wird er alle Datein die sich in Unterordner der User-Directories befinden, löschen. D.h Öffentlicher Order, Dektop, Bilder, Downloads, Dokumente, Musik, Videos etc.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    @Gather,
    also von vorne... es gibt 2 Buttons. Beim CLick auf den 1. Button (ButtonUserAbfragen) sollen alle lokal angelegten Benutzer abgefragt und in eine ListBox ausgegeben werden; das funktioniert so weit auch :)
    und beim Klick auf den 2. Button (ButtonDatenLoeschen) sollen unter allen abgefragten und aufgelisteten User die Daten unter BENUTZERNAME\AppData\Local\Temp gelöscht werden. Sprich: Das Programm soll alle temporären Verzeichnisse der lokalen User bereinigen.

    Hier mal mein kompletter Code: (die auskommentierten Zeilen sind die, die wegen dem falschen Pfad nicht funktionieren)

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub ButtonUserAbfragen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonUserAbfragen.Click
    3. For Each Dir As String In Directory.GetDirectories("C:\Users")
    4. Dim userpaths = Dir.Split(Path.DirectorySeparatorChar)
    5. ListBoxGefundeneUser.Items.Add(userpaths(2))
    6. Next
    7. TextBoxStatus.Text = "User abgefragt."
    8. ButtonUserAbfragen.Enabled = False
    9. End Sub
    10. Private Sub ButtonDatenLoeschen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonDatenLoeschen.Click
    11. 'For Each benutzer As String In ListBoxGefundeneUser.Items
    12. 'My.Computer.FileSystem.DeleteFile("C:\benutzer\AppData\Local\Temp")
    13. 'Next
    14. TextBoxStatus.Text = "Temporäre Dateien aller lokalen Benutzer gelöscht."
    15. If ButtonUserAbfragen.Enabled = False Then
    16. ListBoxGefundeneUser.Items.Clear()
    17. ButtonUserAbfragen.Enabled = True
    18. Else
    19. ButtonUserAbfragen.Enabled = False
    20. End If
    21. End Sub
    22. End Class

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MS95“ ()

    Ok :D
    Eine Form, Listbox und Button

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. ''auflisten und anzeigen
    3. For Each Dir As String In Directory.GetDirectories("c:\Users")
    4. Dim userpaths = Dir.Split(Path.DirectorySeparatorChar)
    5. ListBox1.Items.Add(userpaths(2))
    6. Next
    7. End Sub
    8. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    9. 'ausgewähltes item hinterlegen und die Daten löschen
    10. For Each DocumentFile In My.Computer.FileSystem.GetFiles("C:\Users\" & ListBox1.SelectedItem.ToString & "\AppData\Local\Temp\")
    11. My.Computer.FileSystem.DeleteFile(DocumentFile, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin)
    12. Next
    13. 'Anschließend noch die Ordner in diesem Verzeichnis löschen
    14. For Each Directory In My.Computer.FileSystem.GetDirectories(C:\Users\" & ListBox1.SelectedItem.ToString & "\AppData\Local\Temp\)
    15. My.Computer.FileSystem.DeleteDirectory(Directory, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.DeletePermanently)
    16. Next
    17. End Sub
    Option Strict On!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Drahuverar“ ()

    Sorry jetzt verstehe ich es :)

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Löscht alle Dateien und Verzeichnisse in einem bestimmten temporären Ordner.
    3. ''' </summary>
    4. ''' <param name="User">Der Name des Benutzer, auf wessen temporären Ordner die Funktion angewendet werden soll.</param>
    5. ''' <returns>Boolean-Objekt welches Auskunft über die vollständige Durchführung der Funktion gibt.</returns>
    6. Private Function ClearTempFolder(ByVal User As String) As Boolean
    7. Dim dir As String = System.IO.Path.GetTempPath().Replace(Environment.UserName, User) 'Erstellt den Pfad zum Temp-Ordner.
    8. 'Wobei du somit immer den Pfad zum Temp Ordner hast, falls dieser bei einem Benutzer, aus irgendeinem Grund nicht unter C:\ liegt.
    9. If Directory.Exists(dir) Then 'Fragt ab ob der Ordner existiert.
    10. Try
    11. For Each subDir In Directory.GetDirectories(dir) 'Findet jeden Ordner im Temp Verzeichnis.
    12. Directory.Delete(subDir, True) 'Löscht alle Unterordner welche im Temp\ Ordner liegen.
    13. Next
    14. For Each f In Directory.GetFiles(dir) : File.Delete(f) 'Löscht alle Dateien welche direkt im Temp\ Ordner liegen.
    15. Next
    16. Catch ex As Exception : Return False : Exit Function 'Falls ein Fehler auftritt wird 'False' zurückgegeben.
    17. End Try
    18. Return True 'Falls alles funktioniert hat wird 'True' zurückgegeben.
    19. Else : Return False 'Falls der Ordner nicht gefunden wurde wird 'False' zurückgegeben.
    20. End If
    21. End Function


    Wobei davor die Function von Drahuverar, zum Füllen der Listbox mit den Users essentiell ist.
    Du rufst ClearTempFolder einfach so auf mit ClearTempFolder(Listbox1.SelectedItem)
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Gather“ ()

    @Drahuverar ich bekomme beim Ausführen folgende Fehlermeldung:
    NullReferenceException wurde nicht behandelt. Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt. Und diese Meldung wird bei dem Code ..."\AppData\Local\Temp\") angezeigt :/

    @Gather danke, dass du den kompletten Code so gut kommentierst. Da ich aber noch komplett am Anfang bin, ist der Code von Drahuverar für mich verständlicher - werde deshalb zuerst den Code nehmen. Bei deinem blicke ich leider noch nicht sooo wirklich durch, aber trotzdem top, danke! :)


    EDIT: Habe den Fehler gefunden... hatte kein Item von der ListBox ausgewählt... wie kann ich es dann machen, dass er von allen aufgelisteten den Temp-Ordner leert? Habe nun anstatt ... & ListBoxGefundeneUser.SelectedItems.ToString &... folgendes Eingetragen, was aber leider nicht funktioniert ... & ListBoxGefundeneUser.Items.ToString &...

    MS95 schrieb:

    werde deshalb zuerst den Code nehmen

    Du solltest jedoch aufpassen, dass der Code von Drahuverar statisch ist, und es somit zu Problemen bei manchen Benutzern kommen kann, wenn der Temp-Order nicht unter C:\ liegt.
    Deswegen habe ich jede Zeile kommentiert, damit du dir den Aufbau ansehen kannst und ihn verstehst.
    Der wesentliche Unterschied zwischen meinem Code und dem von @Drahuverar ist, dass ich die Funktion System.IO.Path.GetTempPath() verwende welchen mir den aktuellen Pfad des Temp Ordners, derzeit angemeldeten Benutzers, gibt.
    Also z.B. C:\Users\UserName\AppData\Local\Temp\.
    Anschließend ersetze ich den UserName, welchen ich mit Environment.UserName bekomme, durch einen beliebigen welcher durch die Variable User beim Aufruf der Funktion angegeben wird.
    Wichtig ist nun natürlich eine Überprüfung, falls der Benutzer einen nicht existierenden Usernamen angegeben hat: Directory.Exists().
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Nimm auf jeden Fall die Funktion von @Gather, er fängt dort schon viel ab, dass ist ne richtig gute Funktion.

    Die Meldung könnte unter anderem entstehen, weil du noch kein Item ausgewählt hast

    VB.NET-Quellcode

    1. 'Wenn etwas ausgewählt, dann mach-
    2. If ListBox1.SelectedItem <> Nothing Then
    3. '-...was ich dir sage
    4. End If
    Option Strict On!

    Gather schrieb:

    MS95 schrieb:

    werde deshalb zuerst den Code nehmen

    Du solltest jedoch aufpassen, dass der Code von Drahuverar statisch ist, und es somit zu Problemen bei manchen Benutzern kommen kann, wenn der Temp-Order nicht unter C:\ liegt.
    Deswegen habe ich jede Zeile kommentiert, damit du dir den Aufbau ansehen kannst und ihn verstehst.
    Der wesentliche Unterschied zwischen meinem Code und dem von @Drahuverar ist, dass ich die Funktion System.IO.Path.GetTempPath() verwende welchen mir den aktuellen Pfad des Temp Ordners, derzeit angemeldeten Benutzers, gibt.
    Also z.B. C:\Users\UserName\AppData\Local\Temp\.
    Anschließend ersetze ich den UserName, welchen ich mit Environment.UserName bekomme, durch einen beliebigen welcher durch die Variable User beim Aufruf der Funktion angegeben wird.
    Wichtig ist nun natürlich eine Überprüfung, falls der Benutzer einen nicht existierenden Usernamen angegeben hat: Directory.Exists().


    Jetzt wird mir das doch ein wenig klarer :) Habe nämlich nicht ganz verstanden, an welcher Stelle die abgefragten Usernamen in Verbindung mit dem Temp-Pfad kommen!
    Wie gesagt, du musst angeben welcher Temp Ordner gesäubert werden soll, und zwar beim Aufruf der Funktion:
    ClearTempFolder("USERNAME"). D.h in deinem Fall wäre dies: ClearTempFolder(Listbox1.SelectedIem) wobei, du natürlich davor checken solltest, ob überhaupt ein Item ausgewählt ist ;)
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!