在 Active Directory 中同步 OU

在 Active Directory 中同步 OU

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

问题是生产 OU 中有许多通用组,而 Active Directory 不允许我在沙盒 OU 中创建具有相同名称的新组。好消息是生产中的组名都有一个两个字符的前缀,我可以为沙盒更改它(这也意味着一些 SQL Server 工作,但我对这部分非常满意)。此外,它只包含组,没有其他内容,并且组只有一层深度。

那么,我要问的是:

  1. 我能否让 Active Directory 允许我在 2 个不同的 OU 中拥有具有重复名称的组?如果可以,该怎么做?我认为这是不可能的,而且我已经做好了准备,但我想确保我没有遗漏一些显而易见的东西。
  2. 有人能告诉我一款可以处理从生产到沙盒的同步操作的产品(最好是免费的)吗?如果没有……
  3. VBScript、批处理脚本或 PowerShell 脚本用于处理将生产 OU 复制到沙箱?我不是要求您为我编写它,但至少请为我指明正确的方向。

如果有任何变化的话,域控制器仍然是 Windows Server 2003。

答案1

您没有遗漏任何明显的组名信息。您需要按照您描述的方式更改字符前缀。

回复:复制群组 -我的脚本来自这个答案将用户和组成员身份从一台独立的 Windows Server 计算机复制到另一台。您可能可以重新调整此脚本的组部分(或者至少从中挖掘灵感)。此脚本不会处理递归组成员身份(复制具有组作为成员的组),但可以相当轻松地添加该功能。我会编写一些内容来枚举“生产”OU 中的所有组,然后遍历它们并更改后缀,如果“沙盒”OU 中尚不存在该组,则创建该组,然后用适当的成员填充目标组并删除任何不适当的成员。

答案2

同一目录中不能有重复的名称。如果您可以更改前两个字符,那么只需这样做,然后选择一个双字符代码用于生产,另一个用于测试。

答案3

这是基于 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

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

相关内容