Сравнение DACL

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

KAPACb
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 06.05.2006 (Сб) 10:29

Сравнение DACL

Сообщение KAPACb » 06.05.2009 (Ср) 11:17

Использую System.Security.AccessControl

Собственно, вот допустим есть папка D:\ACLtest, у которой 2 строчки прав - Administrators (Full, Not inherited) и System (Full, Not inherited)

В неё есть папка D:\ACLtest\1, у которой тоже 2 строчки прав - Administrators (Full, inherited) и System (Full, inherited)

Конечно, формально параметры DACL у них разные - у первой папки права не наследованные, а второй - наследованные.
Однако, с т.з. содержимого этих папок - права у них одинаковые.

Собственно, а как можно программно определить одинаковость прав с т.з. именно содержимого ?

Сравнивать через результаты GetAccessRules()
Код: Выделить всё
Dim ACLcol As AccessControl.AuthorizationRuleCollection = CurDir.GetAccessControl().GetAccessRules(True, True, GetType(SecurityIdentifier))


не получается...

KAPACb
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 06.05.2006 (Сб) 10:29

Re: Сравнение DACL

Сообщение KAPACb » 08.05.2009 (Пт) 9:06

Мде, помощь на высоте...
Вот накропал, авось кому пригодится:

Код: Выделить всё
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.DirectoryServices
Imports System.IO
Imports System.IO.Directory
Imports System.Security
Imports System.Security.AccessControl
Imports System.Security.Principal
Imports System.Windows.Forms
Imports System.Windows.Forms.Application

    ''' <summary>
    ''' Структура для записи параметров безопасности
    ''' </summary>
    ''' <remarks></remarks>
    Public Structure DirACLType
        Public ADObjSIDstr As String                'SID текстовом виде формата "S-1-5-..."
        Public ACLRights As FileSystemRights        'Непосредственно права параметра
        '<остальное не важно>
    End Structure

    ''' <summary>
    ''' Функция сравнивает ACL parent и child. Если они идентичны, возвращает True, иначе - False
    ''' </summary>
    ''' <param name="ParentACL">ACL родительской папки</param>
    ''' <param name="ChildACL">ACL подпапки</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function CompareACL(ByRef ParentACL As Collection, ByRef ChildACL As Collection) As Boolean

        'элементы для перебора коллекций прав
        Dim ChildDACLitem As DirACLType
        Dim CurChildDACLitem As DirACLType
        Dim ParentDACLitem As DirACLType

        'Битовые массивы для объединения прав
        Dim ChildBA As BitArray
        Dim ParentBA As BitArray

        'заранее предполагаем, что права равны
        CompareACL = True

        'перебираем все строчки из child
        For Each ChildDACLitem In ChildACL
            'считываем права в битовый массив
            ChildBA = New BitArray(New Integer() {ChildDACLitem.ACLRights})

            'заполняем parent нулями
            ParentBA = New BitArray(ChildBA.Length, CBool(0))

            'находим в child все строчки с таким же SID'ом
            For Each CurChildDACLitem In ChildACL
                'объединяем через логическое "или" битовые масивы прав
                If CurChildDACLitem.ADObjSIDstr = ChildDACLitem.ADObjSIDstr Then
                    ChildBA = ChildBA.Or(New BitArray(New Integer() {CurChildDACLitem.ACLRights}))
                End If
            Next

            'перебираем parent в поисках этого же SID
            For Each ParentDACLitem In ParentACL
                'объединяем через логическое "или" битовые масивы прав
                If ParentDACLitem.ADObjSIDstr = ChildDACLitem.ADObjSIDstr Then
                    ParentBA = ParentBA.Or(New BitArray(New Integer() {ParentDACLitem.ACLRights}))
                End If
            Next

            'переводим в Integer права
            Dim ChildInt(0) As Integer
            ChildBA.CopyTo(ChildInt, 0)
            Dim ParentInt(0) As Integer
            ParentBA.CopyTo(ParentInt, 0)

            'сравниваем итоговые права для данного SID
            If ChildInt(0) <> ParentInt(0) Then
                'если есть отличия - указываем на это и выходим
                CompareACL = False
                Exit For
            End If
        Next
    End Function


Сравнение идёт только по фактическим правам DACL, при этом наследование (Inheritance) и применение (Propogation) не сравнивается - мне оно не надо было.

Roman Koff
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 495
Зарегистрирован: 17.09.2008 (Ср) 9:22
Откуда: От туда

Re: Сравнение DACL

Сообщение Roman Koff » 08.05.2009 (Пт) 10:05

Спасибо, пригодится!
Слава роботам! Убить всех человеков! Bite my shiny metal ass!

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Сравнение DACL

Сообщение Williams » 08.05.2009 (Пт) 13:26

Камменты хороши.
И вы думаете, что вас оставят в живых после прочтения этого поста?


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 75

    TopList  
cron