none
Скопировать NTFS права и присвоить их группе RRS feed

  • Вопрос

  • Помогите советом!

    Просто говоря:

    Как при помощи Icacls сохранить NTFS доступ пользователя к определённым папкам а потом загрузить на определённые группы? Образно говоря что бы туда куда может зайти ИванИванов, сможет зайти и отдел продаж. А потом убрать отдельные права у ИванаИванова и добавить в группу отдела продаж. Что бы не было бардака и можно было новых пользователей добавлять просто в отдел, а не выдавать права на каждую папку, когда они стандарты в основном у всех в отделе.

    Если говорить более сложно:

    Есть задача, на предприятии права выданные не группам как положено, а каждому пользователю отдельно. Данные собрал и распределил по группам, куда какая группа может зайти, где может менять и т.д. И кого нужно добавить в эту группу.
    Но проблема в том что у каждого пользователю много разных папок доступно и хотелось бы просто взять кого нибудь за пример и скопировать и присвоить его права группе, а потом уже добавить нужное или убрать лишнее.
    Что бы вы посоветовали что бы автоматизировать процесс, а то это будет как бы немного долгий нудный процесс.
    Заранее благодарю за ответ!

    13 августа 2013 г. 15:08

Ответы

  • Без сценария, скорее всего, Вы не обойдётесь.
    Суть алгоритма сценария такова:
    1. Составить список пользовательских "учёток", которые являются "индикаторами" нужных групп.
    2. Просмотреть избирательные списки управления доступом (DACL) нужных папок на предмет поиска там записей "учёток-индикаторов".
    2.1. Если запись найдена, то проверить, не унаследована ли она от папки-"родителя".
    2.1.1. Если унаследована - пропустить.
    2.1.2. Если не унаследована - заменить объект класса TRUSTEE "учётки" пользователя на аналогичный объект "учётки" соответствующей группы (если будете писать на VBS, то соответствующий пример сценария для такой замены - ниже).
    После этого имеет смысл всем записям для "учёток" пользователей из соответствующей группы назначить маску доступа равную нулю. При выполнении процедуры упорядочения записей в DACL система автоматически удалит из него такие записи.

    '************************************************************************************************************
    '* Язык: VBScript
    '* Назначение: Изменение списков управления доступом (DACL) дескриптора безопасности NTFS заданного каталога
    '*             БЕЗ НАРУШЕНИЯ НАСЛЕДОВАНИЯ настроек от "родителя":
    '*             замена объекта класса "Win32_Trustee" одной "учётки" на соответствующий объект другой "учётки".
    '*             Учётные записи идентифицирутся парой значений "домен\имя."
    '*             Обрабатываются ВСЕ записи заменяемой "учётки".
    '*             Путь к целевому каталогу и пары для идентификации "учёток" задаются в сценарии.
    '************************************************************************************************************
    Dim objWsNet, objFS, objWMI
    Dim strDomain, strComputer, strBaseFolder, blnContinue, xResult
    Dim strAccountOld, strSIDOld, strAccountNew, strSIDNew
    
    strAccountOld = "1": strAccountNew = "2"
    strBaseFolder = "C:\Temp"
    Set objWsNet = CreateObject("WScript.Network")
    strDomain = objWsNet.UserDomain
    strComputer = objWsNet.ComputerName
    Set objWsNet = Nothing
    On Error Resume Next
    Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    If Err.Number = 0 Then
        Set objFS = CreateObject("Scripting.FileSystemObject")
        If objFS.FolderExists(strBaseFolder) Then
            If StrComp(strDomain & "\" & strAccountOld, strDomain & "\" & strAccountNew, vbTextCompare) <> 0 Then
                Set objAccount = objWMI.Get("Win32_UserAccount.Domain='" & strDomain & "',Name='" & strAccountOld & "'")
                If Err.Number = 0 Then
                    strSIDOld = UCase(objAccount.SID)
                    Set objAccount = objWMI.Get("Win32_UserAccount.Domain='" & strDomain & "',Name='" & strAccountNew & "'")
                    If Err.Number = 0 Then
                        strSIDNew = UCase(objAccount.SID)
                        xResult = Change_Trustee(objWMI, strDomain, strAccountOld, strSIDOld, strAccountNew, strSIDNew, strBaseFolder)
                        WScript.Echo strAccountOld & " <-> " & strAccountNew & ": " & xResult
                    Else
                        WScript.Echo strAccountNew & " -> не найдена учётная запись объекта"
                    End If
                Else
                    WScript.Echo strAccountOld & " -> не найдена учётная запись объекта"
                    Err.Clear
                End If
                Set objAccount = Nothing
            Else
                WScript.Echo strAccountOld & " <-> " & strAccountNew & ": бессмысленная операция"
            End If
        Else
            WScript.Echo "Не найден путь " & UCase(strBaseFolder)
        End If
        Set objFS = Nothing
    Else
        WScript.Echo "Ошибка " & Err.Number & " при подключении к WMI-пространству" & vbNewLine & Err.Description
        Err.Clear
    End If
    Set objWMI = Nothing
    WScript.Quit 0
    
    '======
    
    Function Change_Trustee(objWMIServ, strDom, strSAN1, strSID1, strSAN2, strSID2, strDir)
    Dim objSecSettings, objSD, objItem, blnHasInherited
    Dim objSID, objTrustee, arrACE, arrLines, xRes, i, j
    Const SE_DACL_PROTECTED = 4096 'Флаг-признак отключенного режима наследования управляемым каталогом безопасности NTFS от "родителя"
    Const INHERITED_ACE = 16 'Флаг-признак того, что текущая запись DACL унаследована от "родителя"
    
    On Error Resume Next
    xRes = 0
    Set objSecSettings = objWMIServ.Get("Win32_LogicalFileSecuritySetting.Path='" & strDir & "'")
    If Err.Number = 0 Then
        If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then
            If Not IsNull(objSD.DACL) Then
                If Not CBool(objSD.ControlFlags And SE_DACL_PROTECTED) Then blnHasInherited = True
                arrACE = Array(): i = -1: arrLines = Array(): j = -1
                '--- Выборка из исходного DACL записей, не унаследованных от "родителя",
                'и поиск среди них (по SID) тех, которые привязаны к заменяемой пользовательской "учётке"
                For Each objItem In objSD.DACL
                    If Not CBool(objItem.AceFlags And INHERITED_ACE) Then
                        If UCase(objItem.Trustee.SIDString) = strSID1 Then
                            j = j + 1
                            ReDim Preserve arrLines(j)
                            arrLines(j) = i + 1
                        End If
                        i = i + 1
                        ReDim Preserve arrACE(i)
                        Set arrACE(i) = objItem
                    End If
                Next
                Set objItem = Nothing
                '------
                If j >= 0 Then
                    If blnHasInherited Then
                        '--- Отключение наследования настроек безопасности от "родителя"
                        objSD.ControlFlags = objSD.ControlFlags + SE_DACL_PROTECTED
                        xRes = objSecSettings.SetSecurityDescriptor(objSD)
                        '------
                    End If
                    If xRes = 0 Then
                        '--- Создание экземпляра класса "Win32_Trustee",
                        'привязанного к заменяющей пользовательской "учётке"
                        Set objSID = objWMI.Get("Win32_SID.SID='" & strSID2 & "'")
                        Set objTrustee = objWMIServ.Get("Win32_Trustee").Spawninstance_
                        objTrustee.Domain = strDom
                        objTrustee.Name = strSAN2
                        objTrustee.SID = objSID.BinaryRepresentation
                        objTrustee.SidLength = objSID.SidLength
                        objTrustee.SIDString = strSID2
                        Set objSID = Nothing
                        '------
                        '--- Замена объекта класса "Win32_Trustee" у обрабатываемых записей DACL
                        For j = 0 To UBound(arrLines)
                            arrACE(arrLines(j)).Trustee = objTrustee
                        Next
                        '------
                        objSD.DACL = arrACE 'собственно изменение DACL
                        Erase arrACE: Erase arrLines
                        '--- Включение наследования настроек безопасности от "родителя", если первоначально оно было включено
                        If blnHasInherited Then objSD.ControlFlags = objSD.ControlFlags - SE_DACL_PROTECTED
                        '------
                        '--- Итоговое сохраненение изменений, внесённых в дескриптор безопасности
                        xRes = objSecSettings.SetSecurityDescriptor(objSD)
                        Select Case xRes
                            Case 0: xRes = "успешное завершение"
                            Case 2: xRes = "не удалось сохранить изменения DACL (доступ запрещён)"
                            Case 5, 9: xRes = "не удалось сохранить изменения DACL (для выполнения операции недостаточно полномочий)"
                            Case 21: xRes = "не удалось сохранить изменения DACL (заданы недопустимые значения параметров)"
                            Case Else: xRes = "не удалось сохранить изменения DACL (неизвестная ошибка)"
                        End Select
                        '------
                    Else
                        xRes = "не удалось отключить наследование безопасности"
                    End If
                Else
                    xRes = "не обнаружено не унаследованных записей исходного объекта"
                End If
                Set objTrustee = Nothing
            Else
                xRes = "список управления доступом пуст"
            End If
        Else
            xRes = "не удалось прочитать дескриптор безопасности объекта"
        End If
        Set objSD = Nothing
        Set objSecSettings = Nothing
    Else
        xRes = "ошибка " & CStr(Err.Number) & vbNewLine & Err.Description
        Err.Clear
    End If
    On Error GoTo 0
    Change_Trustee = xRes
    End Function




    • Изменено DmitriiV 13 августа 2013 г. 18:48
    • Предложено в качестве ответа Satysfy_me 17 августа 2013 г. 17:34
    • Помечено в качестве ответа KazunEditor 19 августа 2013 г. 4:50
    13 августа 2013 г. 18:05