2009-11-10 9 views
0

Je travaille sur un projet visant à empêcher le lancement d'applications à partir de périphériques amovibles. Est-ce que quelqu'un sait comment je peux faire ça? Préférentiellement en C++ sur la plateforme Windows.Comment arrêter l'exécution de l'application

Mon but est d'empêcher l'exécution du fichier exe même si l'utilisateur double-clique dessus ou même s'il essaie de le lancer à partir de la ligne de commande.

+0

Votre utilisation du pluriel "applications" semblerait indiquer que vous voulez arrêter toute application en cours d'exécution à partir d'un lecteur amovible.Est-ce le cas, ou essayez-vous d'empêcher votre application à partir d'un lecteur amovible? Ma réponse ci-dessous suppose le premier plutôt que le dernier. –

+0

IOW, vous voulez que votre application refuse de s'exécuter si elle réside sur un stockage amovible? –

+0

Pas vraiment je veux juste arrêter les nouveaux exécutables qui peuvent essayer d'être lancés à partir de périphériques amovibles –

Répondre

3

En supposant que vous souhaitiez arrêter tout lancement de processus à partir d'un lecteur amovible, cela semble être une application pour un hook shell. J'ai écrit le code suivant au cours de la dernière demi-heure, et il semble tester OK. Gardez à l'esprit que l'écriture d'un hook est un processus non trivial, et qu'un hook global nécessite l'écriture d'une DLL. Ce sont les tripes pertinentes de la DLL crochet:

BOOL __declspec(dllexport) __stdcall InstallShellHook() 
{ 
    lpfnHookProc = (HOOKPROC) ShellFunc ; 
    BOOL bRetVal = FALSE; 

    if (hShellHook == NULL) 
    { 
     hShellHook = SetWindowsHookEx (WH_SHELL, 
            lpfnHookProc, 
            hInstance, 
            NULL); 
     return TRUE; 
    } 
    return FALSE; 
} 

LRESULT CALLBACK ShellFunc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    HWND hWndNew; 
    char szBuff [_MAX_PATH]; 
    char szDrive [_MAX_DRIVE]; 

    switch (nCode) 
    { 
     case HSHELL_WINDOWCREATED: 
     hWndNew = (HWND)wParam; 
     GetWindowModuleFileName (hWndNew, szBuff, _MAX_PATH); 
     _splitpath (szBuff, szDrive, NULL, NULL, NULL); 
     if (GetDriveType (szDrive) == DRIVE_REMOVABLE) 
     { 
      PostMessage (hWndNew, WM_CLOSE, 0, 0); 
     } 
     break; 

     default: 
     break; 
    } 
    return 0; 
} 

J'ai testé ce code, installé à partir d'un banc d'essai simple, de dialogue, et cela me permet de lancer une application fenêtré de mon disque dur, mais se ferme immédiatement tout lancement I à partir d'une clé USB.

Notez que cette solution fonctionne pour tous les processus GUI (c'est-à-dire non-console), mais nécessite qu'ils répondent à WM_CLOSE sur une fenêtre de niveau supérieur. Une solution générale plus agressive vous obligerait probablement à résoudre le hwnd dans un hprocess et appelez TerminateProcess: la solution que j'ai fournie est "kinder" (les DLL liées seront déchargées etc.), mais moins générale.

Si vous voulez connaître les bases de l'écriture d'un hook à l'échelle du système, vous pouvez les trouver sur mon site Web here. Notez que ce qui précède n'est pas du code de qualité de production, je l'ai piraté dans une vieille DLL ANSI que j'avais à poser, d'où le manque de support pour Unicode, ou tout ce qui se rapproche de la capacité de débogage décent. Il montre cependant l'idée de base.

+0

Même après avoir modifié ce code pour utiliser TerminateProcess, je suis assez sûr (par expérience) que cela ne fonctionnera pas pour les applications console. En effet, les applications de console sont traitées différemment des applications fenêtrées par csrss.exe (une sorte de «serveur de console») qui gère également leurs boucles de messages. Je n'ai pas pu comprendre complètement de votre réponse si cette solution serait appropriée dans ce cas. –

+0

Une application de console n'est pas un processus GUI, donc non, le code que j'ai posté n'est pas approprié pour les applications console. Mon commentaire sur TerminateProcess concerne les applications qui ignorent WM_CLOSE, pas les applications de console. Je pense que le PO doit être un peu plus clair sur l'exigence précise: obtenir quelque chose qui fonctionne dans tous les cas est assez délicat. Il se peut que ce code soit suffisant, mais seulement il peut clarifier l'intention précise. –

0

Vous pouvez écrire un extrait renvoyé par la méthode Main si le type de disque actuel est un périphérique amovible.
Appel GetCurrentDirectory Nom du disque divisé et utiliser WMI (this peut aider) ou mieux encore GetDriveType (this peut aider ici) méthode de savoir est sur disque amovible ou non

+0

Une solution facile. Vous venez de le tester au démarrage et de sortir si ce n'est pas du disque dur. – Goz

+0

il a juste besoin de ça, n'est-ce pas? –

0

Il me semble que vous êtes à la recherche d'un moyen générique arrêtez toute application lancée depuis l'appareil à partir d'une application déjà en cours d'exécution. donc essentiellement trois questions: 1. Détection de la nouvelle application a commencé 2. Vérification de quel type d'appareil il est en cours d'exécution hors 3. Forcer l'application de mourir si vous ne voulez pas

Partie 1: Cette est la partie difficile, je pense que vous devez soit sondage sur une base régulière en utilisant EnumProcess qui n'est pas grande ou tout simplement vérifier les applications qui génèrent un WM_ACTIVATEAPP

Partie 2: Solution de ArsenMkrt semble approprié pour ce

Partie 3: TerminateProcess devrait le faire pour vous

1

Votre administrateur réseau peut prendre soin de cela sans avoir besoin d'écrire du code. Nous avons implémenté exactement la même chose ici pour empêcher les employés de copier des informations privées sur des périphériques amovibles et l'administrateur du réseau l'a implémenté lui-même sans que nous ayons besoin de faire quoi que ce soit. Je ne sais pas si cela fonctionnerait dans votre situation, mais cela vaut la peine d'être considéré.

+0

Essayez: Démarrer-> Exécuter -> "secpo.msc" -> Paramètres de sécurité-> Stratégies de restriction logicielle-> Règles supplémentaires, clic droit-> Nouvelle règle de chemin. Il devrait être possible d'écrire une application pour configurer ceci. – Skizz