locked
Script para replicação de permissões RRS feed

  • Pergunta

  • Olá Pessoal,

    Preciso de uma ajuda, o problema é o seguinte.

    Temos um grupo no AD chamado Exemplo-A, mas agora foi solicitado pela direção que todas as permissões em pastas estejam no novo grupo a ser criado chamado Exemplo-B, porém o grupo Exemplo-A não deve ser apagado e nem alterado.

    O intuito mais para frente é que o grupo Exemplo-A seja exclusivo da Diretoria e o Exemplo-B da Gerência, e com isso mudar os acessos que hoje estão identico para ambos pois só existe um grupo.

    Obrigado !!!

    • Tipo Alterado Erick Albuquerque quinta-feira, 21 de outubro de 2010 12:46 Post classificado errado
    quarta-feira, 20 de outubro de 2010 13:06

Respostas

  • Artur

    tem uma ferramanta boa para fazer isso (ela é meio chata) e pode ser usado com batch scripts

    a ferramenta é

    cacls e em windows 7 ficou bem mais detalhada, é chamado icacls

    ve  mais aqui

    http://support.microsoft.com/kb/162786

    quinta-feira, 21 de outubro de 2010 21:11
  • Boa noite Artur,

    use o icacls.exe, ele vem no SP2.

    http://support.microsoft.com/kb/919240/en-us/

    Att,


    Fabiano Barreira

    MCP + MCDST + MCSA on Windows Server 2003 + MCTS + MCITP
    quinta-feira, 21 de outubro de 2010 22:00
  • Carlos tudo bem ?

    Um colega de trabalho conseguiu fazer um script que resolve esse meu problema.

    A unica coisa que falta incluir nele são mais parametros de acesso, Mas os principais já estão inclusos. (Ler e executar, somente leitura, FULL e modificar).

    Segue abaixo.

    Const ForReading = 1, ForWriting = 2, ForAppending = 8

    Const FullAccessMask = 2032127, ModifyAccessMask = 1245631, WriteAccessMask = 118009
    Const ROAccessMask = 1179817

    Dim Folder, Permission

    'On Error Resume Next

    sGrupo = InputBox("Nome do grupo que você quer copiar permissões")

    Group = InputBox("Nome do que herdará permissões")

    strComputer = "."

    sOutputFile = InputBox("Nome do arquivo com o resultado", "Output File")

    sParentFolder = InputBox("Nome da pasta a ser analisada", "Parent Folder")


    Set fso = CreateObject("Scripting.FileSystemObject")
    Set fsOut = fso.OpenTextFile(sOutputFile, ForAppending, True)
    fsOut.Writeline "Folder,User Name,Permission"
    fsOut.Close

    Call OutputFolderInfo(sParentFolder, sOutputFile)

    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & _
        strComputer & "\root\cimv2")
    Set aSubfolder_1 = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_Directory.Name='" & _
        sParentFolder & "'}" _
            & "WHERE AssocClass = Win32_Subdirectory " & "ResultRole = PartComponent")

    For Each sSubfolder1 In aSubfolder_1
        Call OutputFolderInfo(sSubfolder1.Name, sOutputFile)
        Set aSubfolder_2 = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_Directory.Name='" & _
            sSubfolder1.Name & "'}" _
        & "WHERE AssocClass = Win32_Subdirectory " & "ResultRole = PartComponent")
        For Each sSubfolder2 In aSubfolder_2
            Call OutputFolderInfo(sSubfolder2.Name, sOutputFile)
            Set aSubfolder_3 = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_Directory.Name='" & _
                sSubfolder2.Name & "'}" _
            & "WHERE AssocClass = Win32_Subdirectory " & "ResultRole = PartComponent")
        Next
    Next


    Public Sub OutputFolderInfo(FolderName , sOutfile)

    Const FullAccessMask = 2032127, ModifyAccessMask = 1245631, WriteAccessMask = 1180095
    Const ROAccessMask = 1179817
    Const ForReading = 1, ForWriting = 2, ForAppending = 8
    strComputer = "."

    'Build the path to the folder because it requites 2 backslashes
    folderpath = Replace(FolderName, "\", "\\")

    objectpath = "winmgmts:Win32_LogicalFileSecuritySetting.path='" & folderpath & "'"

    'Get the security set for the object
    Set wmiFileSecSetting = GetObject(objectpath)

    'verify that the get was successful
    RetVal = wmiFileSecSetting.GetSecurityDescriptor(wmiSecurityDescriptor)
    If Err <> 0 Then
        MsgBox ("GetSecurityDescriptor failed" & vbCrLf & Err.Number & vbCrLf & Err.Description)
    End If


    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & _
        strComputer & "\root\cimv2")
    Set colFolders = objWMIService.ExecQuery("SELECT * FROM Win32_Directory WHERE Name ='" & _
        folderpath & "'")
    For Each objFolder In colFolders
       
        ' Retrieve the DACL array of Win32_ACE objects.
        DACL = wmiSecurityDescriptor.DACL

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set fsOut = fso.OpenTextFile(sOutfile, ForAppending, True)
       

        For Each wmiAce In DACL
        ' Get Win32_Trustee object from ACE
            Set Trustee = wmiAce.Trustee
          
            if Trustee.Name = sGrupo Then

            fsOut.Write objFolder.Name & "," & Trustee.Domain & "\" & Trustee.Name & ","
            FoundAccessMask = False
            CustomAccessMask = Flase
            While Not FoundAccessMask And Not CustomAccessMask
                If wmiAce.AccessMask = FullAccessMask Then
                    AccessType = "Full Control"
                    FoundAccessMask = True
      Folder = objFolder.Name
      Permission = "F"
                    SetPermissions()
                End If
                If wmiAce.AccessMask = ModifyAccessMask Then
                    AccessType = "Modify"
                    FoundAccessMask = True
      Folder = objFolder.Name
      Permission = "M"
                    SetPermissions()
                End If
                If wmiAce.AccessMask = WriteAccessMask Then
                    AccessType = "Read/Write Control"
                    FoundAccessMask = True
      Folder = objFolder.Name
      Permission = "W"
                    SetPermissions()
                End If
                If wmiAce.AccessMask = ROAccessMask Then
                    AccessType = "Read Only"
                    FoundAccessMask = True
      Folder = objFolder.Name
      Permission = "R"
                    SetPermissions()
                Else
                    CustomAccessMask = True
                End If
            Wend
         
            If FoundAccessMask Then
                fsOut.Writeline AccessType
            Else
                fsOut.Writeline "Custom"
            End If
           
            End if
          
        Next

        Set fsOut = Nothing
        Set fso = Nothing

    Next

    Set fsOut = Nothing
    Set fso = Nothing


    wscript.echo "Fim"

    End sub


    Sub SetPermissions()
     Dim strHomeFolder, strHome, strUser
     Dim intRunError, objShell, objFSO

     strHomeFolder = Folder

     Set objShell = CreateObject("Wscript.Shell")
     Set objFSO = CreateObject("Scripting.FileSystemObject")
     If objFSO.FolderExists(strHomeFolder) Then
      intRunError = objShell.Run("%COMSPEC% /c Echo Y| cacls " _
      & strHomeFolder & " /e /c /g " & Group & ":" & Permission , 2, True)
      
      If intRunError <> 0 Then
       Wscript.Echo "Error assigning permissions for user " _
       & strUser & " to home folder " & strHomeFolder
      End If
     End If
    End Sub

    • Marcado como Resposta Artur Lopes segunda-feira, 29 de novembro de 2010 17:19
    quarta-feira, 27 de outubro de 2010 15:51

