Lancement de processus distant

cs_olden Messages postés 38 Date d'inscription mardi 31 juillet 2007 Statut Membre Dernière intervention 9 janvier 2008 - 16 août 2007 à 08:58
cs_olden Messages postés 38 Date d'inscription mardi 31 juillet 2007 Statut Membre Dernière intervention 9 janvier 2008 - 16 août 2007 à 11:16
Bonjour,

J'utilise le WMI afin delancer des process sur un poste distant, sauf que mon process apparait bien dans le gestionnaire des tâches, mais la fenêtre n'apparait pas. Je pense qu'il me manque un paramètre, mais je ne sais pas lequel?

            String ComputerName = "MonPC";
            ManagementOperationObserver observer = new ManagementOperationObserver();
            ConnectionOptions LaConnexion = new ConnectionOptions();
            System.Management.ManagementScope MonCanal = new System.Management.ManagementScope("\\\" + ComputerName + "\\root\\cimv2");
            ManagementPath path = new ManagementPath("Win32_Process");
            ManagementClass processClass = new ManagementClass(MonCanal, path, null);
            //on crée un objet pour passer les paramétres
            object[] methodArgs = { "notepad"};
            //On exécute
            processClass.InvokeMethod(observer, "Create", methodArgs);

Merci

14 réponses

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 36
16 août 2007 à 09:32
c'est normal..! enfin... tu vas comprendre !

pour qu'un process ouvre une fenêtre, il faut qu'il soit lancer dans le même contexte que l'utilisateur connecté.
Donc, si toto est connecté à la machine, il faut que le process soit lancé par toto dans sa session...

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
16 août 2007 à 09:36
Salut,

Logiquement il n'est pas possible de lancer un processus intéractif avec l'utilisateur "courant", qu'il soit connecté sur la console ou en terminal server.

/*
coq
MVP Visual C#
CoqBlog
*/
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
16 août 2007 à 09:37
0
cs_olden Messages postés 38 Date d'inscription mardi 31 juillet 2007 Statut Membre Dernière intervention 9 janvier 2008
16 août 2007 à 10:24
Merci pour le lien, mais avant de tester (car ce qui me dérange, si j'ai bien compris, il faut copier les scripts sur le poste distant)

j'ai trouvé un truc du genre:

System.Diagnostics.Process[] myProcesses = System.Diagnostics.Process.GetProcessesByName("C:\\windows\\notepad.exe","monPC");
System.Diagnostics.Process myProcess;
//myProcess = (Process)Convert.ChangeType(myProcesses,typeof(Process));
 myProcess = myProcesses;
 myProcess.Start();

Mais là où je bloque, c'est la convertion "myProcess = myProcesses", je n'arrive pas à trouver le bon type de convertion
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
16 août 2007 à 10:33
myProcesses est un tableau de Process, donc je dirai :

myProcess = myProcesses[0]; // Apres avoir vérifié qu'il y a au moins un élément dans le tableau, et que c'est bien le premier dont tu as besoin

<hr size="2" width="100%" />
Working as designed +
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
16 août 2007 à 10:42
Hormis le fait que je ne vois pas où tu veux en venir en executant Start sur un process déjà lancé ?

/*
coq
MVP Visual C#
CoqBlog
*/
0
cs_olden Messages postés 38 Date d'inscription mardi 31 juillet 2007 Statut Membre Dernière intervention 9 janvier 2008
16 août 2007 à 10:47
Ha... je viens finallement, à la suite de ta réponse,de me rendre compte que ca ne pouvait pas marcher, car
System.Diagnostics.Process.GetProcessesByName("C:\\windows\\notepad.exe","monPC"); va vérifier si notepad tourne sur "monPC", mais ne donne en rien les valeur "notepad" et "monPC" à ma variable que je vais utiliser avec myprocess.Start(); ?

Sinon ta réponse fonctionne, mais quand j'exécute ma fonction, j'ai le message: L'index se trouve en dehors des limites du tableau. en me soulignant la ligne: myProcess = myProcesses[0];
0
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
16 août 2007 à 10:54
Parce que tu n'a pas vérifier qu'il y avait au moins un élément dans myProcesses....

Cela dit je te donnais juste la réponse a ta question pour "convertir" ton tableau en process, mais ce bout de code ne résoudra visiblement pas ton problème...

<hr size="2" width="100%" />
Working as designed +
0
cs_olden Messages postés 38 Date d'inscription mardi 31 juillet 2007 Statut Membre Dernière intervention 9 janvier 2008
16 août 2007 à 10:55
En réalité, je veux lancer un processus, mais j'ai l'impression qu'il n'y a pas d'API sous visual qui permet de lancer un programme sur un poste distant.
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
16 août 2007 à 11:01
C'est donc que le tableau est vide, comme l'a dit Nikoui, il faut tester.
Et lire la doc de Process.GetProcessesByName pour savoir quoi passer exactement au paramètre processName.

/*
coq
MVP Visual C#
CoqBlog
*/
0
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
16 août 2007 à 11:02
Coq t'a fournis une solution pour faire ce que tu veux. Cela dit, si ce n'est "a priori" pas possible, c'est pour des raisons de sécurité...

Le plus simple a mon avis est donc d'installer volontairement une deuxieme appli sur le poste distant, que tu pilotera a distance et qui se chargera de faire ce que tu veux. Mais cette solution implique une installation sur le poste distant, et donc l'accord de l'utilisateur en question... tout dépend donc de ce que tu veux faire et de la raison pour laquelle tu veux le faire.

<hr size="2" width="100%" />
Working as designed
www.nikoui.fr
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
16 août 2007 à 11:07
Le "problème" est plus le fait que les APIs Windows ne prévoient pas (enfin, pas à ma connaissance) de lancer un processus distant en intéractif, pas de ne pas en lancer du tout (cf l'outil psexec de Sysinternals)
Déjà celà apporte en effet un côté sécurité, mais ce n'est pas à mon avis la principale raison : en général ce genre de chose sert pour des tâches administratives, et dans ce contexte le GUI n'est pas un élément crucial à prendre en compte, car inexistant.
Si tu veux faire un lanceur d'applications centralisé, tu risques de devoir revoir l'architecture de ton application.

/*
coq
MVP Visual C#
CoqBlog
*/
0
cs_olden Messages postés 38 Date d'inscription mardi 31 juillet 2007 Statut Membre Dernière intervention 9 janvier 2008
16 août 2007 à 11:11
C'est pour surveiller des process qui tournent sur des serveurs (a partir d'un autre serveur, qui a donc les droits admin sur les autres serveurs), et les consignes que j'ai: ne rien installer sur les serveurs (c'est pas cool, surtout que le dev, c'est pas mon métier)
0
cs_olden Messages postés 38 Date d'inscription mardi 31 juillet 2007 Statut Membre Dernière intervention 9 janvier 2008
16 août 2007 à 11:16
Ha mince, j'ai posté trop vite:

j'ai essayé Psexec qui est très bien, j'était content, sauf que au moment où je suis passé au test sur l'appli de prod (et non plus notepad), c'est là que j'ai été dégouté car je me suis rendu compte qu'il ne l'ouvrait pas avec l'utilisateur courant (donc pas les droits: répertoire, BDD, ...)

Merci pour  l'aide
0
Rejoignez-nous