Comment empecher le lancement d'une application si celle-ci tourne deja ?Nous exposerons dans cet article deux méthodes permettant d'empêcher plusieurs instances de votre application d'être exécutées en même temps : l'une employant App.PrevInstance, l'autre employant des mutex. Nous exposerons ensuite les dangers de telles solutions. Les deux méthodes exposées sont classiques, mais de nombreuses autres peuvent être implémentées. Celles-ci incluent, par exemple, la recherche de fenêtres sur base de leur titre, l'ouverture d'un port TCP sur la machine locale, la création de clés de registre ou de fichiers, mais l'utilisation de variables partagées pour un serveur d'ActiveX. Il est important, lors de l'utilisation de tels procédés, d'en connaître les limites d'utilisation. Le choix de l'un ou l'autre de ces moyens dépendra principalement du degré de sécurité que vous souhaitez : empêcher deux instances d'un lecteur multimédia pour le confort de l'utilisateur est fort différent d'empêcher les écritures simultanées de données, par des processus concurrents, menant a des corruptions ou a la perte de ces mêmes données. App.PrevInstanceVous pouvez employer la propriete PrevInstance de l'objet App qui permet de savoir s'il existe deja une instance de l'application. Cette méthode présente l'avantage d'être particulièrement simple a mettre en oeuvre. Néanmoins, un utilisateur astucieux pourra exécuter plusieurs instances, par exemple en copiant l'exécutable d'un dossier vers un autre. Sub Main() MutexUn mutex est un objet de synchronisation offert par le système d'exploitation. Lors de l'utilisation de tels objets, il est important de s'assurer que leur utilisation est correcte, faute de quoi la synchronisation pourrait ne pas être réalisée correctement. Pour commencer, nous allons créer un objet qui nous servira a manipuler le mutex plus facilement. Dans un module de classe, ajoutez le code suivant. Option Explicit Maintenant que cette classe est créée, nous allons l'utiliser dans la form principale de notre projet. Option Explicit Le préfixe Global\ au nom n'est pas anodin. Celui-ci assure, sur un système sur lequel plusieurs sessions utilisateurs peuvent s'executer parallelement, que le mutex sera considère pour l'entièreté du système et pas uniquement pour la session courante. La constante APP_NAME rend le nom du mutex unique. Ceci garanti que quel que soit le nom de l'exécutable, ou son chemin d'exécution, l'application n'aura au plus qu'une instance démarrée. On peut aussi envisager d'utiliser App.ExeName qui, bien qu'elle ne garantisse pas l'unicité, permet à l'utilisateur de contourner la protection si la première instance venait à ne plus s'exécuter correctement. InconvénientsLe principal inconvénient des applications dont plusieurs processus ne peuvent exister simultanement est qu'elles sont vulnérables aux dénis de service. N'importe quel logiciel malicieux peut prendre la place d'une telle application de sorte a en empêcher le démarrage. Il faut dans un premier temps s'assurer que le design de l'application est correct et requiert effectivement que seule une instance soit présente a la fois. Si c'est le cas, l'objet de synchronisation devrait, au minimum, disposer de droits de sécurité permettant raisonnablement d'éviter ce problème. Par exemple, si le test est réalise sur base de l'existence d'un fichier, seul l'administrateur de la machine, et non les utilisateurs, devrait y avoir accès. Ceci impliquerait aussi que seul l'administrateur puisse utiliser le logiciel. Il est a remarquer que notre implémentation de CMutex utilise le contexte de sécurité de l'utilisateur courant. Il est possible de spécifier plus finement les restrictions a l'aide de l'argument lpMutexAttributes de l'API CreateMutex. De nombreuses méthodes reposent sur le contenu ou d'un fichier ou d'une clés de registre. Outre le fait que ces méthodes ne puissent pas, de manière inhérente, assurer que deux instances simultanées ne soient pas en cours d'exécution, dans le cas d'un crash, rien ne garanti de pouvoir exécuter a nouveau l'application sans éditer le fichier ou la clé en question. Il faut donc faire attention a l'usage de telles méthodes. Aller plus loin
Voir aussi : |
Date de publication : 07 juillet 2002 Dernière modification : 11 septembre 2008 Rubriques : Généralités Mots-clés : lancement, empecher, executer, PrevInstance, instance, precedente, unique, unicite, mutex |