Link to home
Start Free TrialLog in
Avatar of jarjarbinx1979
jarjarbinx1979Flag for United Kingdom of Great Britain and Northern Ireland

asked on

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
JJB

=============================
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.
objRecordSet.MoveNext
Loop

' Clean up.
Set objRootDSE = Nothing
Set objCommand = Nothing
Set objConnection = Nothing
Set objRecordSet = Nothing
Set objW2kOU = Nothing
Set objXPOU = Nothing
ASKER CERTIFIED SOLUTION
Avatar of mdiglio
mdiglio
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
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?