Todas as Respostas

  • Artur,

    Vamos lá!

    Crie um Grupo de Segurança: Diretoria e Gerencia

    Coloque os usuários como membro destes Grupos (Gerentes no grupo Gerente e Diretor em Diretoria)

    Vá nas pastas e adicione apenas um dos dois, os quais serão donos da pasta.

    Assim que tiver que fazer as novas alterações, basta excluir os dois grupos antigos.

    Se for isso que deseja, qualquer coisa estamo ai.

    abs

     


    ..::.. Carlos Henrique | MCSA WINDOWS SERVER 2003 ..::..
    quarta-feira, 20 de outubro de 2010 20:02
  • Olá Calos tudo bem ?

    Nesse ambiente temos milhares de pastas, se fosse fazer isso um a um iria demorar muito tempo. O ambiente tem quebra de herança, então na pasta raiz o grupo Exemplo-A tem acesso mas nas pastas abaixo ele pode não ter.

    Obrigado!!

     

    Abs.

     

    quinta-feira, 21 de outubro de 2010 12:43
  • Artur

    tem uma ferramanta boa para fazer isso (ela é meio chata) e pode ser usado com batch scripts

    a ferramenta é

    cacls e em windows 7 ficou bem mais detalhada, é chamado icacls

    ve  mais aqui

    http://support.microsoft.com/kb/162786

    quinta-feira, 21 de outubro de 2010 21:11
  • Boa noite Artur,

    use o icacls.exe, ele vem no SP2.

    http://support.microsoft.com/kb/919240/en-us/

    Att,


    Fabiano Barreira

    MCP + MCDST + MCSA on Windows Server 2003 + MCTS + MCITP
    quinta-feira, 21 de outubro de 2010 22:00
  • Arthur,

    Eu já usei o xcacls e cacls, é bem trabalhoso fazer estes scripts, o ideal é sempre testar no ambiente de homologação, pois se errar uma linha bagunça toda estrutura de permissões.

    O xcacls tem mais  opções que o cacls, e pelo que o pessoal falou este icacls é uma evolução, vou postar um script usando o xcacls, dando um exemplo de como aplicar os aplicativos para colocar a GPO.

    o camando roda em VBS, alinha é esta.

    CACLS

    wshshell.run "cacls ""Caminhodapasta "" /G corp\F723284:r"

    XCACLS

    wshshell.run "c:\windows\xcacls.vbs ""Caminhodapasta "" /T /E /G corp\GRUPO/USUARIO:R corp\H997594:7 /SPEC B"

    Abs


    ..::.. Carlos Henrique | MCSA WINDOWS SERVER 2003 ..::..
    sexta-feira, 22 de outubro de 2010 14:12
  • É sim Carlos, o icacls é mais recente, ele vem no package do SP2.

    O bom dele na minha opinião, é a praticidade, acho ele mais simples no sentido de que com uma linha vc exporta um padrão de ACL para um arquivo de referência e com outra linha vc faz o import para outra pasta, isso dentro de outras diversas funcionalidades.

    Algo mais ou menos assim:

             icacls c:\windows\* /save AclFile /T
            - Will save the ACLs for all files under c:\windows
              and its subdirectories to AclFile.

            icacls c:\windows\ /restore AclFile
            - Will restore the Acls for every file within
              AclFile that exists in c:\windows and its subdirectories


    Att,


    Fabiano Barreira

    MCP + MCDST + MCSA on Windows Server 2003 + MCTS + MCITP
    sexta-feira, 22 de outubro de 2010 14:19
  • Fabiano,

    Obrigado pela dica, este realmente não conhecia, vou fazer uns testes com ele aqui, por que o xcacls e cacls é muito trabalhoso, utiliza-se de muitos parametros.

    Abraço!


    ..::.. Carlos Henrique | MCSA WINDOWS SERVER 2003 ..::..
    sexta-feira, 22 de outubro de 2010 14:23
  • Obrigado pela dica, estou vendo se ele (icacls.exe) vai poder me ajudar, achei um pouco complexo... mas se resolver o problema tudo bem!

    TKS!!!!!!!

    sexta-feira, 22 de outubro de 2010 16:34
  • Eae pessoal... é um pouco dificil... alguem já fez algo semelhante ??
    segunda-feira, 25 de outubro de 2010 18:14
  • Arthur,

    Os scripts que eu postei, é um idéia de como faz.

    Com icacls eu nunca fiz, mas acho que deve ser a mesma meneira e deve  mudar algumas linhas e parametros.

    Mas tente com o comando que eu postei acima. O Fabiano, postou algo tbm.

    Informe onde está a sua dificuldade que eu tentamos ajudar vc!

    abs


    ..::.. Carlos Henrique | MCSA WINDOWS SERVER 2003 ..::..
    segunda-feira, 25 de outubro de 2010 18:26
  • È na parte da construção do comando mesmo...

    com o icacls pelo que entendi ele faz a alteração na pasta X... mas ele não copia permissões...

    como ficaria por exemplo:

    Nome do grupo: GRUPO-A

    Acessos a pastas: x,y,v,z

     

    Agora quero que o icacls copie as permissões do GRUPO-A para um novo grupo que acabei de criar (GRUPO-B) por exemplo, isso em todas as pastas.

    Como fazer isso no icacls???

     

    Abs.

    segunda-feira, 25 de outubro de 2010 19:21
  • Arthur,

    Eu particularmente, utilizei apenas o cacls e o xcacls, e são os comando que eu postei acima que fazem as permissões.

    Neste caso para relicar para o GrupoB na pasta X, você precisa escrever as mesmas linhas na parte debaixo, para o GrupoB.

    Sendo assim a pasta vai ter as mesmas permissões para o Grupo A e Grupo B, para replicar a permissão ou quebrar a herança, tem que usar os parametros que pode ser visto no DOS com o /?.

    Porém não deve ser muito diferente do comando que eu postei acima.

    Vou deixar para os caras esta questão com o icacls, já que nunca fiz com ele, vamos aguardar e ver se alguem já usou esta solução.

    Mas isso é bem trabalhoso de fazer, demanda muito tempo, e é muito complexo, porém depois que pegou o esquema já fica tranquilo.

    Abrs

     


    ..::.. Carlos Henrique | MCSA WINDOWS SERVER 2003 ..::..
    segunda-feira, 25 de outubro de 2010 19:34
  • Carlos tudo bem ?

    Um colega de trabalho conseguiu fazer um script que resolve esse meu problema.

    A unica coisa que falta incluir nele são mais parametros de acesso, Mas os principais já estão inclusos. (Ler e executar, somente leitura, FULL e modificar).

    Segue abaixo.

    Const ForReading = 1, ForWriting = 2, ForAppending = 8

    Const FullAccessMask = 2032127, ModifyAccessMask = 1245631, WriteAccessMask = 118009
    Const ROAccessMask = 1179817

    Dim Folder, Permission

    'On Error Resume Next

    sGrupo = InputBox("Nome do grupo que você quer copiar permissões")

    Group = InputBox("Nome do que herdará permissões")

    strComputer = "."

    sOutputFile = InputBox("Nome do arquivo com o resultado", "Output File")

    sParentFolder = InputBox("Nome da pasta a ser analisada", "Parent Folder")


    Set fso = CreateObject("Scripting.FileSystemObject")
    Set fsOut = fso.OpenTextFile(sOutputFile, ForAppending, True)
    fsOut.Writeline "Folder,User Name,Permission"
    fsOut.Close

    Call OutputFolderInfo(sParentFolder, sOutputFile)

    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & _
        strComputer & "\root\cimv2")
    Set aSubfolder_1 = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_Directory.Name='" & _
        sParentFolder & "'}" _
            & "WHERE AssocClass = Win32_Subdirectory " & "ResultRole = PartComponent")

    For Each sSubfolder1 In aSubfolder_1
        Call OutputFolderInfo(sSubfolder1.Name, sOutputFile)
        Set aSubfolder_2 = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_Directory.Name='" & _
            sSubfolder1.Name & "'}" _
        & "WHERE AssocClass = Win32_Subdirectory " & "ResultRole = PartComponent")
        For Each sSubfolder2 In aSubfolder_2
            Call OutputFolderInfo(sSubfolder2.Name, sOutputFile)
            Set aSubfolder_3 = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_Directory.Name='" & _
                sSubfolder2.Name & "'}" _
            & "WHERE AssocClass = Win32_Subdirectory " & "ResultRole = PartComponent")
        Next
    Next


    Public Sub OutputFolderInfo(FolderName , sOutfile)

    Const FullAccessMask = 2032127, ModifyAccessMask = 1245631, WriteAccessMask = 1180095
    Const ROAccessMask = 1179817
    Const ForReading = 1, ForWriting = 2, ForAppending = 8
    strComputer = "."

    'Build the path to the folder because it requites 2 backslashes
    folderpath = Replace(FolderName, "\", "\\")

    objectpath = "winmgmts:Win32_LogicalFileSecuritySetting.path='" & folderpath & "'"

    'Get the security set for the object
    Set wmiFileSecSetting = GetObject(objectpath)

    'verify that the get was successful
    RetVal = wmiFileSecSetting.GetSecurityDescriptor(wmiSecurityDescriptor)
    If Err <> 0 Then
        MsgBox ("GetSecurityDescriptor failed" & vbCrLf & Err.Number & vbCrLf & Err.Description)
    End If


    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & _
        strComputer & "\root\cimv2")
    Set colFolders = objWMIService.ExecQuery("SELECT * FROM Win32_Directory WHERE Name ='" & _
        folderpath & "'")
    For Each objFolder In colFolders
       
        ' Retrieve the DACL array of Win32_ACE objects.
        DACL = wmiSecurityDescriptor.DACL

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set fsOut = fso.OpenTextFile(sOutfile, ForAppending, True)
       

        For Each wmiAce In DACL
        ' Get Win32_Trustee object from ACE
            Set Trustee = wmiAce.Trustee
          
            if Trustee.Name = sGrupo Then

            fsOut.Write objFolder.Name & "," & Trustee.Domain & "\" & Trustee.Name & ","
            FoundAccessMask = False
            CustomAccessMask = Flase
            While Not FoundAccessMask And Not CustomAccessMask
                If wmiAce.AccessMask = FullAccessMask Then
                    AccessType = "Full Control"
                    FoundAccessMask = True
      Folder = objFolder.Name
      Permission = "F"
                    SetPermissions()
                End If
                If wmiAce.AccessMask = ModifyAccessMask Then
                    AccessType = "Modify"
                    FoundAccessMask = True
      Folder = objFolder.Name
      Permission = "M"
                    SetPermissions()
                End If
                If wmiAce.AccessMask = WriteAccessMask Then
                    AccessType = "Read/Write Control"
                    FoundAccessMask = True
      Folder = objFolder.Name
      Permission = "W"
                    SetPermissions()
                End If
                If wmiAce.AccessMask = ROAccessMask Then
                    AccessType = "Read Only"
                    FoundAccessMask = True
      Folder = objFolder.Name
      Permission = "R"
                    SetPermissions()
                Else
                    CustomAccessMask = True
                End If
            Wend
         
            If FoundAccessMask Then
                fsOut.Writeline AccessType
            Else
                fsOut.Writeline "Custom"
            End If
           
            End if
          
        Next

        Set fsOut = Nothing
        Set fso = Nothing

    Next

    Set fsOut = Nothing
    Set fso = Nothing


    wscript.echo "Fim"

    End sub


    Sub SetPermissions()
     Dim strHomeFolder, strHome, strUser
     Dim intRunError, objShell, objFSO

     strHomeFolder = Folder

     Set objShell = CreateObject("Wscript.Shell")
     Set objFSO = CreateObject("Scripting.FileSystemObject")
     If objFSO.FolderExists(strHomeFolder) Then
      intRunError = objShell.Run("%COMSPEC% /c Echo Y| cacls " _
      & strHomeFolder & " /e /c /g " & Group & ":" & Permission , 2, True)
      
      If intRunError <> 0 Then
       Wscript.Echo "Error assigning permissions for user " _
       & strUser & " to home folder " & strHomeFolder
      End If
     End If
    End Sub

    • Marcado como Resposta Artur Lopes segunda-feira, 29 de novembro de 2010 17:19
    quarta-feira, 27 de outubro de 2010 15:51
  • Arhur, boa tarde!

    Show de bola, obrigado pelo feed back!

    Abraço!


    ..::.. Carlos Henrique | MCSA WINDOWS SERVER 2003 ..::..
    segunda-feira, 29 de novembro de 2010 17:25