2 votes

Utiliser WMI pour trouver les dépendances d'un service et différencier les services dépendants des pilotes dépendants.

Il existe un exemple de code sur MSDN qui utilise WMI pour énumérer toutes les dépendances d'un service particulier : http://msdn.microsoft.com/en-us/library/aa393673(v=vs.85).aspx

C'est très bien... mais j'ai découvert que les dépendances qu'il découvre peuvent ne pas être toutes du même type. Je m'attendais à ce que toutes les dépendances soient de type Win32_Service... mais il arrive parfois qu'une dépendance soit en fait un pilote (Win32_SystemDriver).

Ma question est donc simple : comment puis-je adapter l'exemple de code MSDN pour effectuer une vérification sur chaque dépendance et voir s'il s'agit d'un Win32_Service ou d'un Win32_SystemDriver afin de pouvoir le gérer de manière appropriée ? Des points supplémentaires si vous fournissez la solution en jscript (l'exemple sur MSDN est en vbscript, mais j'utilise jscript).

1voto

Helen Points 13822

Les Win32_DependentService représente les services dépendants à l'aide de la classe d'association Win32_BaseService classe de base. Ainsi, si vous ne définissez pas de ClasseRésultat dans votre ASSOCIATORS OR (comme dans Réponse de l'Uroc ), vous obtiendrez n'importe quel Win32_BaseService sous-classes - Win32_Service , Win32_SystemDriver ainsi que Win32_TerminalService .

Pour traiter différemment les différentes classes d'objets, vous pouvez vérifier le nom de la classe de l'objet à l'aide de la fonction Path_.Class propriété. Voici un exemple de code JScript qui illustre cette approche :

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;
  }
}

0voto

Essayez d'utiliser cette requête :

Associateurs de {Win32_Service.Name="dhcp"} Where AssocClass=Win32_DependentService ResultClass=Win32_SystemDriver

pour obtenir uniquement les instances de Win32_SystemDriver, ou

Associateurs de {Win32_Service.Name="dhcp"} Where AssocClass=Win32_DependentService ResultClass=Win32_Service

pour obtenir uniquement les instances de Win32_Service.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X