The below VBS script will run a command on all computers in the Active Directory OU defined by LDAPPath =
The script depends on the Windows Sysinternals tool PsExec, you will need to download and exact PsExec and place in in the same folder as the script.
In this case I am using the script and PsExec to run the command “IPConfig /flushdns” on all computers in the my “Servers” OU, the script could easily be adapted to to run something different.
Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8
Const ADS_SCOPE_SUBTREE = 2
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
Set objShell = CreateObject("WScript.Shell")
LDAPPath = "OU=Servers,DC=domain,DC=co,DC=uk"
tmpDate = date
tmpTime = time
startDate = Replace(tmpDate, "/", "-")
startTime = Replace(tmpTime, ":", "-")
currentScriptPath = Replace(WScript.ScriptFullName, WScript.ScriptName, "")
LogPath = currentScriptPath & "FlushDNS " & startDate & " " & startTime & " " & userName & ".log"
strMbox = MsgBox("Are you sure you want to flush DNS on all computers under " & LDAPPath ,4,"Are you sure?")
if strMbox = 6 Then
OutputLog "IPConfig /flushdns for all computers under an OU", 1, false
OutputLog "=======================================", 1, false
OutputLog "Started: " & " " & tmpData & " at " & tmpTime, 1, false
OutputLog "=======================================", 1, false
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
OutputLog "OU to Process :: " & LDAPPath, 1, true
Set objCOmmand.ActiveConnection = objConnection
objCommand.CommandText = _
"Select Name from '" & LDAPPath & "' Where objectCategory='computer' ORDER BY Name"
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
OutputLog "Started on :: " & objRecordSet.Fields("Name").Value, 2, false
objShell.Run "PsExec.exe \\" & objRecordSet.Fields("Name").Value & " -e ipconfig /flushdns", 0, true
objRecordSet.MoveNext
Loop
tmpDate = date
tmpTime = time
startDate = Replace(tmpDate, "/", "-")
startTime = Replace(tmpTime, ":", "-")
OutputLog "=======================================", 1, true
OutputLog "Complete: " & tmpData & " at " & tmpTime, 1, false
OutputLog "=======================================", 1, false
wscript.echo "Complete"
else
'User clicked no
MsgBox "FlushDNS cancelled"
End if
Sub OutputLog (LogLine, intLevel, startNewLine)
strSpaces = ""
strStartNewLine = ""
If objFSO.FileExists(LogPath) then
Set objLogFile = objFSO.OpenTextFile(LogPath, ForAppending)
Else
Set objLogFile = objFSO.CreateTextFile(LogPath)
End if
if intLevel = 1 then
strSpaces = ""
Elseif intLevel = 2 then
strSpaces = chr(9)
Elseif intLevel = 3 then
strSpaces = chr(9) & chr(9)
Elseif intLevel = 4 then
strSpaces = chr(9) & chr(9) & chr(9)
Else
strSpaces = ""
End if
if startNewLine = TRUE then
strStartNewLine = chr(13) & chr(10)
End if
objLogFile.Write(strStartNewLine & strSpaces & LogLine & chr(13) & chr(10))
objLogFile.Close
End Sub
Nice one, great work !