2008-10-22 4 views
1

J'ai le code suivant pour terminer un processus, mais je reçois toujours un code d'erreur 2 (Accès refusé).Fin du processus win32 vbscript

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
Set colProcessList = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'MSSEARCH.exe'") 
For each objProcess in colProcessList 
    wscript.echo objProcess.processid 
    intrc = objProcess.Terminate() 
    if intrc = 0 then wscript.echo "succesfully killed process" else wscript.echo "Could not kill process. Error code: " & intrc End if 
+0

code IIRC 2 serait « fichier introuvable », non "accès refusé", qui est le code 5. – Tomalak

Répondre

2

Il est tout à fait légitime d'obtenir « accès refusé » pour mettre fin à un programme. Si c'est un service (que je devine mssearch.exe est), alors il est probablement exécuté en tant qu'utilisateur "SYSTEM", qui a des privilèges plus élevés que même le compte administrateur.

Vous ne pouvez pas vous connecter avec le compte SYSTEM, mais vous pourriez probablement écrire un service pour gérer d'autres services ...

0

En tant qu'utilisateur non privilégié, vous ne pouvez mettre fin à des processus que vous possédez. Dans un environnement multi-utilisateur, cela peut vous mordre dans la cheville, car WMI renverrait également des processus nommés d'autres utilisateurs, sauf si vous écrivez une requête WQL plus spécifique.

Si votre processus est un service, et votre script est exécuté sous un compte privilégié, vous pouvez encore besoin de prendre « la route régulière » pour l'arrêter, par exemple en utilisant WScript.Shell pour appeler net stop ou sc.exe, ou, plus élégante, en utilisant la classe Win32_Service:

Set Services = objWMIService.ExecQuery _ 
       ("SELECT * FROM Win32_Service WHERE Name = '" & ServiceName & "'") 

For Each Service In Services 
    Service.StopService() 
    WSCript.Sleep 2000 ' wait for the service to terminate ' 
Next 
Questions connexes