Comment puis-je déterminer le propriétaire d'un processus en C#?
Je suis à la recherche d'un processus par le nom de "MyApp.exe" et je veux m'assurer que le processus qui est détenue par un utilisateur particulier.
J'utilise le code suivant pour obtenir une liste des processus:
Process[] processes = Process.GetProcessesByName("MyApp");
Cela me donne une liste de processus, mais il ne semble pas être un moyen dans le Processus de la classe de déterminer à qui appartient ce processus? Des idées sur comment je peux faire cela?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser WMI pour obtenir l'utilisateur possédant un certain processus. Utiliser WMI, vous devez ajouter une référence à la
System.Management.dll
à votre projet.Par id de processus:
Par le nom du processus (trouve le premier processus seulement, ajuster en conséquence):
string query = "..."
, à l'aide deSelectQuery query = new SelectQuery("...")
.Depuis WMI n'est pas toujours un moyen rapide de récupérer des informations, voici le natif de P/Invoke façon de le faire:
La valeur de retour est
null
en cas d'échec. Pour obtenir les noms des processus en cours d'exécution en vertu de l'utilisateur du SYSTÈME, vous devez exécuter ce code en tant qu'administrateur.Ici est la version de visual basic pour les non C# haut-parleurs:
Malheureusement, il n'y a pas natif .Net, de manière à obtenir des processus de propriétaire.
Un oeil à ces pour une solution potentielle:
Ajouter une référence à votre projet:
Puis ajoutez la méthode suivante à votre projet:
Puis ajoutez cette méthode:
Appel GetProcessTable() vous donne un DataTable de tous les processus en cours d'exécution le long de avec leur Identifiant et de leur Nom, ce qui est très pratique car il peut être utilisé comme un DataGridView de source de données de paramètre.
Laissez-moi savoir si vous avez besoin d'ajouter plus de champs de la table.
@bytecode77:
Je peux vous le dire maintenant, juste en regardant ton code, que vous serez potentiel de génération de FirstChanceExceptions ... en particulier en raison des "ACCÈS REFUSÉ" (Win32Exception) et "ne fonctionne PAS" (ArgumentException) pour ces.dans votre "attraper" bloc de l'évaluateur d'expression de processus.Poignée".
Voir aussi LinkDemand=6 et SecurityCriticalAttribute.
Tandis que vous pouvez encore avoir besoin de "Outils -> Débogage -> Activé uniquement Mon Code' pour cet attribut, le FirstChanceExceptions sera toujours soulevées.
Autre que cela, je suis d'accord avec votre réponse dans pinvoke Win32 appel étant plus rapide que WMI, en particulier lors de l'itération sur TOUS les processus.
C'est la façon la plus simple que j'ai trouvé pour le faire: