【问题标题】:Find if users from one domain exist in another查找来自一个域的用户是否存在于另一个域中
【发布时间】:2012-11-22 14:40:23
【问题描述】:

我正在尝试学习一些系统管理员类型的东西,对此我很陌生。我的问题似乎很简单,但我似乎找不到办法做到这一点。这是场景:

  • 我已经在笔记本电脑的 Hyper-V 下安装了 2 台 Windows Server 2012 机器
  • 我在两者上都设置了新的林,并将每个林提升为 DC。假设一个域称为 mydomain.com,另一个称为 yourdomain.com。两个域之间存在双向信任,我已经验证了这种信任。
  • 我在 mydomain.com 和 yourdomain.com 中添加了一些虚拟用户,有些名称相同,有些名称不同

现在,我要做的是检查 mydomain.com 中的哪些用户也存在于 yourdomain.com 中。例如,我在 mydomain.com 中有一个名为“fred.flintstone”的用户,我想检查他是否也存在于 yourdomain.com 中。

我仅限于使用 VBScript/Perl/Python/Batchfile 和/或 DS 工具(如 dsquery、dsget 等),不幸的是 powershell 已退出(目前)

欢迎任何关于如何编写脚本的指针。

提前致谢

PS: 本练习的最终目标是检查 mydomain.com 中的所有组,并检查这些组是否也存在于 yourdomain.com 中。如果存在,则将用户从 mydomain.com 移动到 yourdomain.com 中对应的组中,如果不存在,则在 yourdomain.com 中创建组并创建对应的用户。

【问题讨论】:

    标签: vbscript active-directory domainservices


    【解决方案1】:

    如果您的最终目标是将用户从 mydomain.com 迁移到 yourdomain.com,那么您现在应该认真地停下来,考虑一条不同的路径。

    创建同名的用户和组将不允许这些用户和组访问 mydomain.com 中的资源。这是因为实际使用的不是名称,而是称为 SID 的安全标识符。这将在 yourdomain.com 中完全不同。

    如果您必须访问 mydomain.com 中的资源,则需要修改访问控制列表 (ACL)。即使用户、组和服务器很少,这也是一个巨大的问题。

    这就是 Microsoft 提供名为 ADMT(Active Directory 迁移工具)的免费工具的原因。可以下载here。不幸的是,它还不支持 Server 2012,因此您还需要目标域中的 2008 R2 Server。看here。 ADMT 将允许您将用户 SID 添加到名为 SIDHistory 的属性中。在决定是否授予访问权限时,资源所有者会检查 SIDHistory 属性。 SIDHistory 不能手动修改。

    【讨论】:

      【解决方案2】:

      Active-Directory 首先是一个目录,当您想到 Directory 时,您会想到 LDAP。

      您首先必须考虑两个相同的用户是什么。我的意思是,您必须创建必须相同的属性列表才能做出决定。

      其次,您可以使用 LDIFDE.EXE(或者这里可能是 CSVDE.EXE)工具来导出所有用户,但只需使用有趣的属性、DN 和重要属性。请注意提取 LDAP 树中的开头(为了避免常见的系统用户),还要考虑它存在两个用户类:'user' 和 'inetOrgPerson'。

      然后你可以使用常规的脚本工具和算法来比较这两个列表。以及为什么不再次使用 LDIFDE.EXE 来创建丢失的用户。

      【讨论】:

      • 酷,感谢 JPBlanc,我会尝试这种方法。抱歉,忘记提及“同一用户”的条件是具有相同的 samid。
      【解决方案3】:

      我设法编写了我想要的 VBScript,所以我将在这里分享。该脚本可能需要很好地清理,但现在它可以完成这项工作,所以我希望它也可以帮助其他人。

      ' Get OU
      
      strOU1 = "OU=here,DC=mydomain,DC=com"
      strOU2 = "OU=there,DC=yourdomain,DC=com"
      
      Dim samid
      Dim ldap_command
      
      ' Create connection to AD
      '
      Set objConnection = CreateObject("ADODB.Connection")
      objConnection.Open "Provider=ADsDSOObject;"
      
      ' Create command
      '
      Set objCommand1 = CreateObject("ADODB.Command")
      objCommand1.ActiveConnection = objConnection
      objCommand1.Properties("Page Size") = 1000
      
      ' Execute command to get all users in OU
      '
      objCommand1.CommandText = _
        "<LDAP://" & strOU1 & ">;" & _
        "(&(objectclass=user)(objectcategory=person));" & _
        "adspath,distinguishedname,sAMAccountName;subtree"
      
      Set objRecordSet = objCommand1.Execute
      
      ' Show info for each user in OU
      '
      Do Until objRecordSet.EOF
      
        ' Show required info for a user
        '  
         samid = objRecordSet.Fields("sAMAccountName").Value
         WScript.Echo "Processing " & objRecordSet.Fields("sAMAccountName").Value
         Set objCommand2 = CreateObject("ADODB.Command")
         ldap_command = _
         "<LDAP://" & strOU2 & ">;" & _
         "(&(objectclass=user)(objectcategory=person)" & _
         "(sAMAccountName=" & samid & "));" & _
         "adspath,distinguishedname,sAMAccountName;subtree"
      
         objCommand2.CommandText = ldap_command
      
         objCommand2.ActiveConnection = objConnection 
         objCommand2.Properties("Chase referrals") = &H40  
      
         Set objRecordSet2 = objCommand2.Execute
      
         If objRecordSet2.RecordCount = 0 Then
            Wscript.Echo "The sAMAccountName is not in use."
         Else
            Wscript.Echo "This ID is in use"
         End If
      
        ' Move to the next user
        '
         objRecordSet.MoveNext
      
      Loop
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-26
        • 1970-01-01
        • 1970-01-01
        • 2013-05-08
        • 1970-01-01
        • 1970-01-01
        • 2012-07-09
        相关资源
        最近更新 更多