IPAM will assist
you in managing IP addresses.
To let you into a secret, this utilities is fun to use, even if you
don't have a pressing need to calculate your IP address space.
Get a free evaluation copy of
Orion IPAM
Is your server running slowly? Check with SolarWinds ipMonitor
Get a free evaluation copy of ipMonitor
Contents of Guy's Scripting Ezine 18 - Carriage Returns
When ever I get an email with complaints it really hurts me. When I recover from the criticism I want to learn from what the person is saying, so I ask myself, 'Is this fair comment? Or is it just some
nutter writing in?' Well in the case of those who asked for friendlier printer pages in my ebooks, clearly, our poll results show that you represent what the majority want.
52% Said that printing was invaluable for ebooks.
33% Use printing now and again.
15% Rarely or never used printing.
I am truly grateful for you comments and will endeavour to make
all future ebooks printer friendly. A bigger company than mine would have
appointed a marketing manager. They would have spent thousands of dollars to
tell me what you told me in a minute, I thank all those readers for taking that
minute to vote.
Scripts are nothing more than a series of instructions. The VBScript engine needs to know when an instruction ends or when the second half of the instruction continues on then next line.
Early in your VBScript career you may have thought an underscore _
At the end of a line was a dead insect that had crawled on to the page! If you
just copy and paste the code, then you may have dismissed these underscores as
of no consequence, when in fact they are key to the flow of your script.
When you start writing your own scripts, then you really need to understand how to handle carriage returns. There are two key facts, firstly there has to be a limit of characters per line – often 80.
Secondly there must be a way of telling the script engine that you have not yet reached the end of a line. Without a word-wrap instruction (_), VBScript would try and interpret every line as a separate
statement. The result would be nonsense. If you try and place a normal carriage return at the end of the first line, the scripting engine thinks you now have two lines. The most likely outcome is a WSH error
code 800A0401 or 409
The answer to the word-wrap problem lies in ending the first line with an underscore _
then continue the command on the next line.
Concatenate with ampersand
Concatenate and ampersand are not words you are likely to slip into everyday
conversation, however they are vital for the smooth running of your scripts.
This weeks learning points are the use of _ (underscore) and & (ampersand) to
control carriage returns in the main body of your script. In the case of
WSCript.Echo commands you can employ additional commands, VBCr (carriage return)
and VBTab (to align multiple lines).
The purpose of Example1, is to enumerate and then display all the computer objects
in your domain. (Remember to change dc=cp to reflect your domain name).
Copy the VBScript below, then paste into notepad. Crucial point, to get my script to work in your domain, change this line to
reflect your Active Directory name:
& 'LDAP:// DC=cp, DC=com'"
_
Now you are ready to save the file with .vbs extension, for example,
computers.vbs.
Double click your computers.vbs file and see all machines in your Active Directory.
' Computers.vbs ' Example VBScript to display the Computer Objects in your domain
' Guy Thomas February 2004.
' ******************************
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.CommandText = _
"Select Name, operatingSystemVersion from 'LDAP://dc=cp, dc=com'" _
& " where objectClass='computer' "
objCommand.Properties("Page Size") = 500
objCommand.Properties("Timeout") = 20
objCommand.Properties("Cache Results") = False
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
Wscript.Echo "Computer: " & objRecordSet.Fields("Name").Value & VbCr _
& "Version: " & objRecordSet.Fields("operatingSystemVersion").Value
objRecordSet.MoveNext
Loop
' End of example VBScript
Learning points
1) Making carriage returns in the script itself.
"Select Name, operatingSystemVersion from 'LDAP://dc=cp, dc=com'" _
& " where objectClass='computer' "
The above two lines are responsible for extracting all the computer from your
Active Directory. Because they do not comfortably fit on one line, we need a
carriage return - THAT VBSCRIPT UNDERSTANDS. Were you to use the normal
word processing 'enter', VBScript would interpret the above as two separate
statements. So, that is why we need and _ at the end of the first line. If you are in doubt, try running the script with
the command all on one line.
"Select Name, operatingSystemVersion from 'LDAP://dc=cp, dc=com'"
& " where objectClass='computer' "
2) Controlling WScript.Echo messages
WScript.Echo "Computer: " & objRecordSet.Fields("Name").Value
& VbCr _
& "Version: " & objRecordSet.Fields("operatingSystemVersion").Value
In the above two lines, I have combined two ideas. Firstly, I wan to make the script believe this is just one instruction - not two. Secondly, I want the output to be in one box and not two.
As with the previous learning point, _ and & enable us to break the line for
presentation purposes. Turning our attention to the output -
& VBCr makes a line break WITHIN THE MESSAGE
BOX.
When you have a long statement, finish the first line with _
and thus join the two lines into on clear statement. Be clear that VbCr is purely to make the output clearer. Whilst the underscore is essential for the script to execute, VbCr is merely a cosmetic device to
make the messages easier to read.
Guy Challenges.
1) Remove & VbCr from line beginning
WSCript.Echo. See how the ComputerName and version run into one another
and are all on the same line.
2) Introduce a filter which only display XP machines. What you need to do
is add an extra line, find then change:
"Select Name, operatingSystemVersion from 'LDAP://dc=cp, dc=com'" _
& " where objectClass='computer' "
To:
"Select Name, operatingSystemVersion from 'LDAP://dc=cp, dc=com'" _
& " where objectClass='computer' " _
& " and operatingSystemVersion = '5.1 (2600)'"
Note the addition of the _ in the middle line, and the & on the third line.
If you have Windows 2000 machines, substitute '5.0 (2195)' for '5.1 (2600)'
3) If you are getting too much output you could try different filtering by
altering 'LDAP://dc=cp, dc=com' to 'LDAP://cn=computers, dc=cp,
dc=com'
What this does is display all the machines specifically in the Computers
folder in Active Directory User's and Computers. If you prefer to
specify an OU the command is OU=MyOrgUnit. Note cn=MyOrgUnit will not work.
I would like to thank C.K. for sending in the original script.
Note: Remember to find and change this line:
'LDAP://DC=cp,DC=com' "_
Note: The filename is Computernames.txt
' VBScript to extract Computer Objects and save to a text file in C:\
' Guy Thomas February 2004. With credit to CK.
' ******************************
Const ADS_SCOPE_SUBTREE = 2
Dim objOU
Dim objFileSystem
Dim objComputer
Dim objFileLocation
objFileLocation = "C:\computernames.txt"
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
Set objComputer = objFileSystem.createTextFile("objFileLocation", TRUE)
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.CommandText = "SELECT Name FROM " _ &" 'LDAP://DC=cp,DC=com' "_
& "WHERE objectClass='computer'"
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Timeout") = 30
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
objCommand.Properties("Cache Results") = False
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
objComputer.WriteLine objRecordset.Fields(0).Value
objRecordSet.MoveNext
Loop
Wscript.Echo "Computer names saved to this path: " & objFileLocation'
' End of example VBScript
Learning Point - attention to detail.
Consider the following statement:
objCommand.CommandText = "SELECT Name FROM 'LDAP://DC=cp,DC=com' "_
Here is how I dissected the line and got it to work:
objCommand.CommandText = "SELECT Name FROM
" _ & " 'LDAP://DC=cp,DC=com' "
Here is a tiny difference, lack of " " and it fails
objCommand.CommandText = "SELECT Name FROM _
& 'LDAP://DC=cp,DC=com' "_
Const ADS_SCOPE_SUBTREE = 2 this tell the script to drill down two level from
the root of Active Directory, in other works to search OUs and subOUs for any
computer objects.
Punctuation makes or breaks writing. Once you start placing judicious
commas, the reader is able to make sense of your prose. So it is with
scripting, VBScript requires special characters to to tell the interpreter that
it has reached the end of a line. Take the time to understand _
(underscore) and especially: & (ampersand).
Their topics and material are ideal for getting you started with VBScript. The
videos are easy to follow and you can control the pace. Try their free demo material and then see if you want to buy the full package.
See more about VB Script Training CD.
|