在Active Directory中同步OU

我在Active Directory中设置了两个OU来支持我们准备推出的软件包。 一个OU用于生产,另一个用于培训/沙箱。 要求这些独立OU在同一个域中,而不是多个域或一个OU来支持这两种环境 – 软件连接到Sql Server,并使用Sql Server中的数据库名称来查找正确的OU。 我想将组和他们的用户从生产OU同步(复制)到沙箱OU不时。

问题是生产OU中有许多通用组,Active Directory不会让我在沙盒OU中创build一个具有相同名称的新组。 好消息是,在生产中的组名都有一个两个字符的前缀,我可以改变沙箱(这将意味着一些SQL服务器的工作,但我比那部分)。 另外,它只包含组,而不是其他组,只有一个层次。

我问的是以下几点:

  1. 我可以得到活动目录,允许我在两个不同的OU中拥有重复名称的组,如果是这样,怎么办? 我希望这是不可能的,我为此做好了准备,但我想确保我不会错过某些明显的事情。
  2. 任何人都可以指向一个产品(最好是免费的)来处理从生产到沙箱的同步操作吗? 如果不…
  3. VBScript,批处理脚本或PowerShell脚本来处理复制生产OU到沙箱? 我不是要求你为我写信,而是至less指向正确的方向。

域控制器仍然是Windows Server 2003,如果这改变了什么。

你不会错过任何显而易见的:组名。 您需要按照您所描述的方式改变字符前缀的路线。

重新:复制组 – 我的脚本从这个答案复制用户和组成员从一台独立的Windows服务器机器到另一台。 你可能可以重新使用这个脚本的组合部分(或者,至less可以从中获取想法)。 此脚本不会处理recursion组成员身份(将组作为成员复制组),但可以相当容易地添加该function。 我会写一些东西来枚举“Production”OU中的所有组,然后遍历它们,改变后缀,在“Sandbox”OU中创build组(如果它尚不存在的话),然后用适当的成员填充目标组并删除任何不适当的成员。

您不能在同一个目录中有重复的名称。 如果你可以改变这些前两个字符,那么只要做到这一点,select一个两字符的代码进行生产,另一个代码进行testing。

这是基于Evan Anderson提供的脚本(所以他会得到被接受的答案),但是我想提供我使用的确切代码(当然有一些代码):

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 

请注意,这只会复制组名称及其用户。 说明不会过来,我应该使用通用而不是全局组,但到目前为止,沙盒数据库似乎足够好。