Announcement

Collapse
No announcement yet.

Berechtigungen eines Files auslesen (Lesen, Ausführen, Schreiben,...)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Berechtigungen eines Files auslesen (Lesen, Ausführen, Schreiben,...)

    Hallo

    Da ich immer wieder Probleme mit den Berechtigungen im FileSystem habe, dachte ich mir ich sollte Abfragen ob der aktuelle User auch Schreibberechtigung für die Datei hat.

    Als Testfile habe ich mir ein File mit folgenden Berechtigungen hergerichtet (siehe auch PrintScreen "test-txt-File.JPG"):

    Jeder: Lesen, Ausführen und Lesen
    System und Administrator: hat Vollzugriff

    Zusatzinfo: ich bin ein ganz normaler Domainuser kein Admin.


    Wenn ich jetzt die Berechtigungen abfrage, listet er mir alle drei Berechtigungsgruppen (System, Jeder, Administratoren) auf und nicht nur in der Gruppe in der ich angesiedelt bin und zusätzlich.
    Wenn ich die "FileSystemRights" abfrage, so springt er mir z.B. bei "FileSystemRights.Read" nicht hinein habe aber als Gruppenmitglied "Jeder" diese Berechtigung.

    Bin ich hier irgendwie auf dem Holzweg?

    gruss
    pascal


    Code:
                Dim UserSID As String = System.Security.Principal.WindowsIdentity.GetCurrent.User.AccountDomainSid.ToString()
                Dim fs As FileSecurity = File.GetAccessControl("Z:\Temp\test.txt")
                Dim AuRuCol As AuthorizationRuleCollection
                AuRuCol = fs.GetAccessRules(True, True, System.Security.Principal.WindowsIdentity.GetCurrent.User.AccountDomainSid.GetType)
    
    
    
                For Each fsar As FileSystemAccessRule In AuRuCol
                    Console.WriteLine(fsar.FileSystemRights.ToString)
    
                    If System.Security.AccessControl.AccessControlType.Allow.Equals(fsar.AccessControlType) Then
                        If FileSystemRights.ExecuteFile And fsar.FileSystemRights = FileSystemRights.Write Then
                            Console.WriteLine("test 1")
                        End If
                    End If
    
    
                    If fsar.FileSystemRights = FileSystemRights.Read Then
                        Console.WriteLine("test 2")
                    End If
    
    
                    If FileSystemRights.Write Or fsar.FileSystemRights = FileSystemRights.Write Then
                        Console.WriteLine("test 3")
                    End If
    
                Next
    Attached Files

  • #2
    In FileSystemRights steckt die Kombination aller Rechte (es ist einen Flags Enumeration). Du darfst also nicht auf Gleichheit prüfen sondern du mußt prüfen ob FileSystemRights dein gesuchtes Recht enthält.
    Oder anders ausgedruckt gerade prüfst du etwas wie

    (Read, ReadAndExecute) = (Read)

    Und das ist ganz offensichtlich nicht gleich. Und übrigens bin ich mir nicht sicher ob Read das richtige Recht ist um darauf zu prüfen Read ist ja selber schon eine Sammlung aller möglichen Read Rechte (ReadData, ReadPermissions etc). Wenn du die Datei nur einlesen können willst sollte eigentlich ein Test auf ReadData reichen.

    Comment


    • #3
      und wie erkenne ich ob der aktuelle User in dieser Gruppe ist?

      Comment


      • #4
        hätte hier eine gute Lösung gefunden aber er gibt mir einen Fehler beim casten:

        Code:
        Imports System.Security.Principal
        Imports System.Security.AccessControl
        Imports System.IO
        
        Public Class FileRightsReader
            Public Shared Function IsReadable(filename As String) As Boolean
                Dim principal As WindowsIdentity = WindowsIdentity.GetCurrent()
                If File.Exists(filename) Then
                    Dim fi As New FileInfo(filename)
                    Dim acl As AuthorizationRuleCollection = fi.GetAccessControl().GetAccessRules(True, True, GetType(SecurityIdentifier))
                    For i As Integer = 0 To acl.Count - 1
                        Dim rule As System.Security.AccessControl.FileSystemAccessRule = DirectCast(acl, System.Security.AccessControl.FileSystemAccessRule)
                        If principal.User.Equals(rule.IdentityReference) Then
                            If System.Security.AccessControl.AccessControlType.Deny.Equals(rule.AccessControlType) Then
                                If (CInt(FileSystemRights.Read) And CInt(rule.FileSystemRights)) = CInt(FileSystemRights.Read) Then
                                    Return False
                                End If
                            ElseIf System.Security.AccessControl.AccessControlType.Allow.Equals(rule.AccessControlType) Then
                                If (CInt(FileSystemRights.Read) And CInt(rule.FileSystemRights)) = CInt(FileSystemRights.Read) Then
                                    Return True
                                End If
                            End If
                        End If
                    Next
                Else
                    Return False
                End If
                Return False
            End Function
        
            Public Shared Function IsWriteable(filename As String) As Boolean
                Dim principal As WindowsIdentity = WindowsIdentity.GetCurrent()
                If File.Exists(filename) Then
                    Dim fi As New FileInfo(filename)
                    If fi.IsReadOnly Then
                        Return False
                    End If
        
                    Dim acl As AuthorizationRuleCollection = fi.GetAccessControl().GetAccessRules(True, True, GetType(SecurityIdentifier))
                    For i As Integer = 0 To acl.Count - 1
                        Dim rule As System.Security.AccessControl.FileSystemAccessRule = DirectCast(acl, System.Security.AccessControl.FileSystemAccessRule)
                        If principal.User.Equals(rule.IdentityReference) Then
                            If System.Security.AccessControl.AccessControlType.Deny.Equals(rule.AccessControlType) Then
                                If (CInt(FileSystemRights.Write) And CInt(rule.FileSystemRights)) = CInt(FileSystemRights.Write) Then
                                    Return False
                                End If
                            ElseIf System.Security.AccessControl.AccessControlType.Allow.Equals(rule.AccessControlType) Then
                                If (CInt(FileSystemRights.Write) And CInt(rule.FileSystemRights)) = CInt(FileSystemRights.Write) Then
                                    Return True
                                End If
                            End If
                        End If
        
                    Next
                Else
                    Return False
                End If
                Return False
            End Function
        
        End Class
        Könnte mir einer beim Fehler helfen: Der Wert vom Typ "System.Security.AccessControl.AuthorizationRuleCo llection" kann nicht in "System.Security.AccessControl.FileSystemAccessRul e" konvertiert werden.

        gruss
        pascal

        Comment


        • #5
          ich habe jetzt alles zusammen.

          ein kleines Problem habe ich aber noch, falls ich überhaupt keine Rechte auf das File habe sollte ich das auch abfragen.
          Ich will es aber ohne Try Catch machen --> und das bringe ich einfach nicht her (Stichwort: FileIOPermission) dies irgendwie abzufragen.

          gruss
          pascal

          Comment


          • #6
            Ich will es aber ohne Try Catch machen --> und das bringe ich einfach nicht her (Stichwort: FileIOPermission) dies irgendwie abzufragen.
            Glaube nicht das das geht. Die NET Wrapper sind explizit so geschrieben das sie Exceptions werfen wenn etwas nicht geht und ob du die ACL eines Files auslesen darfst findest du nur raus wenn du auf die zugreifst. Ohne geht nur direkt an der Windows API (weil die aus einer Zeit stammt als Exceptions unüblich waren). Verstehe auch die Abneigung nicht. Exceptions sind für Ausnahmefälle was gutes!

            Mal so nebenbei finde ich das vorhaben eh merkwürdig. Wenn ich wissen will ob ich auf eine Datei nicht zugreifen darf greife ich drauf zu und werte die eventuellen Exceptions aus. Alles andere ist suboptimal. Zum Beispiel wer sagt dir das sich zwischen prüfen der Rechte und tatsächlichem Zugriff auf die Datei die Rechte nicht geändert haben? Das entsprechende Exceptionhandling beim Zugriff brauchst du also eh wenn du es gut machen willst unabhängig davon ob du vorher die Rechte abprüfst oder nicht.

            Comment

            Working...
            X