none
нужен скрипт для раздачи прав на папки пользователей RRS feed

  • Общие обсуждения

  • Здравствуйте всем!
    Нужен скрипт для раздачи прав на папки пользователей...
    У меня около 1000 пользователей,при входе у них у всех подключаеться сетевой диск с их папкой которая храниться на сервере
    например у пользователя с логином ivanov есть папка ivanov где он хранит все свое барахло, дак вот надо чтоб скрипт из АД дергал логины и на соответствующую(логину) папку раздавал права полного доступа для system,администратор домена и user
    в скриптах не силен! так что если есть возможность прошу готовое решение???
    13 ноября 2007 г. 11:01

Все ответы

  • Можно сделать без скприпта: в оснастке ADUC выбираете нужных пользователей, свойства, Profile, Connect, выбираете диск и указываете путь к папке пользователя  \\server\share\%USERNAME% Папки с правами доступа для пользователя будут созданы. После этого, отметив все созданные папки, можно на них руками добавить нужные права за одну операцию. Права на шару должны быть full everyone, а на корневую папку full для администраторов и System.

     

     

    13 ноября 2007 г. 12:11
    Модератор
  •  sie написано:

    Можно сделать без скприпта: в оснастке ADUC выбираете нужных пользователей, свойства, Profile, Connect, выбираете диск и указываете путь к папке пользователя  \\server\share\%USERNAME% Папки с правами доступа для пользователя будут созданы. После этого, отметив все созданные папки, можно на них руками добавить нужные права за одну операцию. Права на шару должны быть full everyone, а на корневую папку full для администраторов и System.

     

     



    это понятно,но у меня была трабла и слетели права...и надо чтоб пользователь заходил только к себе в папку,а если я сделаю full everyone, то любой юзер в любую папку залезет!!!
    13 ноября 2007 г. 13:47
  •  Ivan_Chu написано:
    если я сделаю full everyone, то любой юзер в любую папку залезет!!!

     

    Я про не про папку, а про шару написал full everyone.

     

    В качестве заготовки можно взять это:

    Образец кода

     

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objShell = CreateObject("WScript.Shell")

    '#
    '# Create home folder.
    '#

    strUSRName = objshell.ExpandEnvironmentStrings("%username%")
    strHomeFolder = "c:\test\"& strUSRName

                If (strHomeFolder <> "") Then
                    If (objFSO.FolderExists(strHomeFolder) = False) Then
                        On Error Resume Next
                        objFSO.CreateFolder strHomeFolder
                        If (Err.Number <> 0) Then
                            On Error GoTo 0
                            Wscript.Echo "Unable to create home folder: " & strHomeFolder
                        End If
                        On Error GoTo 0
                    End If
                    If (objFSO.FolderExists(strHomeFolder) = True) Then
                        ' Assign user permission to home folder.
                        intRunError = objShell.Run("%COMSPEC% /c Echo Y| cacls " _
                            & strHomeFolder & " /T /E /C /G " & "Domain" _
                            & "\" & strUSRName & ":F", 2, True)
                          
                        If (intRunError <> 0) Then
                            MsgBox "Error assigning permissions for user " _
                                & strUSRName & " to home folder " & strHomeFolder
                        End If
                    End If
                End If

     

     

     

     

    13 ноября 2007 г. 14:34
    Модератор
  • нда... в качестве заготовки понятно,а вот если без заготовки,я не силен в скриптах,хотя бы пояснить какая строчка,команда,часть за что отвечает и что делает???
    13 ноября 2007 г. 16:11
  • Ну вы ребята и "комсомольцы". Оборачивать в VBS кусок кода, что-бы вызвать Shell.Run-ом ...

    Вот это не проще будет ? (userdir.cmd):

     

    Образец кода

     

    Set USRESDIR=c:\forallusers

     

    if NOT EXIST "%USERSDIR%\%UserName%\" mkdir "%USERSDIR%\%UserName%\"

     

    rem Если каталог существует, то сначала даём права _только_ доменным админам

    echo y | cacls "%USERSDIR%\%UserName%" /G "%UserDomain%\Domain Admins":F /T /C

     

    rem А потом _добавляем_ права самому пользователю.

    rem      (Даём modify, негоже пользователю права менять :-) )

    echo y | cacls "%USERSDIR%\%UserName%" /G "%UserDomain%\%UserName%":C /E /T /C

     

     

     

    Тут, конечно, проверок нет, но зато понятно. (B всего четыре строчки :-) )
    14 ноября 2007 г. 9:36
  •  КГБ написано:

    Тут, конечно, проверок нет, но зато понятно. (B всего четыре строчки :-) )

    Для меня, например, это ключевая фраза. Очень сложно сделать обработку ошибок. Хотя как пример - гут.
    14 ноября 2007 г. 10:06
    Модератор
  • to КГБ прекрасно перевели, но это не совсем то, что нужно автору темы.

     

    Вы напишите человеку вызов cacls в цикле для списка поддиректорий заданной директории и чтобы имя директории подставлялось в cacls в качестве имени пользователя, для которого выставляются права.

    14 ноября 2007 г. 10:15
    Модератор
  •  sie написано:

    to КГБ прекрасно перевели, но это не совсем то, что нужно автору темы.

     

    Вы напишите человеку вызов cacls в цикле для списка поддиректорий заданной директории и чтобы имя директории подставлялось в cacls в качестве имени пользователя, для которого выставляются права.

     

    Ещё проще . 2 строчки.(т.к. мы перечисляем именно существующие каталоги):

     

    Set USRESDIR=c:\forallusers

     

    for /D %%i in ( "%UsersDir%\*" ) do (

            echo y | cacls "%USERSDIR%\%%~xni" /G "%UserDomain%\Domain Admins":F /T /C

            echo y | cacls "%USERSDIR%\%%~xni" /G "%UserDomain%\%%~xni":F /T /E /C

    )

     

    К сожалению  у cacls с ErrorLevel беда какая-то. Можно с xcacls. C проверками.
    14 ноября 2007 г. 13:32
  • Ребят усё работает, только вот проблемка возникает с именами папок на русском языке.

    Может есть скриптик на Kixe???

    22 ноября 2007 г. 15:31
  •  

    Вариант на PowerShell с icacls.exe

    С русскими именами всё ок, проверил.

     

    dir | foreach {

    icacls $_ /grant:r "$($env:USERDOMAIN)\Domain Admins:F" /T /C

    icacls $_ /grant "$($env:USERDOMAIN)\$_:F" /T /E /C

    }

    29 ноября 2007 г. 5:11
    Модератор
  • Готовый код, только обработку ошибок красивше описать.

    При запуске скрипта без параметров пишет информацию как его запускать.

    Извините что написал много, я очень спешил (Жюль Верн, кажется)

    Образец кода: скрипт setpermissions.vbs

    'Константы для разрешений
    Const PERM_READ           = 1179817
    Const PERM_MODIFY         = 1245631
    Const PERM_FULL           = 2032127

     

    Dim domainName,rootFolder,Args
     

    Set Args = WScript.Arguments

    If (Args.Unnamed.Count < 2) Or Args.Named.Exists("?") Then
     showusage
     Wscript.Quit 0
    Else
     domainName  =Args(1)
     rootFolder  =Args(0)
    End If

    ApplyPermissions rootFolder,domainName
    If err<>0 Then
     Wscript.echo err.description
    Else
     Wscript.echo "Разрешения установлены"
    End If

     

    Sub showusage
     wscript.echo " Параметры запуска: cscript setpermissions.vbs [*rootFolder] [*domainName]" & vbNewLine & _
         " оба параметра обязательны" & vbNewLine & _
         " Пример запуска: cscript setpermissions.vbs c:\tmp kamasutra"
    End Sub

     

    Function ApplyPermissions(str_Path,domain_name)
    On Error Resume Next


     

    Dim ProcName,WSHShell,fso,Common_DACL,Current_DACL,root_dir,user_dir

    ProcName="ApplyPermissions"

    Set WSHShell = WScript.CreateObject("WScript.Shell")
    Set fso      = WScript.CreateObject("Scripting.FileSystemObject")
    Set root_dir=fso.GetFolder(str_Path)

    Common_DACL=AddACE(Null,Null,"SYSTEM",PERM_FULL)
    Common_DACL=AddACE(Common_DACL,domain_name,"Domain Admins",PERM_FULL)

    for Each user_dir In root_dir.SubFolders
     Current_DACL=AddACE(Common_DACL,domain_name,user_dir.Name,PERM_MODIFY)
     If err<>0 Then
       Err.Raise 9999,ProcName ," Невозможна установка разрешений->" & err.Description
       Exit Function
     End If
     SetPermission user_dir.path,Current_DACL
     If err<>0 Then
       Err.Raise 9999,ProcName ," Невозможна установка разрешений->" & err.Description
       Exit Function
     End If
    Next

    Set fso=Nothing
    Set WSHShell       = Nothing
    Set root_dir=Nothing
    End Function


    Function AddACE(DACL,Domain,account,Share_Perm)
    On Error Resume Next
    Dim newACE
    Dim UserTrustee
    Dim procname
    procname=AddACE
    Set UserTrustee=GetGroupTrustee(Domain,account)
    If err<>0 Then
      err.Clear
      Set UserTrustee=GetAccountTrustee(Domain,account)
    End If
    If err<>0 Then
     Err.Raise 9999,ProcName ," Объект " & account & " не найден среди групп и пользователей указанного домена->" & err.Description
     Exit Function
    Else
     AddACE=EditDACL (DACL, UserTrustee,Share_Perm)
    End If

    End Function


    Private Function EditDACL(DACL,UserTrustee,permission)
    On Error Resume Next
    Dim UserHasPermission
    Dim NewDACL()
    dim wmiAce
    dim Trustee
    Dim i
    Dim ProcName

    ProcName="EditDACL"
    UserHasPermission = False

    redim NewDACL(0)
    i=0

    If Not isnull(DACL) Then
    For Each wmiAce In DACL

        Set Trustee = wmiAce.Trustee
     
        If (strcomp(Trustee.Domain,UserTrustee.Domain,vbtextcompare)=0 And strcomp(Trustee.Name,UserTrustee.Name,vbtextcompare)=0) Then

      ConfigureACE wmiAce,permission

      UserHasPermission = True
      
        End If
     
        redim Preserve NewDACL(i)
        Set NewDACL(i) = wmiAce
     
        i = i + 1

    Next
    End if
    If not UserHasPermission Then

     dim newACE

     set newACE = CreateObject("WbemScripting.SWbemLocator").ConnectServer ("", "root/cimv2").Get("Win32_Ace").Spawninstance_()

     newACE.Trustee = UserTrustee

     ConfigureACE newACE,permission
     
        If Not isnull(DACL) Then i = ubound(NewDACL)+1

     ReDim Preserve NewDACL(i)

     Set NewDACL(i) = newACE

    End If

    If err<>0 Then
       Err.Raise 9999,ProcName ," Невозможно редактирование разрешений->" & err.Description
       Exit Function
    End If

    EditDACL= NewDACL

    End Function

     

    Function GetAccountTrustee(strDomain, strName)
    Dim objTrustee
    Dim account
    Dim accountSID
    On Error Resume Next
    Dim ProcName
    ProcName="GetAccountTrustee"
    set objTrustee = getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Trustee").Spawninstance_
    If Isnull(strDomain) Then
     set account    = getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Account.Name='" & strName & "',Domain='" & WScript.CreateObject("WScript.Shell").ExpandEnvironmentStrings("%COMPUTERNAME%") &  "'")
    Else
     set account    = getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Account.Name='" & strName & "',Domain='" & strDomain &"'")
    End If

    set accountSID = getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_SID.SID='" & account.SID &"'")
    objTrustee.Domain = strDomain
    objTrustee.Name   = strName
    objTrustee.Properties_.item("SID") = accountSID.BinaryRepresentation
    set accountSID = nothing
    set account    = Nothing
    If err<>0 Then
       
       Err.Raise 9999,ProcName ," Ошибка получения Trustee: " & strDomain & "\" & strName
       Set objTrustee = Nothing
       Exit Function
    End If
    set GetAccountTrustee = objTrustee
    End Function

     

    Function GetGroupTrustee(strDomain, strName)
    On Error Resume Next
    Dim objTrustee
    Dim account
    Dim accountSID
    Dim ProcName
    ProcName="GetGroupTrustee"

    set objTrustee = getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Trustee").Spawninstance_

    If Isnull(strDomain) Then
     Set account    = getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Group.Name='" & strName & "',Domain='" & WScript.CreateObject("WScript.Shell").ExpandEnvironmentStrings("%COMPUTERNAME%") &  "'")
    Else
     set account    = getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Group.Name='" & strName & "',Domain='" & strDomain &"'")
    End If

    set accountSID = getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_SID.SID='" & account.SID &"'")
    objTrustee.Domain = strDomain
    objTrustee.Name   = strName
    objTrustee.Properties_.item("SID") = accountSID.BinaryRepresentation
    set accountSID = Nothing
    set account    = Nothing
    If err<>0 Then
       
       Err.Raise 9999,ProcName ," Ошибка получения Trustee:  " & strDomain & "\" & strName
       Set objTrustee = Nothing
       Exit Function
    End If
    set GetGroupTrustee = objTrustee
    End Function

     

    Private Sub ConfigureACE (byref wmiAce,permission)

     wmiAce.AccessMask = permission

     wmiAce.AceType  = 0' ALLOW

     wmiAce.AceFlags = 3' OBJECT_INHERIT_ACE + CONTAINER_INHERIT_ACE

    End Sub

     

    Function SetPermission(strPath,ByRef DACL)
    On Error Resume Next

    dim wmiFileSecSetting
    Dim SecurityDescriptor
    dim retVal
    Dim ProcName

    ProcName="SetPermission"

    Set wmiFileSecSetting = GetObject("winmgmts:Win32_LogicalFileSecuritySetting.path='" & strPath & "'")
    retVal = wmiFileSecSetting.GetSecurityDescriptor(SecurityDescriptor)
    SecurityDescriptor.DACL=DACL
    retVal = wmiFileSecSetting.SetSecurityDescriptor(SecurityDescriptor)

    If err<>0 Then
       Err.Raise 9999,ProcName ," Невозможно применение разрешений к объекту: " & strPath & "->" &  err.Description
       Set wmiFileSecSetting = Nothing
       Exit Function
    End If

    Set wmiFileSecSetting = Nothing

    End Function

     

     

    11 декабря 2007 г. 9:50
  • Коллеги, эти все способы раздачи прав хороши.
    А вот как бы указывать имя контроллера домена, на котором создан пользователь, в скрипте?
    Или при задании прав указывать не Username, а SID пользователя.
    Поясню, зачем это нужно:
    Есть домен в тремя сайтами, в каждом сайте 2-3 контроллера домена. Если в одном из сайтов создать пользователя, а потом попытаться создать для него профиль, на файловом сервера, даже в пределах сайта, может возникнуть ситуация, при которой установка прав подобными скриптами будет неуспешной.
    Понятно что можно воспользоваться обходными решениями. Но все таки - создавая пользователя можно указать контроллер домена, на котором пользователь будет создаваться. Можно ли в процессе раздачи прав указывать или SID пользователя, или контроллер домена на котором пользователь был создан? Использование %LOGONSERVER% помогает не всегда.
    20 апреля 2009 г. 7:09
  • В качестве domainName   можно указать не имя домена, а имя домен-контроллера
    Сазонов Илья http://www.itcommunity.ru/blogs/sie/
    20 апреля 2009 г. 11:26
    Модератор