9
votes

Comment puis-je arrêter une application de l'ouverture

Je veux écrire une petite application qui se trouve dans mon plateau et qui me permet de sélectionner un exécutable et de l'empêcher d'ouvrir.

L'UI de l'application est facile à faire à l'aide de Winforms.

Ce que je veux savoir, c'est comment détecter si un certain exe a été lâché, puis comment l'arrêter de courir. Je suis sûr que je vais devoir creuser dans des trucs Win32, mais je n'ai aucune expérience dans cette zone, d'où ce post.

Il y a une application existante similaire à celle-ci, mais je ne peux pas pour la vie de moi, souvenez-vous de ce qu'on appelle. Il a été écrit dans VB6 et c'est une source ouverte aussi.

Toute aide est très appréciée.


3 commentaires

Pourquoi voulez-vous arrêter l'application de l'ouverture? Et ne serait-il pas préférable de restreindre les autorisations de l'utilisateur afin que l'application ne puisse pas être ouverte?


Oui, j'ai examiné la définition des politiques de groupe mais j'ai découvert que les applications peuvent toujours être laissées à la LMC, donc je dois désactiver cela aussi que je ne veux pas faire.


Non, vous pouvez définir l'ACL sur les fichiers eux-mêmes pour qu'ils ne puissent pas être exécutés.


11 Réponses :


0
votes

Je me souviens de certaines fonctionnalités Win32 qui aide à résoudre ces scénarios. Si vous utilisez de toute façon .net, ce serait probablement une douleur à mettre en œuvre. J'utiliserais certains des objets de synchronisation croisée croisés (ne savez pas de ma tête lesquels sont croisés) et définiraient un signal. Au démarrage, laissez votre application vérifier si le signal est déjà défini. Si oui, fermez à nouveau l'application.


0 commentaires

0
votes

Une des idées, mais pas le meilleur est de regarder les processus de course et de tuer le processus d'exécution nécessaire lors de la découverte, cela peut être fait avec le code C # géré normal.


1 commentaires

Ouais c'est la méthode que j'utilise jusqu'à présent. Cela fermera l'application après qu'il a été ouvert de sorte que cela me dresse environ 90% là-bas. privé Bool KillProcess (nom de cordes) {foreach (processus CLSProcess in process.getProcesses ()) {if (CLSProcess.processname.ToLower (). StartSwith (nom.tObower ())) {CLSPROCESS.KILL (); retourne vrai; }} retourne faux; } Je me demande simplement si cela vaut la peine de passer le temps à rechercher le crochet Windows (que je ne connais rien de) pour la commodité du blocage de l'application instantanée.



1
votes

Un crochet Windows devrait résoudre votre problème. Je n'ai jamais essayé cela ... Mais vous devrez faire des API de Pinvoke Win32 pour y parvenir. Crochet Google Win32 et voir.


0 commentaires

0
votes

Au lieu d'attendre que l'exécutable s'ouvre, vous pouvez donc la refermer à nouveau, vous pouvez aussi simplement paralyser l'exécutable.

Changez quelques-uns des octets de l'en-tête EXE et l'empêchent de tout recommencer.

Faites-le simplement de manière à ce que l'effet est réversible.


0 commentaires

0
votes
    private bool KillProcess(string name)
    {
        foreach (Process clsProcess in Process.GetProcesses())
        {
            if (clsProcess.ProcessName.ToLower().StartsWith(name.ToLower()))
            {
                clsProcess.Kill();
                return true;
            }
        }
       return false;
    }
yeah this is the method I'm using so far. This will close the app after it's been opened so it gets me about 90% there. I use a timer that checks every 10 seconds. I'm just wondering if it's worth spending the time researching the windows hook (which i know nothing about) for the convenience of instant app blocking.
Those of you who know the Win32 api, is it worth the effort?

0 commentaires

0
votes
internal static class Program
{
    private static Mutex m;

    [STAThread]
    private static void Main()
    {
        bool flag;
        m = new Mutex(true, "ProgramName", out flag);
        if (!flag)
        {
            MessageBox.Show("Another instance is already running.");
        }
        else
        {
            //start program
        }
    }
}
I'm using this in a program, and it works perfectly, and it should be able to change this for your needs.

2 commentaires

Mon code fait efficacement la même chose. c'est-à-dire trouver un processus et traiter avec elle.


Oui, mais celles-ci évaluant ainsi tous les processus, avec les miens, vous pouvez simplement avoir une liste de mutiles et vérifier. En outre, ma solution était pour autre chose - empêchant votre propre application d'ouvrir deux fois. J'ai simplement mal compris la question elle-même, en lisant dessus trop vite :)



14
votes

Plutôt que d'essayer de tuer le processus quand il s'exécute, que diriez-lui de l'arrêter de courir dans la première place?

Changer ce qui se passe lorsque la coquille tente de lancer une application est simple - ajoutez une nouvelle clé de registre à HKEY_LOCAL_MACHINE \ LOGICIEL \ Microsoft \ Windows NT \ Microsoft \ Windows NT \ CurrentVersion Options d'exécution du fichier strong> P>

Pour tester cela, j'ai ajouté une clé de registre appelée NotePad.exe Strong> et dans ce domaine Valeur de chaîne débogueur forte> avec la valeur calc.exe strong>. Maintenant, chaque fois que j'essaie d'exécuter Notepad Calc s'ouvre. Ce qui suit est la clé de registre exportée. P>

REGEDIT4

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe]
"Debugger"="calc.exe"


2 commentaires

C'est une excellente méthode Stephen. Je peux ajouter ceci à l'application alors maintenant au lieu d'interrogation toutes les 10 secondes qu'il modifie simplement le registre une fois. Doux.


Quelle est cette Stephen Nutt? est ce code C #? @Stephennutt



0
votes

Vous pouvez écrire un crochet global.

Que sera accroché est moins important que le fait qu'il sera global, et donc, mis en œuvre dans une DLL séparée. Dans cette bibliothèque, vous gérez correctement la fixation à un nouveau module. Si vous détectez le processus en double - tuez-le.


0 commentaires

6
votes

Juste un petit ajout à Stephen Nutt's Sinon excellente réponse:

Si vous voulez que le programme s'en aille bien, ne faites pas simplement apparaître autre chose dans sa position (CALC.EXE à Stephen's Exemple). Spécifiez la clé: "Debugger" = "NTSD -C Q"

Cela invoquera le débogueur de la ligne de commande de NT de NT NTSD pour le programme avec l'argument de ligne de commande -C Dit "Exécutez la commande de débogueur spécifiée ensuite"; La commande de débogueur est q (ce qui signifie quitte). Cela empêchera le débogueur, qui, comme effet secondaire, tuera le débuteur - le programme que vous souhaitez empêcher de courir - aussi.

propre, agréable et facile. L'effet secondaire que j'ai observé est que parfois une fenêtre de commande transitoire apparaît brièvement avec une invite de débogueur uniquement pour disparaître à nouveau dans un instant.


1 commentaires

Merci pour ça, je me demandais quoi mettre à la place du Calc.exe.



2
votes

OK, je viens de trouver l'application que je cherchais à la recherche d'origine.

C'est ce qu'on appelle la tentatation bloquant et c'est disponible ici

Il trouvera tous les exécutables et vous permettront de sélectionner ce qu'il faut bloquer pendant de nombreuses heures.

Ce n'est pas parfait, j'aimerais que ce serait automatiquement commencer, alors je n'ai pas besoin de le commencer manuellement, mais en dehors de cela, c'est plutôt bon


0 commentaires