Der Zugriff auf den Pfad "D:\System Volume Information" wurde verweigert.

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Der Zugriff auf den Pfad "D:\System Volume Information" wurde verweigert.

    Hallo

    ich habe folgenden QuellCode:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. getfolders(My.Computer.FileSystem.SpecialDirectories.Temp)
    4. End Sub
    5. Private Sub getfolders(ByVal Path As String)
    6. Dim folders() As String = System.IO.Directory.GetDirectories(Path)
    7. For Each folder As String In folders
    8. ComboBox1.Items.Add(folder)
    9. getfolders(folder)
    10. Next
    11. End Sub
    12. Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
    13. Process.Start("Explorer", ComboBox1.SelectedItem.ToString)
    14. End Sub
    15. End Class


    ändere ich getfolders(My.Computer.FileSystem.SpecialDirectories.Temp) in getfolders("D:\") um, kommt diese Fehlermeldung:



    Wie kann ich die Berechtigung für das Laufwerk vergeben?

    Gruß
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „knuepel“ ()

    @knuepel

    VB.NET-Quellcode

    1. Dim folders() As String = System.IO.Directory.GetDirectories("D:\")
    funktioniert bei mir auf Anhieb.
    Welche Exception kommt bei Dir?
    Kann es sein, dass das ein spezielles Systemlaufwerk ist?
    Nicht belegte Laufwerke bringen bei mir eine IO.IOException: "Das Gerät ist nicht bereit",
    nicht vorhandene Laufwerke ("Y:\") eine IO.DirectoryNotFoundException: "Ein Teil des Pfades "y:\" konnte nicht gefunden werden".

    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
    bei Exceptions hilft es immer, die Dokumentation anzuschauen, es gibt einen eigenen Eintrag für jede mögliche Exception.
    In diesem Fall handelt es sich um ein Zugriffsproblem. Es ist nicht zulässig, auf das versteckte Systemverzeichnis "D:/System Volume" zuzugreifen. Fange die Ausnahme (nur diese eine) ab, indem du Try-Catch korrekt anwendest und den Typ der Ausnahme als Filter verwendest.

    Tritt der Fehler auf, reagierst du entsprechend darauf.

    Viele Grüße
    ~blaze~
    @~blaze~ Jou.
    @knuepel Sorry, der rekursive Aufruf ist mir durch die Lappen gegangen. Sieh Dir das mal an:

    VB.NET-Quellcode

    1. Dim folders() As IO.DirectoryInfo = New IO.DirectoryInfo("d:\").GetDirectories("*.*")
    2. Dim allDirs = New List(Of IO.DirectoryInfo)
    3. For Each folder In folders
    4. Try
    5. Dim dirs() = New IO.DirectoryInfo(folder.FullName).GetDirectories("*.*", IO.SearchOption.AllDirectories)
    6. allDirs.AddRange(dirs)
    7. Catch ex As Exception
    8. End Try
    9. Next
    10. MessageBox.Show(allDirs.Count.ToString)
    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!
    Okay, es liegt also an die versteckte Dateien in D:\ und dafür fehlt die Zugriffsberechtigung oder?.
    @ RodFromGermany: leider verstehe ich nicht deinen Quellecode, was soll ich damit machen?
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(
    @knuepel Gibt es da nicht auch Directory.GetAccessControl

    Dass ganze ist auch nicht einfach abzufragen. Hatte letzten mit der Registry die gleichen Probleme.

    https://msdn.microsoft.com/de-de/library/system.security.accesscontrol.directoryobjectsecurity.getaccessrules(v=vs.110).aspx

    Vielleicht ist dass ein Ansatz?
    Es gab einen zusätzliches verstecktes Element denn ich trotz Hacken bei ausgeblendete Element anzeigen, nicht angezeigt wurde. Nun Habe ich in D:\ einen neuen Ordner Test angelegt und habe das

    Quellcode

    1. ​Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. getfolders("D:\")
    in das geändert

    Quellcode

    1. ​Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. getfolders("D:\Test")
    und schon klappt es.
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(

    knuepel schrieb:

    und schon klappt es.


    Dass klappt aber auch nur solange wie du in dem Ordner bleibst, und keine Zugriffsverletzungen von evt. vorhandenen Ordner auftreten. Würde ich dass jetzt ausführen würde die Exception bei bestimmten Ordner wieder auftreten.
    Wenn du dass Unabhängig von deinem Gegebenheiten Programmieren willst, sollte dein Programm auf evt. vorhandenen Ausnahmen reagieren können, sonst stürzt es dir ja ab.

    knuepel schrieb:

    was soll ich damit machen?
    Verstehen und auf Dein Problem anwenden.
    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!

    Bagplatt schrieb:

    Dass klappt aber auch nur solange wie du in dem Ordner bleibst, und keine Zugriffsverletzungen von evt. vorhandenen Ordner auftreten

    Da gebe ich dir Recht, das Element ist schuld Path "D:\$RECYCLE.BIN" String (Papierkorb). Jetzt weiß ich wenigst woran es liegt, ich werde es mal weiter mit "D:\" vesuchen. Hast du eine Idee?


    RodFromGermany schrieb:

    Verstehen und auf Dein Problem anwenden

    Das habe ich leider nicht verstanden, kannst du mir bitte beschreiben wo ich das verbauen muss?

    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „knuepel“ ()

    Ich weis nicht in wie weit du die Daten auflisten willst.

    Die einfachste Lösung ist wirklich alles mit TryCatch abzufangen.
    Als ich letztens an der Registry rumgefuscht habe, und sämtliche Rechte umgeschrieben habe hats gekracht^^ und nicht im Programm.

    Für manche Dinge hilft es auch manchmal im manifest :

    VB.NET-Quellcode

    1. <requestedExecutionLevel level="asInvoker" uiAccess="false" />


    mit dem auszutauschen :

    VB.NET-Quellcode

    1. <requestedExecutionLevel level="highestAvailable" uiAccess="false" />


    So dass das Programm mit Admin Rechte startet.

    Bei deinem gehe ich ja mal nicht davon aus dass 1600+ Exception wie bei mir auftreten, demnach wäre TryCatch die wirklich einfachste Lösung.
    Erweiter dein Code, bevor du die Funktion selber wieder aufrufst, holst du dir die Dateien aus dem Ordner.

    Und mach ein TryCatch Block drum.

    #Edit

    Sollen nur die Dateien angezeigt werden?

    Mit

    VB.NET-Quellcode

    1. Dim folders() As String = System.IO.Directory.GetDirectories(Path)
    holst du die Unterordner, nicht die Dateien.
    Oder willst du dass ganze Filesystem Rekursiv durchlaufen und auch die Dateien anzeigen?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bagplatt“ ()

    knuepel schrieb:

    wo ich das verbauen muss
    Das wäre eine Alternative zum Befüllen Deiner ComboBox1.
    Sieh Dir mal die Properties .DataSource und .DisplayMember an.
    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!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

    Rechte verändern ist ein totales Unding, das sollte man auf keinen Fall als Lösung verwenden, außer das Programm ist genau dafür da. Generell sollte es bei einem sinnvollen Sicherheitssystem auch nicht möglich sein, Rechte zu editieren, wenn man nicht die entsprechenden Zugriffsrechte hat, bzw. man sollte höchstens die eigenen Rechte weiter einschränken können dürfen.
    Ebenso sind Administratorrechte mit Bedacht zu vergeben und man sollte einplanen, mit möglichst geringen Rechten arbeiten zu können (bzw. bei normalen Anwendungen genügt i.a. das Programmieren "einfach ohne Administratorrechten"). Administratorrechte sollte man außerdem, so denke ich, nur dann anfordern, wenn sie wirklich akut benötigt werden, bzw. das gesamte Programm dazu dient, administrative Prozesse durchzuführen, wie bspw. Setups. Ausnahmen gibt es natürlich auch hier.

    RodFromGermanys Variante fängt alle Exceptions ab. Das kann man in diesem Fall wahrscheinlich sogar so machen, aber generell ist es zu empfehlen, alle hier gelisteten Exceptions abzufangen:

    VB.NET-Quellcode

    1. Try
    2. 'Code, in dem die unten gelisteten Fehler auftreten können
    3. Catch e As UnauthorizedAccessException
    4. 'was passiert, wenn eine UnauthorizedAccessException auftritt
    5. Catch e As SecurityException
    6. 'was passiert, wenn eine SecurityException auftritt
    7. Catch e As DirectoryNotFoundException
    8. 'was passiert, wenn eine DirectoryNotFoundException auftritt
    9. End Try

    Trotz Dokumentation kann es auch zu anderen Fehlern kommen, die ich nicht einfach verwerfen würde, auch wenn es unwahrscheinlich ist, dass solche Fehler auftreten.

    An irgendeiner Stelle hier im Forum hab' ich mal einen Code programmiert, der zuerst überprüft, ob die Rechte bestehen. Da das redundante Arbeit ist - GetDirectories führt das ja selbst ebenfalls aus und behandelt das dann über die Exceptions - sollte man das einfach über Try-Catch lösen, das ist in diesem Fall ja auch so vorgesehen.

    Außerdem stimme ich RodFromGermany zu und sage sogar, dass Datenbindung ein unabdingbares Konzept für UI ist. Das geht sogar soweit, dass ich auch für TreeView Datenbindung implementieren würde.

    Viele Grüße
    ~blaze~