johnnyjonathan
asked on
Cleanup AD using vbs
Hi,
I'm working to do an automated process that will move computers from a specific OU to another based on a set of rules.
The rules state that if a Computer is named XXX and the type of the OS is Windows XP then Move to ZZZ OU.
Thus creating a predetermined set of rules and run a schedule task.
Can it be done?
I'm working to do an automated process that will move computers from a specific OU to another based on a set of rules.
The rules state that if a Computer is named XXX and the type of the OS is Windows XP then Move to ZZZ OU.
Thus creating a predetermined set of rules and run a schedule task.
Can it be done?
ASKER
hi bluntTony, is there anyway i can also exclude specific computers from this filter with that script? it seemed to remove default machines in the ou that wern't suppose to be moved
You can add these machine names to a text file. Any machines listed in this file will be excluded from processing in the following script.
You now also have strFile to designate the path to the text file.
You now also have strFile to designate the path to the text file.
Set oRootDSE = GetObject("LDAP://RootDSE")
Set objConn = CreateObject("ADODB.Connection")
Set objComm = CreateObject("ADODB.Command")
Set objFso = CreateObject("Scripting.FileSystemObject")
Set objDict = CreateObject("Scripting.Dictionary")
Const ForReading = 1
objConn.Provider = "ADsDSOObject"
objConn.Open "Active Directory Provider"
Set objComm.ActiveConnection = objConn
objComm.Properties("Page Size") = 1000
strSearch = "XXXX" ' The string to search for in the computer name
strOS = "XP" ' The string to search for in Operating System
strFile = "c:\test.txt"
Set objOU = GetObject("LDAP://OU=someOU,DC=domain,DC=local") ' The OU to move the objects to
Set objTxt = objFso.OpenTextFile(strFile,ForReading)
While Not objTxt.AtEndOfStream
strLine = UCase(objTxt.ReadLine)
objDict.Add strLine, strLine
Wend
strBase = "<LDAP://" & oRootDSE.get("defaultNamingContext") & ">;"
strFilter = "(&(objectclass=computer)(cn=*" & strSearch & "*)(operatingSystem=*" & strOS & "*));"
strAttrs = "distinguishedName;"
strScope = "subtree"
objComm.CommandText = strBase & strFilter & strAttrs & strScope
Set objRS = objComm.Execute
If objRS.RecordCount > 0 Then
objRS.MoveFirst
Do Until objRS.EOF
Set objComp = GetObject("LDAP://" & Replace(objRS.Fields(0).Value,"/","\/"))
If Not objDict.Exists(UCase(objComp.cn)) Then
objOU.MoveHere objComp.distinguishedName, objComp.name
objRS.MoveNext
End If
Loop
End If
Set oRootDSE = Nothing
Set objConn = Nothing
Set objComm = Nothing
Set objOU = Nothing
Set objRS = Nothing
Set objComp = Nothing
Set objFso = Nothing
Set objTxt = Nothing
ASKER
thank you Tony, i see the OU to move the objects to but where is the original OU where it takes the computer names from?
is it LDAP://" & oRootDSE?
is it LDAP://" & oRootDSE?
Yes, at the moment, the base of the search is the top of the domain and the scope is 'subtree' which basically means look everywhere in your current domain.
If you want to narrow the search, change line 26 to to DN of the OU you want to look in e.g:
strBase = ";"
If you want to search all OUs beneath this one, leave line 29 as it is. If you want to search in just that OU, change line 29 to:
strScope = "onelevel"
Hope this helps!
If you want to narrow the search, change line 26 to to DN of the OU you want to look in e.g:
strBase = ";"
If you want to search all OUs beneath this one, leave line 29 as it is. If you want to search in just that OU, change line 29 to:
strScope = "onelevel"
Hope this helps!
ASKER
hi,
i get:
(39, 25) Active Directory: An invalid directory pathname was passed
i get:
(39, 25) Active Directory: An invalid directory pathname was passed
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
hi,
thanks for the changges but i still get:
(32, 1) Active Directory: An invalid directory pathname was passed
the only thing i'm changing is line 26
strBase = "<LDAP://" & oRootDSE.get("defaultNamin gContext") & ">;"
to
strBase = "<LDAP://OU=someOU,DC=doma in,DC=loca l & oRootDSE.get("defaultNamin gContext") & ">;"
of course with my OU's details.
same goes to line 17
thanks for the changges but i still get:
(32, 1) Active Directory: An invalid directory pathname was passed
the only thing i'm changing is line 26
strBase = "<LDAP://" & oRootDSE.get("defaultNamin
to
strBase = "<LDAP://OU=someOU,DC=doma
of course with my OU's details.
same goes to line 17
Sorry for the delay in replying. You need to remove the oRootDSE object completely. So line 26 should look like:
strBase = "<LDAP://OU=someOU,DC=domain ,DC=local>;"
This will mean that the search will start at this OU downwards.
strBase = "<LDAP://OU=someOU,DC=domain
This will mean that the search will start at this OU downwards.
ASKER
Hi Tony, no problem, i've done as you requested but now i get this error -
(39, 25) Active Directory: An invalid directory pathname was passed
but only sometimes, in other times, it works but i can't see any computers moving from an OU to OU?
(39, 25) Active Directory: An invalid directory pathname was passed
but only sometimes, in other times, it works but i can't see any computers moving from an OU to OU?
ASKER
I found a question that looks like mine with a solution running, however without a search for a naming based context -
http://www.experts-exchang
can we modify it to fit my requirements?
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Apologies - this one seemed to have slipped though my inbox.
Thanks for the catch, Chris.
Thanks for the catch, Chris.
ASKER
Works perfect!
thank you!
thank you!
Just change strOS, strSearch, and objOU to suit your needs (lines 9, 10 and 11)
You can schedule this vbs to run as a scheduled task if you wish. It currently has no feedback so runs silently.
Hope this helps...
Open in new window