第 6 课:使用关联以查找配置数据库元素

第 3 课:从 IIS 配置数据库来组织数据中所描述,IIS Windows Management Instrumentation (WMI) 提供程序中有两个关联类:CIM_Component 类和 CIM_ElementSetting 类。通常,用户不创建关联类的实例,而是创建常规类(如 IIsWebServer 类)的实例,然后请求关联的类的实例。例如,服务器管理员可以用下面的代码来枚举包含在服务器上另一个虚拟目录中的所有虚拟目录。

VBScript
Const wbemFlagReturnImmediately = &H10 ' 使调用立即返回值。
Const wbemFlagForwardOnly = &H20 ' 使仅转发枚举器返回(更快)。
' 建立与 WMI、MyMachine 上的 IIS 名称空间的连接。
set locatorObj = CreateObject("WbemScripting.SWbemLocator")
set providerObj = locatorObj.ConnectServer("MyMachine", "root/MicrosoftIISv2")
' 执行查询,将结果放到 SWbemObjectSet 对象中。
strQuery = "ASSOCIATORS OF {IIsWebVirtualDir='W3SVC/1/Root'}"
set vdirsCol = providerObj.ExecQuery(strQuery, , (wbemFlagReturnImmediately OR wbemFlagForwardOnly))
' 报告结果。
For Each vdirObj in vdirsCol
WScript.Echo "Object: " & vdirObj.Name
Next
JScript
// 建立与 WMI、MyMachine 上的 IIS 名称空间的连接。
var locatorObj = new ActiveXObject("WbemScripting.SWbemLocator");
var providerObj =  
locatorObj.ConnectServer("janetfi-32", "root/MicrosoftIISv2"); // 执行查询,将结果放到 SWbemObjectvar 对象中。
a  SWbemObjectvar object. strQuery=  "ASSOCIATORS OF {IIsWebVirtualDir = 'W3SVC/1/Root'}";
var vdirsCol = providerObj.ExecQuery(strQuery);
// 报告结果。
var e = new Enumerator(vdirsCol)
for(; ! e.atEnd(); e.moveNext())
{
vdirObj = e.item();
WScript.Echo("Object: " + vdirObj.Name);
}

使用 ASSOCIATORS OF 语句的数据查询将返回 SWbemObjectSet 对象,该对象是 SWbemObjects 的集合。要打印出属性,请使用 SWbemObjectProperties_ 属性,如下面的代码示例所示。

VBScript
Const wbemFlagReturnImmediately = &H10 ' 使调用立即返回值。
Const wbemFlagForwardOnly = &H20 ' 使仅转发枚举器返回(更快)。
' 建立与 WMI、MyMachine 上的 IIS 名称空间的连接。
set locatorObj = CreateObject("WbemScripting.SWbemLocator")
set providerObj = locatorObj.ConnectServer("MyMachine", "root/MicrosoftIISv2")
' 执行查询,将结果放到 SWbemObjectSet 对象中。
strQuery = "ASSOCIATORS OF {IIsWebVirtualDir='W3SVC/1/Root'}"
set vdirsCol = providerObj.ExecQuery(strQuery, , (wbemFlagReturnImmediately OR wbemFlagForwardOnly))
' 报告结果。
For Each vdirObj in vdirsCol
WScript.Echo "Object: " & vdirObj.Name
For Each propSet in vdirObj.Properties_WScript.Echo " " & propSet.Name & " = " & propSet.ValueNext
Next
JScript
// 建立与 WMI、MyMachine 上的 IIS 名称空间的连接。
var locatorObj = new ActiveXObject("WbemScripting.SWbemLocator");
var providerObj = locatorObj.ConnectServer("janetfi-32", "root/MicrosoftIISv2");
// 执行查询,将结果放到 SWbemObjectvar 对象中。
strQuery = "ASSOCIATORS OF {IIsWebVirtualDir='W3SVC/1/Root'} WHERE ResultClass = IIsWebVirtualDir ResultRole = PartComponent";
var vdirsCol = providerObj.ExecQuery(strQuery);
// 报告结果。
var e = new Enumerator(vdirsCol)
for(; ! e.atEnd(); e.moveNext())
{
vdirObj = e.item();
WScript.Echo("Object: " + vdirObj.Name);
var f = new Enumerator(vdirObj.Properties_)for(; ! f.atEnd(); f.moveNext()) {propvar = f.item();WScript.Echo(" " + propvar.Name + " = " + propvar.Value);}
}

前面的代码示例使用了下面的基本查询字符串:

"ASSOCIATORS OF {IIsWebVirtualDir='W3SVC/1/Root'}"

该查询将返回 W3SVC/1/Root 下的所有虚拟目录,包括 W3SVC/1/Root、父级 W3SVC/1,以及所有可能的子目录。通常,服务器管理员需要通过使用关联类的属性来限制它们的查询。CIM_Component 关联类的每个元素类都有两个属性:PartComponent(关联的子成员),以及 GroupComponent(关联类的父成员)。例如,在 IIsWebVirtualDir_IIsWebDirectory 元素类的包含关联中,CIM_ManagedSystemElement 类的 IIsWebVirtualDir 元素是 GroupComponent,而 CIM_ManagedSystemElement 类的 IIsWebDirectory 元素是 PartComponent。这种关系在 CIM Studio 中可以看得很清楚,方法是,当查看 CIM_Component 关联类的 IIsWebVirtualDir_IIsWebDirectory 元素类时单击“Associations”选项卡。

上述代码示例中使用的查询的结果可以通过使用下面的可能的查询字符串改变。

有关如何为 ASSOCIATORS OF 语句构建查询字符串的详细信息,请参阅 WMI Development EnvironmentWMI Query LanguageData QueriesASSOCIATORS OF Statement 下的 WMI SDK。在该文档中有如下方便的语法:

ASSOCIATORS OF {ObjectPath} WHERE
AssocClass = AssocClassName
ClassDefsOnly
RequiredAssocQualifier = QualifierName
RequiredQualifier = QualifierName
ResultClass = ClassName
ResultRole = PropertyName
Role = PropertyName

© 1997-2003 Microsoft Corporation。保留所有权利