查找来自一个域的用户是否存在于另一个域中

时间:2012-11-22 14:40:24

标签: vbscript active-directory domainservices

我正在尝试学习一些sys-admin类型的东西,而且我是非常新的。我的问题似乎很简单,但我似乎找不到办法做到这一点。这是场景:

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

现在,我想做的是检查yourdomain.com中mydomain.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中创建该组并创建相应的用户。

3 个答案:

答案 0 :(得分:0)

Active-Directory首先是一个目录,当你想到Directory时,你认为是LDAP。

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

其次,您可以使用LDIFDE.EXE(或者可能是CSVDE.EXE)工具导出所有用户,但只使用有趣的属性,DN和重要的属性。小心exals考虑在LDAP树中启动(为了避免常见的系统用户),还要考虑它为用户存在两个类:'user'和'inetOrgPerson'。

然后您可以使用传统的脚本工具和算法来比较这两个列表。为什么不再使用LDIFDE.EXE创建缺少的用户。

答案 1 :(得分:0)

如果您的最终目标是将用户从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 con不能手动修改。

答案 2 :(得分: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