Rechte von eigenem Code und FolderBrowserDialog

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

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    Rechte von eigenem Code und FolderBrowserDialog

    Moin moin

    Möchte mir ein kleines "BackUp-Programm" schreiben.

    Ich habe hier ein Problem mit dem Zugriff auf verschiedene Ordner im User-Verzeichniss. Mit dem Explorer kann ich auf fast alles zugreifen. Zugriffsverweigerung bekomme ich auf Ordner welche so ein "Verknüpfungssymbol" besitzen, siehe Bild Explorer.

    Das gleiche habe ich, wenn ich in meinem Code den FolderBrowserDialog benutze.

    Jedoch der Code, welcher mit alle Verzeichnisse im "C:\Benutzer..." anzeigen lassen soll, meldet mir, das ich auf so viele Verzeichnisse keinen Zugriff habe.
    Das Programm läuft im Admin-Modus. Warum gibt es da solche Unterschiede oder wo ist mein Fehler?

    Spoiler anzeigen

    Die Manifestdatei:

    VB.NET-Quellcode

    1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    2. <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    3. <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    4. <security>
    5. <requestedPrivileges>
    6. <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
    7. </requestedPrivileges>
    8. </security>
    9. </trustInfo>
    10. </assembly>


    Eine weiter Class:

    VB.NET-Quellcode

    1. Friend Function IsRunningAsAdmin() As Boolean
    2. Dim identity As System.Security.Principal.WindowsIdentity = System.Security.Principal.WindowsIdentity.GetCurrent()
    3. Dim principal As New System.Security.Principal.WindowsPrincipal(identity)
    4. Return principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator)
    5. End Function


    Die Class:

    VB.NET-Quellcode

    1. Public Class DirectorySizeCalculator
    2. Public Event DirectorySizeCalculated(ByVal directoryName As String, ByVal directorySize As Long)
    3. Public Event DirectoryAccessDenied(ByVal directoryName As String)
    4. Public Sub CalculateDirectorySizes()
    5. Dim userProfilePath As String = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)
    6. For Each subDirectory As String In Directory.GetDirectories(userProfilePath)
    7. Try
    8. Dim directoryInfo As New DirectoryInfo(subDirectory)
    9. Dim totalSize As Long = GetDirectorySize(directoryInfo)
    10. RaiseEvent DirectorySizeCalculated(directoryInfo.Name, totalSize)
    11. Catch ex As UnauthorizedAccessException
    12. RaiseEvent DirectoryAccessDenied(subDirectory)
    13. End Try
    14. Next
    15. End Sub
    16. Private Function GetDirectorySize(ByVal directoryInfo As DirectoryInfo) As Long
    17. Dim totalSize As Long = 0
    18. For Each file As FileInfo In directoryInfo.GetFiles()
    19. totalSize += file.Length
    20. Next
    21. For Each subDirectory As DirectoryInfo In directoryInfo.GetDirectories()
    22. totalSize += GetDirectorySize(subDirectory)
    23. Next
    24. Return totalSize
    25. End Function
    26. End Class


    Auf dem MainForm:

    VB.NET-Quellcode

    1. Private Sub btnSearch_Click(sender As Object, e As EventArgs) Handles btnSearch.Click
    2. Dim FBDlg As New FolderBrowserDialog With {.ShowNewFolderButton = False}
    3. If (FBDlg.ShowDialog() = DialogResult.OK) Then
    4. Dim SelectedRoot As String = FBDlg.SelectedPath
    5. If IO.Directory.GetDirectoryRoot(SelectedRoot) = SelectedRoot Then
    6. ShowDirectorySelectionError()
    7. Else
    8. drivepath.SourcePath = FBDlg.SelectedPath
    9. txtSource.Text = drivepath.SourcePath
    10. End If
    11. Else
    12. ShowDirectorySelectionError()
    13. End If
    14. End Sub
    15. Private Sub directorySizeCalculator_DirectoryAccessDenied(ByVal directoryName As String) Handles directorySizeCalculator.DirectoryAccessDenied
    16. lbDenied.Items.Add("Verweigert für: " & directoryName)
    17. End Sub
    18. Private Function FormatSize(ByVal sizeInBytes As Long) As String
    19. Dim units() As String = {"Bytes", "KB", "MB", "GB", "TB"}
    20. Dim unitIndex As Integer = 0
    21. While sizeInBytes >= 1024 And unitIndex < units.Length - 1
    22. sizeInBytes = CLng(sizeInBytes / 1024)
    23. unitIndex += 1
    24. End While
    25. Return String.Format("{0} {1}", Math.Round(sizeInBytes, 2), units(unitIndex))
    26. End Function
    27. Private Sub directorySizeCalculator_DirectorySizeCalculated(ByVal directoryName As String, ByVal directorySize As Long) Handles directorySizeCalculator.DirectorySizeCalculated
    28. lvDirectories.View = View.Details
    29. Dim sizeString As String = FormatSize(directorySize)
    30. lvDirectories.Items.Add(New ListViewItem(New String() {directoryName, sizeString}))
    31. End Sub

    Bilder
    • error-1.jpg

      170,48 kB, 645×213, 34 mal angesehen
    • error-2.jpg

      205,78 kB, 699×333, 35 mal angesehen
    • expolorer-1.jpg

      105,33 kB, 442×422, 39 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Das mit diesen Verknüppungen/virtuellen Pfaden hat MS wirklich verbockt, wenn man sie nicht nutzen kann, haben die nie sichtbar zu sein. Das haben die glaub ich gemacht, um alles Multilingual zu haben. Ist auch unter Win11 noch so. Anwendungdaten ist wie der Name schon sagt, AppData. Wenn du da drauf zugreifen willst, hole den Pfad mit Environment.GetFolderPath(Environment.SpecialFolder...)
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    @Amelie Nur Administrative Rechte werden für ein Backup-Programm nicht reichen. learn.microsoft.com/de-de/wind…re/drivers/ifs/privileges Du benötigst mindestens zwei weitere Rechte: -> SeBackupPrivilege/SeRestorePrivilege
    Mfg -Franky-
    @DTF
    Das habe ich schon so:
    ​Friend ReadOnly UserPath As String = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)

    @-Franky-
    Da muss ich mich erstmal reinlesen...
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh: