Я настраиваю два подразделения в Active Directory для поддержки программного пакета, который мы готовимся к развертыванию. Одно OU предназначено для производства, а другое - для обучения / песочницы. Требуется, чтобы это были независимые подразделения в одном домене, а не несколько доменов или одно подразделение для поддержки обеих сред - программное обеспечение подключается к серверу Sql и использует имя базы данных в сервере Sql для поиска правильного подразделения. Я хочу время от времени синхронизировать (копировать) группы и их пользователей из производственного подразделения в изолированное подразделение.
Проблема в том, что в производственном подразделении существует множество универсальных групп, и Active Directory не позволяет мне создать новую группу с тем же именем в подразделении песочницы. Хорошей новостью является то, что все имена групп в производственной среде имеют двухсимвольный префикс, который я могу изменить для песочницы (это будет означать, что некоторые sql-серверы тоже работают, но я более чем готов к этой части). Кроме того, он содержит только группы, ничего больше, и группы всего на один уровень.
Я спрашиваю следующее:
Контроллеры домена по-прежнему Windows Server 2003, если это что-то изменит.
Вы не упускаете ничего очевидного относительно названий групп. Вам нужно будет пойти своим путем, изменив префиксы символов, как вы описываете.
re: копирование групп - Мой сценарий из этого ответа копирует пользователей и членство в группах с одного автономного компьютера Windows Server на другой. Вы, вероятно, могли бы повторно использовать групповую часть этого скрипта (или, по крайней мере, найти в ней идеи). Этот скрипт не будет обрабатывать рекурсивное членство в группах (копирование групп, которые имеют группы в качестве членов), но эту функцию можно довольно легко добавить. Я бы написал что-нибудь, чтобы перечислить все группы в подразделении "Производство", затем перебрать их, изменяя суффикс, создавая группу в подразделении "Песочница", если она еще не существует, а затем заполняя целевую группу соответствующими членами и удаление любых неуместных участников.
Вы не можете иметь повторяющиеся имена в одном каталоге. Если вы можете изменить эти первые два символа, просто сделайте это и выберите двухсимвольный код для производства, а другой - для тестирования.
Это основано на сценарии, предоставленном Эваном Андерсоном (так что он получит принятый кредит на ответ), но я хотел предоставить точный код, который я использовал (конечно, с небольшими изменениями):
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
Обратите внимание, что при этом копируются только имена групп и их пользователей. Описания не будут повторяться, и я должен использовать универсальные, а не глобальные группы, но пока кажется, что это достаточно хорошо работает для базы данных песочницы.