Introduction to Do…Loop Until
‘Best Practice’ dictates that we should take steps to control errors. Another reason for error handling is that it saves time troubleshooting when you can narrow down the problem to one section of the script. In practice you have three, choices, write a statement that says ignore errors and carry on processing, allow errors to surface naturally, or add error handling statements (best), which will give you valuable information on where in the script the error is arising.
I would like to introduce you to the family of Do …Loop commands
Do…Loop Until and its ‘brother’, Do…Until Loop
Do…Loop While and its ‘sister’, Do…While Loop
The job of this family is to cycle through repetitive tasks like adding users from rows in spreadsheets or reading through hundreds of objects in Active Directory.
This Do…Loop family operates by going through line after line of commands, then circling back to the beginning and repeating commands for the next item.
The secret of avoiding endless loops is having an effective command to stop. To halt the loop, you have a choice of two prepositions: Until or While. Both ‘Loop Until’ and ‘Loop While’ achieve the same goal – breaking the cycle. However it is their attitude is that is different; ‘Do…Loop Until’, is adventurous, it keeps on going until stopped. On the other hand, ‘Do…Loop While’ is cautious, it only goes through the loop if the condition is met.
Another trade secret. I do not have the perfect Do…Loop example for Windows 2003. Instead I have two VBScripts, the first is ridiculously easy, but doesn’t do anything useful. The second example is powerful and interesting, but it is technically demanding.
Copy the VBScript below, then paste into notepad and save as a .vbs. Double click your .vbs file and see a message with the answer to the question: What is the sum of 1 to 7?
‘ VBScript Very simple Do… Loop Until
‘ Guy Thomas January 2004
DIM inti, intx
inti = 0
inti = inti + 1
intx = intx + inti
Loop Until inti = 7
WScript.Echo " Sum of 1 to " & inti & " = " & intx
Note 1: inti is the counter; while intx is keeping the score.
Note 2: With each loop, the script adds another number to the sequence 1+2+3+4+5+6+7
Note 3: Beware, as with all Loop scripts, they must have a break statement. Loop until inti = 7 is our command to break the loop.
Note 4: In the WScript.Echo statement I have added the two variables inti and intx. My reasoning is this, if you do change Line 13: Loop Until inti = 7 to Loop Until inti = 10, then you still get a meaningful message.
I like thePermissions Monitor because it enables me to see quickly WHO has permissions to do WHAT. When you launch this tool it analyzes a users effective NTFS permissions for a specific file or folder, takes into account network share access, then displays the results in a nifty desktop dashboard!
Think of all the frustration that this free utility saves when you are troubleshooting authorization problems for users access to a resource. Give this permissions monitor a try – it’s free!
- Warning this script will alter the users description.
- As usual, copy and paste into notepad and save as a .vbs. You will need a domain to get this script to work.
- You must change line 21 for the VBScript to work in your domain. Find then alter: ou=Worcester, dc=cp,dc=com. I also suggest that you create an OU and test user as necessary.
- Go to Active Directory Users and Computers, User, Property, then you will see what changes your script has made.
‘ Guy Thomas January 2004
‘ WARNING – I am not a great one for disclaimers, but
‘ watch out! This script WILL CHANGE your Users Properties
‘ Modifying the DESCRIPTION property of Multiple Users
‘ Note best to choose a test OU with a test user (To begin with)
‘ Check the User’s Property Tab : Description
DIM objConnection, objCommand, objRecordSet, objUser
DIM strChange, strADsPath, strProperty
strProperty = "Description"
strChange ="Hot Shot Professional"
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objCommand.ActiveConnection = objConnection
objCommand.CommandText = _
"<LDAP://ou=Worcester, dc=cp,dc=com>;" & _
"(&(objectCategory=person)(objectClass=user));" & _
Set objRecordSet = objCommand.Execute
strADsPath = objRecordset.Fields("ADsPath")
Set objUser = GetObject(strADsPath)
objUser.Put strProperty, strChange
Loop Until objRecordset.EOF
Wscript.Echo objRecordSet.RecordCount & _
" User accounts " & strProperty & " changed to " & strChange
Note 1: Sorry for repeating the warning, but this script will alter your users properties. However, I have chosen an harmless property = description.
Note 2: By introducing the variable strChange it makes it a little easier for you to edit the actual comment; it also makes it a lot easier to display what the script did in the message box.
Note 3: Here is my challenge to you; carefully select another User Property, then change the strProperty. Example strProperty = "Office"