• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1238
  • Last Modified:

VBScript to Move AD Computers

What I am after is a script to move computers from one OU to another OU.  Why?  Well all new computers go to an "Unassigned" OU when they join the domain, then we have separate OU's for operating systems (2k and XP) so the script needs to determine the operating system then move to the correct OU for that operating system.  However it should not move servers.

I have searched the WEB and have created the below script, but it doesn't seem to be working correctly....if anyone can help it will be appreciated

Option Explicit

Dim objRootDSE, strDNSDomain, objCommand, objConnection
Dim strBase, strFilter, strAttributes, strQuery, objRecordSet
Dim strDN, strOS, objW2kOU, objXPOU

' Bind to target W2k and XP OU containers.
Set objW2kOU = GetObject("LDAP://ou=2k,ou=workstations,ou=Computers,ou=OU,dc=MY,dc=DOMAIN,dc=COM")
Set objXPOU = GetObject("LDAP://ou=XP,ou=workstations,ou=Computers,ou=OU,dc=MY,dc=DOMAIN,dc=COM")

' Determine DNS domain name.
Set objRootDSE = GetObject("LDAP://RootDSE")
strDNSDomain = objRootDSE.Get("defaultNamingContext")

' Use ADO to search Active Directory.
Set objCommand = CreateObject("ADODB.Command")
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
objCommand.ActiveConnection = objConnection
strBase = "<LDAP://" & strDNSDomain & ">"

' Filter on all computer objects.
strFilter = "(objectCategory=computer)"
' Retrieve distinguishedName and operatingSystem attributes.
strAttributes = "distinguishedName,operatingSystem"
strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"
objCommand.CommandText = strQuery
objCommand.Properties("Page Size") = 100
objCommand.Properties("Timeout") = 30
objCommand.Properties("Cache Results") = False
Set objRecordSet = objCommand.Execute

' Loop through all computer objects.
Do Until objRecordSet.EOF
' Make strings lower case.
strDN = LCase(objRecordSet.Fields("distinguishedName").Value)
strOS = LCase(objRecordset.Fields("operatingsystem").Value)
' Check if computer object in cn=computers container.
If (InStr(strDN, "OU=Unassigned,OU=Computers,OU=OU,DC=york,MY=gov,DOMAIN=COM")) Then
' Check OS, skip servers.
If strOS = "windows 2000 Professional" Then
Set objMoveComputer = objW2kOU.MoveHere("LDAP://" & strDN, vbNullString)
ElseIf strOS = "Windows XP Professional" Then
Set objMoveComputer = objXPOU.MoveHere("LDAP://" & strDN, vbNullString)
End If
End If
' Move to the next computer object.

' Clean up.
Set objRootDSE = Nothing
Set objCommand = Nothing
Set objConnection = Nothing
Set objRecordSet = Nothing
Set objW2kOU = Nothing
Set objXPOU = Nothing
  • 3
1 Solution
I think its because you forced strDN and strOU to be lower case using LCASE and when you are doing the INSTR function
you are comparing it to a string that has uppercase letters
ooops there is no strOU
meant to say strDN and strOS
I'm pretty sure that was it.
I can't see any other problems with your script.

It fails for me as well, until I change the INSTR comparison to be lower case
How should that INSTR syntax look when forced to lowercase?
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Cloud Class® Course: C++ 11 Fundamentals

This course will introduce you to C++ 11 and teach you about syntax fundamentals.

  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now