使用WMI查找服务的依赖关系,然后将依赖的服务与依赖的驱动程序区分开来

时间:2011-05-26 06:20:46

标签: javascript service dependencies wmi drivers

MSDN上有一个代码示例,它使用WMI枚举特定服务的所有依赖项:http://msdn.microsoft.com/en-us/library/aa393673(v=vs.85).aspx

这很棒......但我发现它发现的依赖关系可能并非都是同一类型。我期望所有依赖项都是Win32_Service类型...但有时您会发现实际上是驱动程序的依赖项(Win32_SystemDriver)。

所以..我的问题很简单 - 我如何调整MSDN代码示例来检查每个依赖项,看看它是Win32_Service还是Win32_SystemDriver,这样我才能正确处理它?如果你在jscript中提供解决方案的额外点(MSDN上的示例是vbscript,但我使用的是jscript)。

2 个答案:

答案 0 :(得分:1)

Win32_DependentService关联类使用Win32_BaseService基类表示依赖服务。因此,如果您未在ASSOCIATORS OR查询中定义特定ResultClass(如Uroc's answer中所述),则会获得任何Win32_BaseService子类 - Win32_ServiceWin32_SystemDriver以及Win32_TerminalService

要以不同方式处理不同的对象类,可以使用Path_.Class属性检查对象的类名。以下是演示此方法的示例JScript代码:

var strComputer = ".";
var strServiceName = "RpcSs";

var oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!//" + strComputer + "/root/cimv2");

var colItems = oWMI.ExecQuery("ASSOCIATORS OF {Win32_Service.Name='" + strServiceName + "'} WHERE AssocClass=Win32_DependentService Role=Antecedent");
var enumItems = new Enumerator(colItems);

var oItem;
for ( ; !enumItems.atEnd(); enumItems.moveNext()) {
  oItem = enumItems.item();

  switch (oItem.Path_.Class) {
    case "Win32_Service":
      ...
      break;
    case "Win32_TerminalService":
      ...
      break;
    case "Win32_SystemDriver":
      ...
      break;
    default:
      // another class
      ...
      break;
  }
}

答案 1 :(得分:0)

尝试使用此查询:

{Win32_Service.Name =“dhcp”}的关联者其中AssocClass = Win32_DependentService ResultClass = Win32_SystemDriver

仅获取Win32_SystemDriver实例,或

{Win32_Service.Name =“dhcp”}的关联者,其中AssocClass = Win32_DependentService ResultClass = Win32_Service

只获取Win32_Service实例。