none
Получение информации о правах доступа к пакам RRS feed

  • Вопрос

  • У меня есть форма с элементом управления TreeView, в который я хочу добавлять (отображать)только доступные для активного пользователя папки, я проверяю атрибуты папок и если это не системная и не скрытая пака, то пытаюсь получить информацию о правах доступа к ней. Но при попытке получения этой информации методом GetAccessControl генерируется исключение типа UnauthorizedAccessException, можно ли как то получить информацию о правах доступа к папке без исключения? Исключение, например выскакивает при попытке получить информацию о папках:

    "C:\Users\MSSQL$SQLEXPRESS" "C:\Users\SQLTELEMETRY$SQLEXPRESS"

    вот код метода по результатам работы, которого я решаю добавлять ли папку в TreeView, если он возвращает True, то папка добавляется.


    Friend Function CanFolderBeAdded(di As DirectoryInfo) As Boolean
        Dim _si As SecurityIdentifier
        'Dim siJeder As New SecurityIdentifier("WD")
        Dim _ds As DirectorySecurity
        Dim _aces As AuthorizationRuleCollection
        Dim _dirAttr As System.IO.FileAttributes
        Dim _result As Boolean
    
        _result = True
        _si = New SecurityIdentifier("S-1-1-0") 'Jeder
    
        Try
            'Console.WriteLine("{0}; {1}", di.FullName, File.GetAttributes(di.FullName).ToString())
            'Console.WriteLine(File.GetAttributes(di.FullName).ToString)
            _dirAttr = File.GetAttributes(di.FullName)
            If ((_dirAttr And FileAttributes.Hidden) = FileAttributes.Hidden) Then
                _result = False
            ElseIf ((_dirAttr And FileAttributes.System) = FileAttributes.System) Then
                _result = False
            End If
    
            If (_result = True) Then
                _ds = di.GetAccessControl() ' System.Security.AccessControl.AccessControlSections.Access
                _aces = _ds.GetAccessRules(True, True, GetType(SecurityIdentifier))
                For Each ace As FileSystemAccessRule In _aces
                    If ((ace.AccessControlType = AccessControlType.Deny) AndAlso (ace.IdentityReference = _si) AndAlso (ace.FileSystemRights = FileSystemRights.ReadData)) Then
                        _result = False
                        Exit For
                    End If
                Next ace
            End If
        Catch invopex As System.InvalidOperationException
            _result = True
        Catch uaex As UnauthorizedAccessException
            'Console.WriteLine(di.FullName)
            'Console.WriteLine(File.GetAttributes(di.FullName).ToString())
            If (gBS.Enabled) Then
                Allgemein.DieAufzeichnungInsProtokollDerAusnahmen("CanFolderBeAdded: " & uaex.Message)
            End If
            _result = False
        Catch ex As Exception
            'Console.WriteLine(di.FullName)
            'Console.WriteLine(File.GetAttributes(di.FullName).ToString())
            If (gBS.Enabled) Then
                Allgemein.DieAufzeichnungInsProtokollDerAusnahmen("CanFolderBeAdded: " & ex.Message)
            End If
            _result = False
        End Try
    
        Return _result
    End Function



    • Изменено SergejS 20 мая 2019 г. 14:06

Ответы

  • Суть в том, что чтение прав доступа, внезапно, тоже требует прав доступа... Считайте исключение UnauthorizedAccessException индикатором того, что прав вы не имеете.  Хотите более тонкого контроля - используйте функции Windows API вместо классов .NET Framework, например GetSecurityInfo, в данном случае вместо исключения вы будете получать возвращаемый код ошибки. 
    • Помечено в качестве ответа SergejS 21 мая 2019 г. 13:45

Все ответы

  • К каталогам других пользователей можно получить доступ только имея повышенный уровень привилегий ("Запуск от имени администратора"). Так задумано, избежать исключения нельзя. Попробуйте даже в обычном проводнике попытаться просмотреть их разрешения - он запросит права администратора. 
  • так я не пытаюсь туда зайти, я просто хочу получить информацию о правах доступа, и имею ли я права доступа к этой папки, всего то, казалось бы! Я запускал этот код на Linux сервере с эмулятором Windows, так там даже атрибуты папок нельзя прочесть без исключения.
  • Суть в том, что чтение прав доступа, внезапно, тоже требует прав доступа... Считайте исключение UnauthorizedAccessException индикатором того, что прав вы не имеете.  Хотите более тонкого контроля - используйте функции Windows API вместо классов .NET Framework, например GetSecurityInfo, в данном случае вместо исключения вы будете получать возвращаемый код ошибки. 
    • Помечено в качестве ответа SergejS 21 мая 2019 г. 13:45