1

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

  • 我在笔记本电脑的 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 中创建组并创建相应的用户。

4

3 回答 3

0

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

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

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

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

于 2012-11-23T05:02:04.170 回答
0

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

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

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

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

于 2012-11-23T09:52:41.423 回答
0

我设法编写了我想要的 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
于 2012-11-26T10:20:11.267 回答