Appel d’une méthode WMI

WMI fournit des méthodes dans l’API COM et l’API de script pour obtenir des informations ou manipuler des objets dans un système d’entreprise. Par exemple, la méthode de script WMI SWbemServices.ExecQuery interroge les données. Les fournisseurs ont également des méthodes définies dans les classes qu’ils inscrivent. Voici les Win32_LogicalDisk méthodes Chkdsk et ScheduleAutoChk fournies par le fournisseur Win32.

Les sections suivantes sont abordées dans cette rubrique :

Méthodes WMI par rapport aux méthodes de fournisseur

En utilisant des appels de méthode WMI combinés avec des appels de méthode de fournisseur , vous pouvez récupérer et manipuler des informations sur votre entreprise. Pour plus d’informations, consultez Appel d’une méthode WMI et appel d’une méthode fournisseur.

Les méthodes de l’objet de script WMI SWbemObject ont un état spécial, car elles peuvent s’appliquer à n’importe quelle classe de données WMI. Pour plus d’informations, consultez Scripting avec SWbemObject.

L’exemple de code suivant appelle les méthodes WMI et provider.

Les méthodes WMI et fournisseur suivantes se trouvent dans l’API Scripting pour WMI :

Vous pouvez rechercher le code qui peut apparaître dans « Retour » dans la section Codes de retour pour Win32_Service.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colServices = objWMIService.ExecQuery ("Select * from Win32_Service where Name='Alerter'")
For Each objService in colServices
    Return = objService.StopService()
    If Return <> 0 Then
        Wscript.Echo "Failed " &VBNewLine & "Error code = " & Return 
    Else
       WScript.Echo "Succeeded"
    End If
Next

$colServices= Get-WmiObject -Class Win32_Service -Filter 'Name = &quot;Alerter&quot;'
foreach ($objService in $colServices)
{
    $objService.StopService()
}

modes Method-Calling dans WMI

Le mode d’appel semi-synchronisé fournit généralement le meilleur équilibre entre la sécurité et les performances.

Pour plus d’informations sur chacun des modes possibles, consultez les rubriques suivantes :

Mode synchrone

Le mode synchrone se produit lorsque le programme ou les scripts s’interrompt jusqu’à ce que l’appel de méthode retourne un objet de collection SWbemObjectSet . WMI génère cette collection en mémoire avant de renvoyer l’objet de collection au programme ou au script appelant.

Le mode synchrone peut avoir un effet négatif sur les performances du programme ou du script sur l’ordinateur exécutant le programme ou le script. Par exemple, la récupération synchrone de milliers d’événements à partir du journal des événements peut prendre beaucoup de temps et utiliser beaucoup de mémoire, car WMI crée un objet à partir de chaque événement, puis place ces objets dans une collection avant de passer la collection à la méthode.

Vous devez uniquement appeler des méthodes qui ne retournent pas de jeux de données volumineux en mode synchrone. Les méthodes SWbemServices suivantes peuvent être appelées en toute sécurité en mode synchrone :

Toutes les méthodes SWbemServices sans mot, « Async » dans le nom peuvent être appelées en mode synchrone en définissant la valeur wbemFlagReturnWhenComplete dans le paramètre iFlags .

Mode asynchrone

Le mode asynchrone se produit lorsque le programme ou le script continue d’être exécuté après l’appel de la méthode. WMI retourne tous les objets de la méthode à un objet SWbemSink à mesure que chaque objet est créé. Le programme ou le script appelant doit avoir un objet SWbemSink et un gestionnaire d’événements SWbemSink.OnObjectReady pour traiter les objets retournés. Pour plus d’informations sur la création d’un gestionnaire d’événements en mode asynchrone, consultez Réception d’un événement WMI.

Bien que ce mode n’ait pas les performances et la pénalité de ressource du mode synchrone, le mode asynchrone peut créer des risques de sécurité sérieux, car les résultats stockés dans l’objet SWbemSink peuvent ne pas provenir du programme ou du script appelant. WMI réduit le niveau d’authentification sur l’objet SWbemSink jusqu’à ce que la méthode réussisse. Pour plus d’informations sur la façon d’atténuer ces risques de sécurité, consultez Définition de la sécurité sur un appel asynchrone.

Les méthodes ajoutées avec le mot Async sont des méthodes pour le mode asynchrone. Les méthodes suivantes sont des appels asynchrones :

Pour plus d’informations sur le mode asynchrone, consultez :

Mode semi-synchrone

Le mode semi-synchrone est similaire au mode asynchrone dans lequel le programme ou le script continue à s’exécuter après l’appel de la méthode. En mode semi-synchrone, WMI récupère les objets en arrière-plan à mesure que votre script ou programme continue à s’exécuter. WMI retourne chaque objet retourné à la méthode appelante juste après la création de l’objet.

Étant donné que WMI gère l’objet, le mode semi-synchronisé est plus sécurisé que le mode asynchrone. Toutefois, si vous utilisez le mode semi-synchronisé avec plus de 1 000 instances, la récupération d’instance peut monopoliser les ressources disponibles, ce qui peut dégrader les performances du programme ou du script et de l’ordinateur à l’aide du programme ou du script. Chaque objet prend les ressources nécessaires jusqu’à ce que la mémoire soit libérée.

Pour contourner cette condition, vous pouvez appeler la méthode avec le paramètre iFlags défini avec l’indicateur wbemFlagForwardOnly et wbemFlagReturnReturn Immédiatement pour indiquer à WMI de retourner un SWbemObjectSet avant seul. Un SWbemObjectSet en avant uniquement élimine le problème de performances provoqué par un jeu de données volumineux en mettant en liberté la mémoire une fois l’objet énuméré.

Toute méthode SWbemServices qui ne peut pas être appelée en mode synchrone ou asynchrone est appelée en mode semi-synchrone.

Les méthodes suivantes sont appelées en mode semi-synchrone :

Pour plus d’informations sur le mode semi-synchrone, consultez Création d’un appel semi-synchronisé avec C++ et création d’un appel semi-synchronisé avec VBScript.

Amélioration des performances d’énumération

Script avec SWbemObject

WbemFlagEnum