【问题标题】:VBS Active Directory (2003) Move users from one set of groups to anotherVBS Active Directory (2003) 将用户从一组组移动到另一组
【发布时间】:2013-08-20 08:25:00
【问题描述】:

我正在使用此 VBS 将用户的平面列表从一个组移动到另一个组。 到现在为止还挺好。我是 VB 的菜鸟。挑战在于我有 20 个不同的同步组 (Sync01-Sync20) 和 20 个 Mig 组 (Mig01-Mig20)。我需要扩展识别用户所属的女巫 Sunc 组的代码。然后将其“翻译”为正确的 Mig 组。任何人? :)

DIM objGroup, objGroup2, objRootLDAP, objFSO, objInput, objConnection, objCommand 
DIM strUser 

On Error Resume Next 

Set objRootLDAP = GetObject("LDAP://rootDSE") 
Set objConnection = CreateObject("ADODB.Connection") 
objConnection.Open "Provider=ADsDSOObject;" 
Set objCommand = CreateObject("ADODB.Command") 
objCommand.ActiveConnection = objConnection 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objInput = objFSO.OpenTextFile("users.txt") 
Set objGroup = GetObject("LDAP://cn=Sync01,ou=Huset,dc=bb,dc=net") 
Set objGroup2 = GetObject("LDAP://cn=Mig01,ou=Huset,dc=bb,dc=net") 

Do Until objInput.AtEndOfStream 
strUser = ObjInput.ReadLine 

objCommand.CommandText = "<LDAP://dc=bb,dc=net>;(&(objectCategory=person)(sAMAccountName=" & strUser & "));distinguishedName,userAccountControl;subtree" 

Set objRecordSet = objCommand.Execute 

If objRecordSet.RecordCount = 0 Then 
    MsgBox strUser & " was not found!" & VbCrLf & "Skipping", VbOkOnly,"User Not Found" 
Else 
    strDN = objRecordSet.Fields("distinguishedName") 
    Set objUser = GetObject("LDAP://" & strDN) 
    objGroup.Remove(objUser.AdsPath) 
    objGroup2.Add(objUser.AdsPath)
End If 
Loop 

WScript.Echo "Complete"

【问题讨论】:

  • 任何给定同步组的“正确”Mig 组是什么?一个用户可以是多个 Mig 或 Sync 组的成员吗?
  • 我的错。如果用户是 Sync01 的成员,那么正确的 grup 是 Mig01,依此类推。这些组用于控制名为 Quest 的工具的迁移流程。如果将成员添加到错误的组,则迁移将失败。而且我将不得不花费 3-4 小时扫描日志来查找和纠正问题。

标签: vbscript active-directory windows-server-2003 active-directory-group


【解决方案1】:

如果您只想将组成员从每个 Sync 组转移到对应的 Mig 组,应该这样做:

Set fso = CreateObject("Scripting.FileSystemObject")

Set userlist = CreateObject("Scripting.Dictionary")
userlist.CompareMode = vbTextCompare
Set f = fso.OpenTextFile("users.txt")
Do Until f.AtEndOfStream
  userlist.Add f.ReadLine, True
Loop
f.Close

domain = GetObject("LDAP://rootDSE").Get("defaultNamingContext")

For i = 1 To 20
  n = Right("0" & i, 2)
  Set gSync = GetObject("LDAP://CN=Sync" & n & ",OU=Huset," & domain)
  Set gMig  = GetObject("LDAP://CN=Mig" & n & ",OU=Huset," & domain)
  For Each m In gSync.Members
    Set user = GetObject(m.ADsPath)
    If userlist.Exists(user.sAMAccountName) Then
      gMig.Add(m.ADsPath)
      gSync.Remove(m.ADsPath)
    End If
  Next
Next

【讨论】:

  • 谢谢!正如我所说,脚本不是我的强项。我如何在我的原始脚本中加入这个?我得到了你写的片段,可以在我的测试环境中工作,但这会感动所有用户。我需要一种方法来让此代码遵循与原始帖子中相同的“Users.txt”。
猜你喜欢
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
相关资源
最近更新 更多