OVH Cloud OVH Cloud

WMI:ExecQuery avec variable type

16 réponses
Avatar
Alain CROS
Bonjour.

Je connais la variable intProcessID et cette ligne de code me génère l'erreur suivante.

Set colProcesses = objWMIService.ExecQuery _
("Select * from Win32_Process Where ProcessId = " & Cstr(intProcessID))

Script : C:\MonScript.vbs
Ligne : 26
Caract. : 1
Erreur : Erreur non reconnue
Code : 80004005
Source : SWbemObjectSet

Je pense que le problème vient de la conversion en String de la variable intProcessID.
J'ai essayé :
Where ProcessId = " & intProcessID)
Where ProcessId = '" & intProcessID & "'")
etc...
et toujours la même erreur.
Si quelqu'un a une idée ?
Merci.

Alain CROS

6 réponses

1 2
Avatar
Jean
Bonjour,

"Alain CROS" a écrit dans le message de news:%
Bonjour.

Si dans la requête je remplace intProcessId par un chiffre, je n'obtient pas d'erreur et colProcesses.Count = 0.
Je pense que le problème vient du couple WMI-Win98.
Merci pour vos réponses.



Je pense alors que le problème vient du fait que intProcessId est un entier non signé alors que (si je me souviens bien) sous
Windows 98 les PID retournent un entier signé (par ex : -56546).

Essayez par exemple en mettant (notez le "-" qui a été rajouté):

Set colProcesses = objWMIService.ExecQuery _
("Select * from Win32_Process Where ProcessId = -" & Cstr(intProcessID))

Si ça ne fonctionne toujours pas, c'est que la méthode Create n'a pas converti l'entier signé (le PID sous Win 98) en entier non
signé (intProcessId).

Amicalment,

Jean -JMST
Belgium

Avatar
Jean
Bonjour,

En fait c'est ce que je disais ... mais pour Windows 98, tel quel, ce script ne fonctionnera de toute façon pas parceque la méthode
Create n'est
disponible qu'à partir de Windows XP côté client et Windows 2003 Server côté serveur.

Amicalement,

Jean - JMST
Belgium

"Jean" <http:// a écrit dans le message de news:
Bonjour,

"Alain CROS" a écrit dans le message de news:%
Bonjour.

Si dans la requête je remplace intProcessId par un chiffre, je n'obtient pas d'erreur et colProcesses.Count = 0.
Je pense que le problème vient du couple WMI-Win98.
Merci pour vos réponses.



Je pense alors que le problème vient du fait que intProcessId est un entier non signé alors que (si je me souviens bien) sous
Windows 98 les PID retournent un entier signé (par ex : -56546).

Essayez par exemple en mettant (notez le "-" qui a été rajouté):

Set colProcesses = objWMIService.ExecQuery _
("Select * from Win32_Process Where ProcessId = -" & Cstr(intProcessID))

Si ça ne fonctionne toujours pas, c'est que la méthode Create n'a pas converti l'entier signé (le PID sous Win 98) en entier non
signé (intProcessId).

Amicalment,

Jean -JMST
Belgium






Avatar
Jean
Bonjour,

Ben non, Create est disponible sous Win 98 ... j'ai essayé ... j'avais consulté la doc qui indiquait :
Client: Requires Windows XP.
Server: Requires Windows Server 2003.

Amicalement,

Jean - JMST
Belgium

"Jean" <http:// a écrit dans le message de news:u$
Bonjour,

En fait c'est ce que je disais ... mais pour Windows 98, tel quel, ce script ne fonctionnera de toute façon pas parceque la
méthode

Create n'est
disponible qu'à partir de Windows XP côté client et Windows 2003 Server côté serveur.

Amicalement,

Jean - JMST
Belgium

"Jean" <http:// a écrit dans le message de news:
Bonjour,

"Alain CROS" a écrit dans le message de news:%
Bonjour.

Si dans la requête je remplace intProcessId par un chiffre, je n'obtient pas d'erreur et colProcesses.Count = 0.
Je pense que le problème vient du couple WMI-Win98.
Merci pour vos réponses.



Je pense alors que le problème vient du fait que intProcessId est un entier non signé alors que (si je me souviens bien) sous
Windows 98 les PID retournent un entier signé (par ex : -56546).

Essayez par exemple en mettant (notez le "-" qui a été rajouté):

Set colProcesses = objWMIService.ExecQuery _
("Select * from Win32_Process Where ProcessId = -" & Cstr(intProcessID))

Si ça ne fonctionne toujours pas, c'est que la méthode Create n'a pas converti l'entier signé (le PID sous Win 98) en entier non
signé (intProcessId).

Amicalment,

Jean -JMST
Belgium











Avatar
Jean
Bonjour,

C'est bien la valeur négative du PID retournée sous Windows 98 qui pose problème dans la requête WQL.
Remplacez intProcessId par un chiffre négatif ...

Vous pouvez faire quelque chose comme ceci par contre :

'---8<---
'!!!Modifier la ligne suivant avec un chemin existant!!!
programme="""X:Program FilesInternet ExplorerIEXPLORE.EXE"""

Set WMI=GetObject("winmgmts:")
Set WIN32_PROCESS=WMI.Get("Win32_Process")

