Partager via


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. Par exemple, les méthodes Win32_LogicalDiskChkdsk et ScheduleAutoChk fournies par le fournisseur Win32.

Les sections suivantes seront 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 de fournisseur.

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

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

Les méthodes WMI et fournisseur suivantes se trouvent dans l’API Script 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-synchrone offre généralement le meilleur équilibre entre sécurité et 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’interrompent 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 appeler uniquement les 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 le 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 à s’exécuter 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 les ressources du mode synchrone, le mode asynchrone peut créer de graves risques de sécurité, 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’éliminer les risques, consultez Définition de la sécurité concernant 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 les appels asynchrones, consultez:

Mode semi-synchrone

Le mode semi-synchrone est similaire au mode asynchrone, car 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-synchrone avec plus de 1 000 instances, instance récupération peut monopoliser les ressources disponibles, ce qui peut dégrader les performances du programme ou du script et de l’ordinateur utilisant le programme ou le 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 les indicateurs wbemFlagForwardOnly et wbemFlagReturnImmediately pour indiquer à WMI de retourner un SWbemObjectSet avant uniquement. Un SWbemObjectSet avant uniquement élimine le problème de performances provoqué par un jeu de données volumineux en libérant la mémoire après l’énumération de l’objet.

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-synchronisé :

Pour plus d’informations sur le mode semi-synchrone, consultez Effectuer un appel semi-synchrone avec C++ et Effectuer un appel semi-synchrone avec VBScript.

Amélioration des performances des énumérations

Scripts avec SWbemObject

WbemFlagEnum