Contents for Guy's Scripting Ezine 48 - WMI Explained
I now believe that poetry is the highest form of writing. It was
not always so. As a teenager, my gang thought that poetry was only for wimps.
(Only we used an even less politically correct word for wimps.) I'll let you into a
secret, I would now love to be able to write effective, memorable poetry.
'What has poetry got do with scripting?', I can hear you asking, The
answer is that both scripting and poetry place a premium on choosing each
word carefully. The result is that in a VBScript, as with a poem, every phrase expresses just the
right shade of meaning. Let us take 'GetObject' as an example from this week's
script. FetchObject would not be understood by the VBScript engine, while
CreateObject is not what I wish to achieve with my NetworkConnection. We must employ the
correct word, GetObject, so that VBScript knows how to processes our
instructions precisely.
This Week's MissionMy mission this week is to explain the WMI (Windows Management Interface)
syntax. Here below are two 'Set...' statements which will act as examples
for us to explore the meaning of each power-packed WMI word.
Set objWMIService = GetObject("winmgmts:\\" & strComputer & _
"\root\cimv2")
Set colItems = objWMIService.ExecQuery _
("Select * from Win32_NetworkConnection",,48)
If the above statements seem incomprehensible at first, do not worry, the
mist will clear and you will discover a valuable scripting technique.
In a nutshell, WMI gives us a method to see what the operating system is
doing. Moreover, WMI provides 'handles' to persuade Windows 2003
or XP to return information in a form that we can use to our advantage.
This week's WMI example will uncover information about the network
card (NIC). If fact, I amended this script from a project to inform
users when their wireless connection was down. Yes, even wireless
connections have a network card.
The WMI script works at 4 levels,
- Just a script to interrogate the network cards(s).
- An opportunity to examine each word of a WMI statement. See
comprehensive Learning Points below the script.
- Using Win32_NetworkAdapter as but one examples of many WMI objects.
To see other objects, for example Win32_NetworkConnection, then
check out scriptomatic
- For the final level, instead of creating the VBScript with WMI
instructions yourself, you buy off the shelf tools to analyze your
computer network for you. See here:
Tools4Ever
Instructions
- Copy and paste the script below into notepad.
- Save the file with .vbs extension e.g. NIC.vbs.
- Double click and examine the message box.
' Set NIC.vbs
' VBScript to check your network connection.
' Author Guy Thomas
http:// computerperformance.co.uk/
' Version 4.9 - October 3th 2004
' --------------------------------------------------------------'
Option Explicit
Dim objWMIService, ObjItem
Dim GuyMessage, strComputer, colItems
'On Error Resume Next
strComputer = "."
' These Set commands are important.
' See Learning Points after / below the script
Set objWMIService = GetObject("winmgmts:\\" & strComputer _
& "\root\cimv2")
Set colItems = objWMIService.ExecQuery _
("Select * from Win32_NetworkAdapter",,48)
For Each objItem in colItems
If objItem.MACAddress <> "" Then
' Remove objItem's that you do not want.
WScript.Echo "Name: " & objItem.Name & vbCRLf & _
"Net Connection ID: " & objItem.NetConnectionID & vbCRLf & _
"Net Connection Status: " & objItem.NetConnectionStatus & vbCRLf & _
"Adapter Type: " & objItem.AdapterType & vbCRLf & _
"MAC Address: " & objItem.MACAddress & vbCRLf & _
"Availability: " & objItem.Availability & vbCRLf & _
"" & vbCRLf & _
"Computer Name: " & objItem.SystemName & vbCRLf & _
"AutoSense: " & objItem.AutoSense & vbCRLf & _
"ManagerErrorCode: " & objItem.ConfigManagerErrorCode & vbCRLf & _
"ManagerUserConfig: " & objItem.ConfigManagerUserConfig & vbCRLf & _
"DeviceID: " & objItem.DeviceID & vbCRLf & _
"ErrorCleared: " & objItem.ErrorCleared & vbCRLf & _
"ErrorDescription: " & objItem.ErrorDescription & vbCRLf & _
"Index: " & objItem.Index & vbCRLf & _
"InterfaceIndex: " & objItem.InterfaceIndex & vbCRLf & _
"LastErrorCode: " & objItem.LastErrorCode & vbCRLf & _
"Manufacturer: " & objItem.Manufacturer & vbCRLf & _
"MaxNumberControlled: " & objItem.MaxNumberControlled & vbCRLf & _
"MaxSpeed: " & objItem.MaxSpeed & vbCRLf & _
"NetworkAddresses: " & objItem.NetworkAddresses & vbCRLf & _
"PermanentAddress: " & objItem.PermanentAddress & vbCRLf & _
"PNPDeviceID: " & objItem.PNPDeviceID & vbCRLf & _
"Power Mngmnt: " & objItem.PowerManagementCapabilities & vbCRLf & _
"Power Supported: " & objItem.PowerManagementSupported & vbCRLf & _
"ServiceName: " & objItem.ServiceName & vbCRLf & _
"Speed: " & objItem.Speed & vbCRLf & _
"Status: " & objItem.Status & vbCRLf & _
"StatusInfo: " & objItem.StatusInfo & vbCRLf & _
"CreationClassName: " & objItem.CreationClassName & vbCRLf & _
"TimeOfLastReset: " & objItem.TimeOfLastReset & vbCRLf & _
""
End IF
Next
WScript.Quit
' End of example VBScript
Note 1: SetObjWMIService is a name that I chose for the variable,
almost all the rest of the terms are defined by WMI or VBScript.
Note 2: GetObject( This is the command to extract the
information from the Network Card. On other occasions it could be
CreateObject(.
Note 3: "Winmgmts:\\" This tells the script to connect to the
Windows Management Interface, not to the File System or to Excel.
Note 4: & strComputer _& "\root\cimv2") This
defines the
precise area of WMI to connect. In fact, it means connect to the root of
the computer specified by strComputer. Looking further back we see this
is "." meaning "This computer".
So put it all together and the statement says, "Connect to the WMI root of the
computer where the script is run".
Note 5: Set colItems. In this context colItems means a
collation or collection of items. (I used to think it meant columns - wrong!)
Note 6: objWMIService.ExecQuery. Perhaps you had forgotten
about that first variable? Well this is where we query objWMIService.
Note 7: Select * from. In this context, * (star) means all. This phrase is well know from SQL or other
database query languages. In certain circumstances you could amend the * and so filter data and return the subset that we are interested in.
Note 8: Study Win32_NetworkAdapter carefully. With help from
VBsEdit you could substitute a whole host of other operating system objects,
all beginning with WIN32_, for example: WIN32_processor, eventlog, registry.
Note 9: ,,48 Confession, I have no idea what this means,
I just leave it be. However! JT, kindly provided this information
to enlighten me (us).
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/wbemflagenum.asp
Note 10: objItem.xxxxx this is the interesting part where you
can select which properties of the NetworkAdapter that you wish to display. For much more on WMI,
see my WMI Section here.
WMI provides fabulous hooks and tentacles to extract information about all
aspects of the operating system. In this week's example we dissect the
command which interrogate the network adapter, however you can adapt this
method to enquire about virtually any aspect of the operating system.
For example, memory, disk or eventlog. To help you research other WMI
objects then check out scriptomatic
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.
|