none
VBS + WMI: настройка безопасности NTFS RRS feed

  • Вопрос

  • Исходная ситуация.

    1. Win XP Pro/2003 Std/2008 Std.

    2. Диск с файловой системой NTFS и на этом диске:
    \DIR0\file1
    \DIR0\DIR1\file2
    \DIR0\DIR1\DIR2

    3. Безопасность NTFS (все записи в списках доступа имеют тип "Разрешить").

    3.1. Корень диска (применяется "Для этой папки, её подпапок и файлов"):
    а) Администраторы - Полный доступ
    б) Система - Полный доступ
    в) Пользователи - Чтение и выполнение

    3.2. DIR0 (применяется "Для этой папки, её подпапок и файлов"):
    а) унаследованное от корня
    б) Пользователь 1 - Полный доступ

    3.3. Прочие каталоги и файлы наследуют все записи списков доступа от соответствующих "родителей".

    4. Владелец объектов - группа локальных администраторов. Пользователь, запускающий сценарий, входит в эту группу.

    ======

    Задача: урезать полномочия пользователя 1, скажем, до уровня "Чтение и выполнение", сохранив во всём дереве набор записей и правила наследования.

    ======

    Инструмент: VBS + WMI (на всякий случай уточню, что другие средства не интересуют).
    Используемый сценарий:
    Dim objWsNet, strDomain
    Dim objWMI, objSecSettings, objSD, objACE, objFolder
    Dim strPath, intResult
    
    strPath = "D:\DIR0"
    Set objWsNet = CreateObject("WScript.Network")
    strDomain = objWsNet.UserDomain
    Set objWsNet = Nothing
    Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
    Set objSecSettings = objWMI.Get("Win32_LogicalFileSecuritySetting.Path='" & strPath & "'")
    If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then
    	If Not IsNull(objSD.DACL) Then
    		For Each objACE In objSD.DACL
    			If Not CBool(objACE.AceFlags And 16) And objACE.AceType = 0 And objACE.AccessMask = 2032127 Then
    				If StrComp(objACE.Trustee.Domain, strDomain, vbTextCompare) = 0 Then
    					objACE.AccessMask = 1179817
    				End If
    			End If
    		Next
    		Set objFolder = objWMI.Get("Win32_Directory.Name='" & strPath & "'")
    		intResult = objFolder.ChangeSecurityPermissions(objSD, 4)
    		If intResult = 0 Then
    			Wscript.Echo "Успешная настройка списка управления доступом."
    		Else
    			Wscript.Echo "Код ошибки: " & intResult
    		End If
    		Set objACE = Nothing
    		Set objFolder = Nothing
    	End If
    End If
    Set objSD = Nothing
    Set objSecSettings = Nothing
    Set objWMI = Nothing
    WScript.Quit 0
    
    Проблема.

    При таком подходе наследование от "родителя" для записи Пользователя 1 рекурсивно отключается во всём дереве (что, разумеется, верно), но надо, чтобы оно не отключалось.
    Можно, конечно, пойти на хитрость, добавив в конструкцию

    If StrComp(objACE.Trustee.Domain, strDomain, vbTextCompare) = 0 Then
     objACE.AccessMask = 1179817
    End If
    

    оператор objACE.AceFlags = objACE.AceFlags + 16

    Однако возникают нежелательные последствия:
    а) набор флагов каталога DIR0 становится неверным;
    б) во всём дереве перестаёт идентифицироваться "родитель", от которого "потомки" наследуют запись Пользователя 1.

    Можно вместо метода ChangeSecurityPermissions класса Win32_Directory использовать метод GetSecurityDescriptor класса Win32_LogicalFileSecuritySetting .
    С наследованием будет всё в порядке, но возникнет другая неприятность: в списке доступа каталога DIR0 появляются дубликаты всех унаследованных от корня записей, но с отключенным наследованием.

    ======

    Вопрос: как бы получить желаемое?

Все ответы

  • Если у вас везде включено наследование, то зачем рекурсия? Просто измените права у DIR0 с Пользователь 1 - Полный доступ
     на Пользователь 1 - Чтение
    Сазонов Илья http://www.itcommunity.ru/blogs/sie-wl/
    Модератор
  • Каким образом (укажите, пожалуйста, класс WMI и соответствующий метод)?
  • В вашем скрипте все есть :-) Только проход по дереву вниз не нужен, если включено наследование: меняете корень дерева - весь низ сразу наследует права корня.
    Сазонов Илья http://www.itcommunity.ru/blogs/sie-wl/
    10 июня 2010 г. 11:33
    Модератор
  • Мне как раз и надо узнать, как настроить только корень дерева при обязательном соблюдении ряда условий (они описаны в исходном сообщении).

    Метод ChangeSecurityPermissions для этого явно не годится. Но что именно использовать вместо него?

    10 июня 2010 г. 12:00