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
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?
Die Manifestdatei:
Eine weiter Class:
Die Class:
Auf dem MainForm:
Die Manifestdatei:
VB.NET-Quellcode
-
- <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
- <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
- <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
- <security>
- <requestedPrivileges>
- <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
- </requestedPrivileges>
- </security>
- </trustInfo>
- </assembly>
Eine weiter Class:
VB.NET-Quellcode
-
- Friend Function IsRunningAsAdmin() As Boolean
- Dim identity As System.Security.Principal.WindowsIdentity = System.Security.Principal.WindowsIdentity.GetCurrent()
- Dim principal As New System.Security.Principal.WindowsPrincipal(identity)
- Return principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator)
- End Function
Die Class:
VB.NET-Quellcode
-
- Public Class DirectorySizeCalculator
- Public Event DirectorySizeCalculated(ByVal directoryName As String, ByVal directorySize As Long)
- Public Event DirectoryAccessDenied(ByVal directoryName As String)
- Public Sub CalculateDirectorySizes()
- Dim userProfilePath As String = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)
- For Each subDirectory As String In Directory.GetDirectories(userProfilePath)
- Try
- Dim directoryInfo As New DirectoryInfo(subDirectory)
- Dim totalSize As Long = GetDirectorySize(directoryInfo)
- RaiseEvent DirectorySizeCalculated(directoryInfo.Name, totalSize)
- Catch ex As UnauthorizedAccessException
- RaiseEvent DirectoryAccessDenied(subDirectory)
- End Try
- Next
- End Sub
- Private Function GetDirectorySize(ByVal directoryInfo As DirectoryInfo) As Long
- Dim totalSize As Long = 0
- For Each file As FileInfo In directoryInfo.GetFiles()
- totalSize += file.Length
- Next
- For Each subDirectory As DirectoryInfo In directoryInfo.GetDirectories()
- totalSize += GetDirectorySize(subDirectory)
- Next
- Return totalSize
- End Function
- End Class
Auf dem MainForm:
VB.NET-Quellcode
-
- Private Sub btnSearch_Click(sender As Object, e As EventArgs) Handles btnSearch.Click
- Dim FBDlg As New FolderBrowserDialog With {.ShowNewFolderButton = False}
- If (FBDlg.ShowDialog() = DialogResult.OK) Then
- Dim SelectedRoot As String = FBDlg.SelectedPath
- If IO.Directory.GetDirectoryRoot(SelectedRoot) = SelectedRoot Then
- ShowDirectorySelectionError()
- Else
- drivepath.SourcePath = FBDlg.SelectedPath
- txtSource.Text = drivepath.SourcePath
- End If
- Else
- ShowDirectorySelectionError()
- End If
- End Sub
- Private Sub directorySizeCalculator_DirectoryAccessDenied(ByVal directoryName As String) Handles directorySizeCalculator.DirectoryAccessDenied
- lbDenied.Items.Add("Verweigert für: " & directoryName)
- End Sub
- Private Function FormatSize(ByVal sizeInBytes As Long) As String
- Dim units() As String = {"Bytes", "KB", "MB", "GB", "TB"}
- Dim unitIndex As Integer = 0
- While sizeInBytes >= 1024 And unitIndex < units.Length - 1
- sizeInBytes = CLng(sizeInBytes / 1024)
- unitIndex += 1
- End While
- Return String.Format("{0} {1}", Math.Round(sizeInBytes, 2), units(unitIndex))
- End Function
- Private Sub directorySizeCalculator_DirectorySizeCalculated(ByVal directoryName As String, ByVal directorySize As Long) Handles directorySizeCalculator.DirectorySizeCalculated
- lvDirectories.View = View.Details
- Dim sizeString As String = FormatSize(directorySize)
- lvDirectories.Items.Add(New ListViewItem(New String() {directoryName, sizeString}))
- End Sub
Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen.