Share via


Lesson 5: Using WMI Query Language to Find Specific Information

In the WMI SDK, a method called ExecQuery exists for the C++ Provider object, the COM+ IWbemServices object, and the scripting SWbemServices object. You can use this method to query a data store, such as the metabase, just as you can query a SQL or Access database. The query string uses the WMI Query Language (WQL) as explained in the WMI SDK under WMI Development Environment, WMI Query Language. Read the first three documents which guide you through building a query string in WQL, and then read the section on Data Queries. The following code example uses the SELECT statement to enumerate all the services on your server.

vbscript
for each item in GetObject("winmgmts://MyMachine").ExecQuery("select * from win32_service" )
  WScript.Echo item.name
next
jscript
var e = new Enumerator(GetObject("winmgmts://MyMachine").ExecQuery("select * from win32_service" ));
for(; ! e.atEnd(); e.moveNext())
{
x = e.item();
WScript.Echo(x.Name);
}

You can do the same thing for objects in the IIS WMI provider. The following code sample enumerates all the instances of objects on your server that belong to the CIM_Setting class.

vbscript
for each item in GetObject("winmgmts://MyMachine/root/MicrosoftIISv2").ExecQuery("select * from CIM_Setting" )
  WScript.Echo item.name
next
jscript
var e = new Enumerator(GetObject("winmgmts://MyMachine/root/MicrosoftIISv2").ExecQuery("select * from CIM_Setting" ));
for(; ! e.atEnd(); e.moveNext())
{
x = e.item();
WScript.Echo(x.Name);
}

With the addition of a little extra code, you can print out all the properties in each of the instances. The on error resume next command is used because some properties are arrays of objects and need more specialized code to print them out.

vbscript
  on error resume next
for each item in GetObject("winmgmts://MyMachine/root/MicrosoftIISv2").ExecQuery("select * from CIM_Setting" )
  WScript.Echo item.name
  for each propSet in item.Properties_WScript.Echo " " & propSet.Name & " = " & propSet.Valuenext
next
jscript
var e = new Enumerator(GetObject("winmgmts://MyMachine/root/MicrosoftIISv2").ExecQuery("select * from CIM_Setting" ));
for(; ! e.atEnd(); e.moveNext())
{
  x = e.item();
  WScript.Echo(x.Name);
  var f = new Enumerator(x.Properties_)for(; ! f.atEnd(); f.moveNext()) {propSet = f.item();WScript.Echo(" " + propSet.Name + " = " + propSet.Value);}
}

Sometimes a server administrator wants to find an instance of an object with a property that has a specific value. For example, to determine which virtual directories have pooled applications, use the following code.

vbscript
for each item in GetObject("winmgmts://MyMachine/root/MicrosoftIISv2").ExecQuery("SELECT * FROM IIsWebVirtualDir WHERE AppIsolated = 2" )
WScript.Echo item.name
next
jscript
var e = new Enumerator(GetObject("winmgmts://MyMachine/root/MicrosoftIISv2").ExecQuery("SELECT * FROM IIsWebVirtualDir WHERE AppIsolated = 2" ));
for(; ! e.atEnd(); e.moveNext())
{
  x = e.item();
  WScript.Echo(x.Name);
}