In my last article, I wrote about using VBScript to automate tasks. I
provided 2 working examples to get you started. In this article, I will write
about WMI and how it can be used to automate SQL Server operations.
What is WMI
WMI stands for Windows Management Instrumentation. It is Microsoft's
implementation of WBEM. No, WBEM is not your favorite radio station;-) It stands
for Web-Based Enterprise Management, an initiative to establish standards for
accessing and sharing management information over an enterprise network. WMI is
WBEM-compliant and provides integrated support for the Common Information Model
(CIM), the data model that describes the objects that exist in a management
environment. You will see CIM in the code example below.
WMI provides fully integrated operating system support for your system and
applications management. It gives you a consistent and richly descriptive model
for the configuration, status, and operational aspects of Windows. Short of
doing dishes and vacuuming carpet for you, it can do pretty much anything else:
computer management (devices, drivers, ports, reboot), managing files and
folders, logs, monitoring, networking, printing, to name just a few. Because SQL
Server is so tightly integrated with Windows, it helps a lot to add WMI
scripting to your skill repertoire.
WMI is tightly integrated with VBScript. Although you can also use Visual C++
to work with it, you will see most of examples available on the web using
VBScript.
Example 1: Script to reboot a server
Many of us do a lot of work during database maintenance window, like checking
database integrity, backup, cleanup, etc. Whenever possible, you should always
reboot the server. However, our maintenance window usually appears on nights or
weekends, not exactly the time that you want come in and push the power button.
Using the following VB/WMI script, you can schedule a reboot at the time of
your choosing. The code should be self-explanatory. For rebooting a local
computer, define "." as the computer name. Replace "." with the computer name if
you want to reboot a remote computer.
'Customize code here. Replace . with a computer name to reboot a remote server
'that you have access to. To reboot the local machine, this code should work without
'any modification
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate,(Shutdown)}!\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery _
("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
ObjOperatingSystem.Reboot()
Next
Example 2: Script to list all server services
Ideally, you want to SQL Server to run on a box that is just meant for SQL
Server. Realistically, that does not happen very often. To get an inventory of
what you have on your server, you can use the following code sample to enumerate
services installed on your server. In the example, I used the Echo method to
display services. However, you might find it more useful to put that information
into a file. As an exercise for you, you can try to see if you could modify the
script and save service information into a file.
Hint: use Example 2 of my last article as a template for file output.
'Customize code here. Replace . with a computer name to enumerate services
'on a remote server that you have access to. To work on the local machine,
'this code should work without any modification
strComputer = "."
Set objServices = GetObject("winmgmts:\\" & strComputer)
Set objObjectSet = objServices.InstancesOf("Win32_Service")
For Each wbemObject In objObjectSet
WScript.Echo "Display Name: " & wbemObject.DisplayName & vbCrLf & _
" State: " & wbemObject.State & vbCrLf & _
" Start Mode: " & wbemObject.StartMode
Next
Conclusion
Continuing the series I had last week, this article talks about how to use WMI
to automate SQL Server related tasks. When writing these series of articles, I
strive to use examples that are easy to follow, touch key aspects of the
technology, and provide a template for you to work on. Hopefully you are able to
learn something about WMI and put it into use.