retour=WIN32_PROCESS.Create(programme,,,pid)

If retour<>0 Then
With WScript
.Echo "ERREUR"
.Quit
End With
End If

Set processus=WMI.ExecQuery("Select * from Win32_Process")

For Each p in processus
With p
If .ProcessId=pid Then
r=.Description&VbNewLine&_
.ExecutablePath
End If
End With
Next

WScript.Echo r
'---8<---

Amicalement,

Jean - JMST
Belgium

"Alain CROS" a écrit dans le message de news:%
Bonjour.

Le code de Jean-Claude.Bellamy me lance bien iexplore.exe mais c'est la collection de process qui n'est pas renseignée.
Si dans la requête je remplace intProcessId par un chiffre, je n'obtient pas d'erreur et colProcesses.Count = 0.
Je pense que le problème vient du couple WMI-Win98.
Merci pour vos réponses.

Alain CROS

"Jean" <http:// a écrit dans le message de news: #
Bonjour,

Peut être que iexplore.exe se trouve ailleurs que C:Program FilesInternet ExplorerIExplore.exe chez vous :-)

Amicalement,

Jean - JMST
Bekgium







Avatar
Alain CROS
Bonjour.

Ce code fonctionne sur win98.
Effectivement, le pid retourné par Create est toujours négatif.
intérêt que je voyait avec la requête sur le pid, c'est que la collection retournée ne pouvait contenir qu'un seul élément.
Merci.

Alain CROS

"Jean" <http:// a écrit dans le message de news: #
Bonjour,

C'est bien la valeur négative du PID retournée sous Windows 98 qui pose problème dans la requête WQL.
Remplacez intProcessId par un chiffre négatif ...

Vous pouvez faire quelque chose comme ceci par contre :

'---8<---
'!!!Modifier la ligne suivant avec un chemin existant!!!
programme="""X:Program FilesInternet ExplorerIEXPLORE.EXE"""

Set WMI=GetObject("winmgmts:")
Set WIN32_PROCESS=WMI.Get("Win32_Process")

retour=WIN32_PROCESS.Create(programme,,,pid)

If retour<>0 Then
With WScript
.Echo "ERREUR"
.Quit
End With
End If

Set processus=WMI.ExecQuery("Select * from Win32_Process")

For Each p in processus
With p
If .ProcessId=pid Then
r=.Description&VbNewLine&_
.ExecutablePath
End If
End With
Next

WScript.Echo r
'---8<---

Amicalement,

Jean - JMST
Belgium



Avatar
Jean
Bonjour,

intérêt que je voyait avec la requête sur le pid, c'est que la collection retournée ne pouvait contenir qu'un seul élément.


Vous pourriez limiter le nombre d'éléments de la collection en précisant par exemple ExecutablePath dans la requête et quitter la
boucle au plus tôt avec Exit For :

'---8<---
'!!!Modifier la ligne suivante avec un chemin existant!!!
programme="D:Program FilesInternet ExplorerIEXPLORE.EXE"
exepath=Replace(programme,"","")

Set WMI=GetObject("winmgmts:")
Set WIN32_PROCESS=WMI.Get("Win32_Process")

retour=WIN32_PROCESS.Create(Entre_Guillemets(exepath),,,pid)

If retour<>0 Then
With WScript
.Echo "ERREUR"
.Quit
End With
End If

Set processus=WMI.ExecQuery(_
"Select * from Win32_Process "&_
"WHERE ExecutablePath='"&exepath&"'"_
)
For Each p in processus
With p
If .ProcessId=pid Then
r=.Description&VbNewLine&_
.ExecutablePath
Exit For
End If
End With
Next

WScript.Echo r

Function Entre_Guillemets(quoi)
Entre_Guillemets=""""&quoi&""""
End Function
'---8<---

Il y a peut être moyan de faire mieux ... si j'ai le temps j'y jetterai un oeil ...

Amicalement,

Jean - JMST
Belgium

"Alain CROS" a écrit dans le message de news:
Bonjour.

Ce code fonctionne sur win98.
Effectivement, le pid retourné par Create est toujours négatif.
intérêt que je voyait avec la requête sur le pid, c'est que la collection retournée ne pouvait contenir qu'un seul élément.
Merci.

Alain CROS

"Jean" <http:// a écrit dans le message de news: #
Bonjour,

C'est bien la valeur négative du PID retournée sous Windows 98 qui pose problème dans la requête WQL.
Remplacez intProcessId par un chiffre négatif ...

Vous pouvez faire quelque chose comme ceci par contre :

'---8<---
'!!!Modifier la ligne suivant avec un chemin existant!!!
programme="""X:Program FilesInternet ExplorerIEXPLORE.EXE"""

Set WMI=GetObject("winmgmts:")
Set WIN32_PROCESS=WMI.Get("Win32_Process")

retour=WIN32_PROCESS.Create(programme,,,pid)

If retour<>0 Then
With WScript
.Echo "ERREUR"
.Quit
End With
End If

Set processus=WMI.ExecQuery("Select * from Win32_Process")

For Each p in processus
With p
If .ProcessId=pid Then
r=.Description&VbNewLine&_
.ExecutablePath
End If
End With
Next

WScript.Echo r
'---8<---

Amicalement,

Jean - JMST
Belgium







1 2