Используйте WMI, чтобы найти зависимости службы, а затем дифференцировать зависимые службы от зависимых драйверов - PullRequest
2 голосов
/ 26 мая 2011

В 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 ]

1 голос
/ 31 мая 2011

Класс ассоциации Win32_DependentService представляет зависимые службы с использованием базового класса Win32_BaseService. Таким образом, если вы не определите конкретный ResultClass в своем ASSOCIATORS OR запросе (как в ответе Урока ), вы получите любые Win32_BaseService подклассы - Win32_Service, Win32_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;
  }
}
0 голосов
/ 27 мая 2011

Попробуйте использовать этот запрос:

Ассоциации {Win32_Service.Name = "dhcp"}, где AssocClass = Win32_DependentService ResultClass = Win32_SystemDriver

для получения только экземпляров Win32_SystemDriver или

Ассоциаторы {Win32_Service.Name = "dhcp"}, где AssocClass = Win32_DependentService ResultClass = Win32_Service

, чтобы получить только экземпляры Win32_Service.

...