2010-01-15 4 views
1

J'écris une application C# qui, entre autres choses, ferme automatiquement la publicité qu'un certain jeu affiche après que l'utilisateur quitte la partie. Mon programme accomplit cela en tuant le processus de jeu quand il détecte que l'utilisateur a quitté le jeu. Mon programme est similaire à un script Autohotkey écrit par quelqu'un d'autre qui fait des choses similaires mais il ajoute quelques fonctionnalités et une interface graphique.Quelle est la différence entre ces deux méthodes de destruction d'un processus?

Naturellement, j'ai utilisé la méthode Process.Kill. Cependant, cela échouerait avec une exception "Accès refusé". J'ai remarqué que le script Autohotkey utilise une méthode inhabituelle pour tuer le processus. J'ai demandé à l'auteur à ce sujet, et il a dit qu'il avait aussi du mal à tuer le processus avec des méthodes normales.

Nous soupçonnons que les méthodes normales de terminaison de processus ne fonctionnent pas, c'est le logiciel HackShield que le jeu utilise pour tenter de lutter contre la triche.

Voici le code Autohotkey script de l'autre gars utilise pour tuer un processus:

; kills all process instances of a given executable name 
; COM AutoHotkey library code omitted 
KillProcessInstances(exe) 
{ 
    psvc := COM_GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") 
    pset := COM_Invoke(psvc, "ExecQuery", "Select * from Win32_Process Where Name = '" exe "'") 
    penm := COM_Invoke(pset, "_NewEnum") 
    Loop, % COM_Invoke(pset, "Count") 
    If COM_Enumerate(penm, pobj)=0 
    { 
     COM_Invoke(pobj, "Terminate") 
     COM_Release(pobj) 
    } 
    COM_Release(penm) 
    COM_Release(pset) 
    COM_Release(psvc) 
} 

J'ai remplacé le Process.KIll avec le WMI appelle dans mon programme en utilisant l'espace de noms System.Management et mon programme est maintenant capable de tuer le processus. Ce que je ne comprends pas ce qui rend le WMI différent de Process.Kill. Je m'attendrais à ce que les deux fonctionnent ou les deux échouent. En outre, le gestionnaire de tâches est capable de tuer le processus très bien, mais je pense qu'il utilise simplement un appel TerminateProcess win32 tout comme Process.Kill fait sûrement. Quelqu'un peut-il faire la lumière sur la cause du comportement différent? Si c'est important, je cours Windows XP. Edit: wj32 a expliqué pourquoi le WMI fonctionne, mais peut-on expliquer pourquoi je peux tuer le processus avec le Gestionnaire des tâches, mais pas avec mon propre programme?

Répondre

2

Les appels WMI ne sont pas effectués dans le contexte de sécurité de votre processus. Ils sont traités dans un autre processus (je devine le service Winmgmt). Ce service s'exécute sous le compte SYSTEM, et HackShield peut autoriser la résiliation à cause de cela.

+0

Qu'en est-il du fait que le gestionnaire de tâches peut le tuer? Y at-il quelque chose de spécial à propos du Gestionnaire des tâches? –

Questions connexes