2016-11-25 5 views
0

J'ai créé une application de barre d'état système en C#, qui fonctionne en arrière-plan. Il écoute sur un serveur de messagerie à l'aide d'Exchange WebServices et exécute un ensemble d'actions chaque fois qu'un mailaccount reçoit un message. Il utilise un certain nombre d'applications Excel, ce qui ne fonctionne pas correctement si je convertis en programme pour un service (c'est pourquoi il doit être une application d'essai du système).Comment puis-je m'assurer qu'un programme ne s'exécute qu'une seule fois sur toutes les sessions d'un serveur Windows 2012?

Il est important que le programme ne tourne pas plus d'une fois à la fois. J'ai ajouté un verrou mutex, donc je ne peux pas exécuter le programme plus d'une fois sur la même session. Le problème est cependant, quand je me connecte à une autre session sur Windows Server (il peut avoir deux sessions par utilisateur), le programme n'est pas visible dans la barre d'état système, et je peux l'ouvrir à nouveau. session. Comment puis-je empêcher cela?

Merci

+0

Créez un fichier avec un nom réservé, par ex. 'C: \ temp' et gardez-le verrouillé, donc l'instance # 2 remarquera et quittera? –

+0

Quel est le nom du mutex? Si le nom de mutex commence par Global, il est global pour toutes les sessions de services de terminal. Vous devriez également vérifier les permissions de mutex afin qu'il soit accessible par tous les utilisateurs. –

+0

voir cette question SO http://stackoverflow.com/questions/229565/what-is-a-good-pattern-for-using-a-global-mutex-in-c –

Répondre

0

Vous devriez voir tous les processus comme celui-ci:

using System.Diagnostics; 
var allProcceses = Process.GetProcesses(); 

Ensuite, vous pouvez vérifier si votre programme est en cours.

+0

Mais quand je lance le programme, il y aura toujours un processus avec ce nom. Si mon programme est appelé mailChecker, et dans ce programme je vérifie si mailChecker est ouvert, il retournera toujours vrai, car mailChecker chekcs si mailChecker est ouvert. Ou ai-je tort? – Spliid

+0

Vous pouvez utiliser GetProcessesByName et rechercher mailChecker. Si vous étiez déjà en cours d'exécution, vous verrez deux entrées, à ce stade, vous pouvez arrêter le programme lui-même. – Mant101

+0

Désolé pour la réponse tardive. Soit faire comme @ Mant101 dit et vérifier le nombre de processus. Ou obtenir le processus en cours en utilisant 'Process.GetCurrentProcess()' et comparez l'Id, si elles sont les mêmes que vous regardez le processus des programmes en cours. – MrApnea