Sincronizar OUs no Active Directory

3

Estou configurando duas OUs no Active Directory para oferecer suporte a um pacote de software que estamos preparando para lançar. Uma OU é para produção, a outra para treinamento / sandbox. É necessário que sejam UOs independentes no mesmo domínio em vez de vários domínios ou uma UO para oferecer suporte a ambos os ambientes - o software se conecta ao Sql Server e usa o nome do banco de dados no Sql Server para localizar a UO correta. Desejo sincronizar (copiar) grupos e seus usuários da UO de produção até a OU da sandbox de tempos em tempos.

O problema é que há vários grupos universais na UO de produção, e o Active Directory não me permite criar um novo grupo com o mesmo nome na UO do sandbox. A boa notícia é que os nomes de grupo em produção têm um prefixo de dois caracteres que eu posso alterar para o sandbox (isso também significa algum trabalho de sql server, mas estou mais do que pronto para essa parte). Além disso, contém apenas grupos, nada mais, e os grupos têm apenas um nível de profundidade.

O que eu estou perguntando, então, é o seguinte:

  1. Posso obter o diretório ativo para permitir que eu tenha grupos com nomes duplicados em duas unidades organizacionais diferentes e, em caso afirmativo, como? Espero que isso não seja possível e estou preparado para isso, mas quero ter certeza de que não estou sentindo falta de algo óbvio.
  2. Alguém pode me indicar um produto (de preferência gratuito) que manipulará a operação de sincronização da produção para o sandbox? E se não ...
  3. VBScript, script em lote ou script do PowerShell para manipular a cópia da unidade organizacional de produção no sandbox? Eu não estou pedindo para você escrever para mim, mas pelo menos me aponte na direção certa.

Os controladores de domínio ainda são o Windows Server 2003, se isso mudar alguma coisa.

    
por Joel Coel 22.05.2011 / 01:59

3 respostas

2

Você não está perdendo nada de óbvio: os nomes dos grupos. Você precisará seguir o seu caminho para alterar os prefixos de caracteres como descreve.

re: copiando os grupos - Meu script desta resposta copia usuários e membros do grupo de uma máquina Windows Server autônoma para outra. Você provavelmente poderia re-ferramenta a parte do grupo deste script (ou, pelo menos, meu para idéias). Esse script não manipulará associações de grupo recursivas (copiando grupos que têm grupos como membros), mas essa funcionalidade pode ser adicionada com bastante facilidade. Eu escreveria algo para enumerar todos os grupos na UO "Production" e depois iterá-los alterando o sufixo, criando o grupo na UO "Sandbox", caso ainda não existisse, e preenchendo o grupo de destino com os membros apropriados. e remover quaisquer membros inapropriados.

    
por 22.05.2011 / 08:39
0

Você não pode ter nomes duplicados no mesmo diretório. Se você puder alterar os dois primeiros caracteres, faça isso e escolha um código de dois caracteres para produção e outro para teste.

    
por 22.05.2011 / 06:37
0

Isso é baseado no script fornecido por Evan Anderson (para que ele receba o crédito de resposta aceito), mas eu queria fornecer o código exato que usei (claro, com algumas redações):

Option Explicit

Dim colSourceGroups, colDestinationGroups, objSourceGroup, objDestinationGroup, objDestinationGroupName, objSourceUser

' Debugging
Const DEBUGGING = True

' Source and destination OUs
Const SOURCE_OU = "OU=SourceOU,DC=example,DC=local"
Const DESTINATION_OU = "OU=DesintationOU,DC=example,DC=local"

' Source and Destination Prefixes to use
Const OriginalPrefix = "YC"
Const NewPrefix = "SB"

' Get groups in each OU
Set colSourceGroups = GetObject("LDAP://" & SOURCE_OU)
Set colDestinationGroups = GetObject("LDAP://" & DESTINATION_OU)
colSourceGroups.Filter = Array("group")
colDestinationGroups.Filter = Array("group")

' Delete groups in the target to avoid conflict on creation   
For Each objDestinationGroup in colDestinationGroups
    colDestinationGroups.Delete "group", 
    objDestinationGroup.Name
Next 'objDestinationGroup

'Copy source group to destination
For Each objSourceGroup in colSourceGroups

    objDestinationGroupName = "CN=" & NewPrefix & Mid(objSourceGroup.Name,LEN(OriginalPrefix)+4)
    If (DEBUGGING) Then WScript.Echo "Creating Group: " & objDestinationGroupName
    Set objDestinationGroup = colDestinationGroups.Create("group", objDestinationGroupName)
    'objDestinationGroup.Put ("Description", objSourceGroup.Get("Description"))
    objDestinationGroup.SetInfo

    'Add users in the source group to the destination group
    'Non-recursive. Currently only supports flat groups (no nesting allowed at this time)
    For Each objSourceUser In objSourceGroup.Members 
        If (DEBUGGING) Then WScript.Echo "Adding user " & objSourceUser.Name & " to group " & objDestinationGroup.Name      
        objDestinationGroup.Add(objSourceUser.aDSPath)
    Next ' objUser
Next ' objSourceGroup

Observe que isso somente copia nomes de grupos e seus usuários. As descrições não apareceriam, e devo usar o Universal em vez de grupos globais, mas até agora parece funcionar bem o suficiente para o banco de dados do sandbox.

    
por 23.05.2011 / 19:18