• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1236
  • 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
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
0
jarjarbinx1979
Asked:
jarjarbinx1979
  • 3
1 Solution
 
mdiglioCommented:
Hello,
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
0
 
mdiglioCommented:
ooops there is no strOU
meant to say strDN and strOS
0
 
mdiglioCommented:
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
0
 
SAIonlineCommented:
How should that INSTR syntax look when forced to lowercase?
0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

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