À propos de l'utilisation de WMI dans WinPE

Archives de discussions et demandes informatiques.
moums3

À propos de l'utilisation de WMI dans WinPE

Message par moums3 » 02 février 2015, 15:58

Bonjour à tous,
J'ai réalisé un WinPE 32 bits multi-boot en WinPE3.1 et WinPe5.
J'utilise, dans des VBScripts, WMI.
À ma grande surprise, j'ai constaté que les appels à WMI se soldaient par une présence devenue permanente de l'exécutable "WmiPrvSE.exe" et quelquefois en double exemplaire (constatée par "Taskmgr" que j'ai intégré).
Des logiciels comme "Speccy" ou "MsInfo32" utilisent WMI.

Sous Windows normal, je n'ai jamais constaté une présence permanente de cet exécutable.

J'ai donc modifié un de mes scripts nommé "Tue.vbs" pour qu'il règle le compte de ce(s) parasite(s).
Il n'est pas recommandé de tuer un script vbs ou un exécutable car il peut laisser l'ordinateur dans un triste état, j'utilise ce script pour tuer des scripts nommés "attente.vbs" (scripts qui affichent des informations) ou un exécutable "EasyTimer.exe" (horloge à l'écran) et aucun d'eux ne manipulent de données.

Pour information le voici :

Code : Tout sélectionner

Option Explicit
Dim a,b,coll,wmi
b="Select * from Win32_Process Where Name='"
Set wmi=GetObject("winmgmts:")
If WScript.Arguments.Count=1 Then
	a=WScript.Arguments.Unnamed.Item(0)
	If a="exe" Then Set coll=wmi.ExecQuery(b&"EasyTimer.exe'")
	If a="vbs" Then Set coll=wmi.ExecQuery(b&"wscript.exe' AND CommandLine like '%attente.vbs%'")
	If VarType(coll)=9 Then tue()
	coll=Empty
End If
b=b&"WmiPrvSE.exe'"
Set coll=wmi.ExecQuery(b)
If VarType(coll)=9 Then tue()
Set coll=wmi.ExecQuery(b)
If VarType(coll)=9 Then tue()

Sub tue()
Dim obj
On Error Resume Next
For Each obj in coll
	obj.Terminate()
Next
On Error GoTo 0
End Sub
Ce script, lancé sans argument, effectue deux fois de suite la recherche de "WmiPrvSE.exe" ce qui peut paraître étrange... mais c'est la seule solution que j'ai trouvé ! Je suppose qu'il puisse y avoir une parenté dans les "WmiPrvSE.exe", ce qui peut impliquer un ordre dans la destruction...

À bientôt,
moums3

Etre_Libre
Administrateur
Messages : 681
Inscription : 13 novembre 2012, 21:44

Re: À propos de l'utilisation de WMI dans WinPE

Message par Etre_Libre » 04 février 2015, 09:46

Bonjour,

A l'heure actuelle, malgré la présence de cet exécutable en utilisant WMI, as-tu remarqué des effets indésirables ou il n'y en a pas ?

moums3

Re: À propos de l'utilisation de WMI dans WinPE

Message par moums3 » 04 février 2015, 10:40

Bonjour "Être_Libre",
je n'ai remarqué aucun effet indésirable autre que l'utilisation croissante de mémoire au fur et à mesure de l'utilisation de WMI, ce qui peut éventuellement nuire par la disparition progressive de la mémoire "libre"...

Je viens de contrôler à nouveau dans, Windows 8.1, la présence ou non de "WmiPrvSE.exe".
Le gestionnaire des tâches n'est pas celui de WinPE ce qui complique le contrôle.
Le lancement de "MsInfo32" provoque l'apparition de deux "WMI Provider Host", appellation sous Windows 8.1 de "WmiPrvSE.exe", l'un mobilise 1,0 Mo, l'autre 2,1 Mo de mémoire. Après un certain temps il n'en reste qu'un qui mobilise 1,0 Mo, L'arrêt de "MsInfo32" provoque, avec retard, un passage à 0,9 Mo puis après un certain temps le dernier "WMI Provider Host" disparaît .

Je suis actuellement sous WinPE (une ancienne version qui ne s'occupe pas de "WmiPrvSE.exe"), au démarrage WMI est utilisé.
"WmiPrvSE.exe" est présent (en un exemplaire) et utilise 1360 Ko de mémoire. Après 10 min d'attente, il en utilise 3544 Ko !
Après 15 min, il a disparu !
Je lance "MsInfo32" et "WmiPrvSE.exe" mobilise 1712 Ko puis passe à 1260, à 1252 Ko puis disparaît !
J'arrête donc "MsInfo32".
Donc je n'ai pas attendu suffisamment !

Finalement je vais conserver mon vbscript "Tue.vbs" pour tout simplement accélérer la libération de la mémoire !

Un petit complément d'information : dans la routine "Sub tue()", la commande "On Error Resume Next" n'est utile que pour la mise à mort de "WmiPrvSE.exe", normalement la commande "On Error GoTo 0" est inutile mais je la place par habitude.

Une remarque : dans tous mes scripts j'ai énormément simplifié les appels à WMI (je ne m'adresse qu'à l'ordinateur "local"), cette simplification est visible par la brièveté de la ligne "Set wmi=GetObject("winmgmts:").

Sans votre intervention, je n'aurais jamais constaté ce comportement de "WmiPrvSE.exe", donc merci !

À bientôt,
moums3

Répondre