Précédent   Forum du club des développeurs et IT Pro > Dotnet > Développement Windows
Développement Windows Forum d'entraide sur les technologies d'interface Windows de Microsoft (Winforms, Windows Presentation Foundation, etc.).
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 06/09/2012, 09h58   #1
Tarmineldur
Candidat au titre de Membre du Club
 
Femme
Étudiant
Inscription : septembre 2012
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2012
Messages : 54
Points : 13
Points : 13
Par défaut [développement] Comment lancer des commandes dos à distance ?

Bonjour à tous !

Je cherche a accéder aux processus d'un logiciel (Obiee) qui tourne sur un serveur distant. (inutile de préciser que j'ai tous les droits)
Je développe en C#.
Ma première idée fut de recourir à la classe Process. Je l'ai abandonnée. En effet, dans le gestionnaire des tâches certains processus ont le même nom et peuvent être dupliqué plusieurs fois par certains services.
J'ai toutefois une commande dos qui me permet d'obtenir les informations que je cherche.
Mon problème est donc le suivant : Comment mon programme en c# va-t-il lancer une commande dos sur le serveur distant ?

A l'aide !

Merci d'avance
Tarmineldur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2012, 10h25   #2
Tarmineldur
Candidat au titre de Membre du Club
 
Femme
Étudiant
Inscription : septembre 2012
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2012
Messages : 54
Points : 13
Points : 13
Eurêka !
La classe Process était bien mon amie finalement. Je m'en sers pour lancer cmd puis je passe mes arguments via ProcessStartInfo. (y'a plus qu'à tester)

Toutes mes excuses pour ce flood.

Bien à vous,

Tarmineldur
Tarmineldur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2012, 10h26   #3
DotNetMatt
Membre Expert
 
Avatar de DotNetMatt
 
Homme Mathieu
Conseil - Consultant en systèmes d'information
Inscription : février 2010
Messages : 977
Détails du profil
Informations personnelles :
Nom : Homme Mathieu
Âge : 25
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Finance

Informations forums :
Inscription : février 2010
Messages : 977
Points : 2 005
Points : 2 005
Il y a plusieurs façons de faire.

Personnellement, je te conseille d'utiliser WMI. Tu trouveras du code en exemple sur ce lien : Create a Remote Process using WMI in C#
DotNetMatt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/09/2012, 10h59   #4
Tarmineldur
Candidat au titre de Membre du Club
 
Femme
Étudiant
Inscription : septembre 2012
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2012
Messages : 54
Points : 13
Points : 13
Merci de ta réponse.
J'ai lu ton lien avec attention et si j'ai bien compris (enfin je crois) comment créer un fichier batch, j'ai beaucoup plus de mal à comprendre comment extraire des informations via ce moyen.
Quant à ma solution via la classe Process, j'ai le même problème : je vois bien comment entrer des lignes de commandes mais je ne sais pas comment récupérer les informations qui s'affichent alors dans la console.
Tarmineldur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2012, 11h40   #5
DotNetMatt
Membre Expert
 
Avatar de DotNetMatt
 
Homme Mathieu
Conseil - Consultant en systèmes d'information
Inscription : février 2010
Messages : 977
Détails du profil
Informations personnelles :
Nom : Homme Mathieu
Âge : 25
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Finance

Informations forums :
Inscription : février 2010
Messages : 977
Points : 2 005
Points : 2 005
Je ne sais pas comment faire ça avec Process.

Cet article montre comment faire pour récupérer le code de sortie via WMI : http://blogs.msdn.com/b/padmanr/arch...using-wmi.aspx

Est-ce que ça répond à ton besoin ?

[EDIT] : il n'est à ma connaissance pas possible de récupérer au fur et à mesure ce qui s'affiche sur la console en tant que tel.

La seule chose qui soit possible de faire est de récupérer l'affichage de l'ordinateur distant, pour l'afficher sur l'ordinateur local (sous forme d'images en gros).
DotNetMatt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/09/2012, 14h38   #6
antoine.debyser
Membre éprouvé
 
Homme
Ingénieur développement logiciels
Inscription : mars 2011
Messages : 258
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2011
Messages : 258
Points : 418
Points : 418
Bonjour,
Citation:
Envoyé par Matt07 Voir le message
[EDIT] : il n'est à ma connaissance pas possible de récupérer au fur et à mesure ce qui s'affiche sur la console en tant que tel.
Si si, c'est possible dans le cas de l'utilisation de la classe Process. Il faut lire le flux, ou le rediriger dès la création
Par contre, utiliser Process pour lancer un processus sur un autre ordinateur, alors là je ne sais pas du tous.
antoine.debyser est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/09/2012, 15h30   #7
DotNetMatt
Membre Expert
 
Avatar de DotNetMatt
 
Homme Mathieu
Conseil - Consultant en systèmes d'information
Inscription : février 2010
Messages : 977
Détails du profil
Informations personnelles :
Nom : Homme Mathieu
Âge : 25
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Finance

Informations forums :
Inscription : février 2010
Messages : 977
Points : 2 005
Points : 2 005
Citation:
Envoyé par antoine.debyser Voir le message
Si si, c'est possible dans le cas de l'utilisation de la classe Process. Il faut lire le flux, ou le rediriger dès la création
Ah oui bien vu Je n'avais pas connaissance de ces propriétés. Merci pour cette correction.
DotNetMatt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/09/2012, 16h11   #8
Tarmineldur
Candidat au titre de Membre du Club
 
Femme
Étudiant
Inscription : septembre 2012
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2012
Messages : 54
Points : 13
Points : 13
Après mure réflexion, je ne comprends pas comment marche le WMI... Je ne comprends rien aux chemins d'accès par exemple. Dans mon cas, la machine est sur le réseau local, quel en est alors le chemin ? Quelle syntaxe dois-je utiliser ?

Pour ce qui est de streamreader, je connaissais mais je n'y avais pas pensé, bien vu. Voilà qui finit de répondre à mon problème relatif à l'obtention des statuts. Reste l’arrêt relance.
Tarmineldur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2012, 00h21   #9
Graffito
Expert Confirmé Sénior
 
Avatar de Graffito
 
Inscription : janvier 2006
Messages : 5 390
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 5 390
Points : 6 036
Points : 6 036
Code :
1
2
3
4
5
6
7
object[] theProcessToRun = { "notepad.exe" };
ConnectionOptions theConnection = new ConnectionOptions();
theConnection.Username = "username";
theConnection.Password = "password";
ManagementScope theScope = new ManagementScope("\\\\" + IP_or_ServeRName + "\\root\\cimv2", theConnection);
ManagementClass theMngClass = new ManagementClass(theScope,  new ManagementPath("Win32_Process"), new ObjectGetOptions());
theMngClass.InvokeMethod("Create", theProcessToRun);
__________________
" Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson
Graffito est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/09/2012, 08h39   #10
Tarmineldur
Candidat au titre de Membre du Club
 
Femme
Étudiant
Inscription : septembre 2012
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2012
Messages : 54
Points : 13
Points : 13
Merci beaucoup, là c'est beaucoup plus clair. Je vous tiens au courant.

Je regrette juste que cette solution nécessite une connexion, j'aurais bien aimé rester en .net et éviter cela. Non, non, ça va en fait. Ayant déjà les droits, je n'ai pas besoin de mettre user et password \o/
Tarmineldur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2012, 14h53   #11
Tarmineldur
Candidat au titre de Membre du Club
 
Femme
Étudiant
Inscription : septembre 2012
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2012
Messages : 54
Points : 13
Points : 13
Comment se fait il que si je démarre cmd.exe par exemple, je n'ai pas la fenetre ? comment l'avoir ?
Tarmineldur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2012, 15h31   #12
DotNetMatt
Membre Expert
 
Avatar de DotNetMatt
 
Homme Mathieu
Conseil - Consultant en systèmes d'information
Inscription : février 2010
Messages : 977
Détails du profil
Informations personnelles :
Nom : Homme Mathieu
Âge : 25
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Finance

Informations forums :
Inscription : février 2010
Messages : 977
Points : 2 005
Points : 2 005
Ceci fonctionne bien chez moi :

Code C# :
object[] theProcessToRun = { @"notepad.exe /A C:\Temp\AssemblyRegistration.xml" };
DotNetMatt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/09/2012, 15h34   #13
Tarmineldur
Candidat au titre de Membre du Club
 
Femme
Étudiant
Inscription : septembre 2012
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2012
Messages : 54
Points : 13
Points : 13
Merci !
Désolé de poser une question aussi triviale mais c'est assez du de trouver de la bonne doc sur le sujet. C'est plus facile sur d'autres langages.
Tarmineldur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2012, 15h37   #14
DotNetMatt
Membre Expert
 
Avatar de DotNetMatt
 
Homme Mathieu
Conseil - Consultant en systèmes d'information
Inscription : février 2010
Messages : 977
Détails du profil
Informations personnelles :
Nom : Homme Mathieu
Âge : 25
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Finance

Informations forums :
Inscription : février 2010
Messages : 977
Points : 2 005
Points : 2 005
C'est sûr que ce n'est pas toujours évident, mais WMI est très puissant, donc ça vaut le coup de s'y intéresser et de persévérer.

Concernant ta question sur CMD, chez moi avec cette commande :
Code C# :
object[] theProcessToRun = { @"cmd.exe" };

Et avec ceci (pour lancer l'instruction WMI en local) :
Code C# :
ManagementScope theScope = new ManagementScope("\\\\127.0.0.1\\root\\cimv2", theConnection);

J'ai bien la console qui s'affiche...
DotNetMatt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/09/2012, 15h44   #15
Tarmineldur
Candidat au titre de Membre du Club
 
Femme
Étudiant
Inscription : septembre 2012
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2012
Messages : 54
Points : 13
Points : 13
De mon côté, que ce noit notepad ou cmd, ça s'affiche bien dans la liste des processus (donc ça marche) mais je n'ai pas la fenêtre. Il doit exister une option... quelque part...
Tarmineldur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2012, 15h52   #16
Tarmineldur
Candidat au titre de Membre du Club
 
Femme
Étudiant
Inscription : septembre 2012
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2012
Messages : 54
Points : 13
Points : 13
Hum... lorsque je le fait sur mon pc (via 127.0.0.1) ça s'affiche bien en fenêtre, mais lorsque que je le fait sur mon server (qui tourne joyeusement sur windows server) ça ne s'affiche plus. Là, ça ne sent pas bon...
Tarmineldur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2012, 16h42   #17
DotNetMatt
Membre Expert
 
Avatar de DotNetMatt
 
Homme Mathieu
Conseil - Consultant en systèmes d'information
Inscription : février 2010
Messages : 977
Détails du profil
Informations personnelles :
Nom : Homme Mathieu
Âge : 25
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Finance

Informations forums :
Inscription : février 2010
Messages : 977
Points : 2 005
Points : 2 005
C'est normal que tu n'aies pas la fenêtre lorsque tu envoies la commande à ton serveur. L'important c'est que le process se lance, en principe tu n'es pas censée être logguée sur ton serveur H24
DotNetMatt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/09/2012, 11h23   #18
Tarmineldur
Candidat au titre de Membre du Club
 
Femme
Étudiant
Inscription : septembre 2012
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2012
Messages : 54
Points : 13
Points : 13
Je vais donc lancer via wmi un .bat qui exécutera environ 7 lignes de codes qui me donnerons les statuts de certains processus très particulier.
Pour récupérer ces statuts qui s’afficheront dans la console invisible, je pense utiliser la classe process et récupérer cmd.exe via GetProcessesByName et rediriger la sortie de cmd.exe grace à Streamreader.

Je me pose donc deux questions :
Peut on vraiment rediriger l'output de cmd.exe s'il est sur une machine distante ?
Et surtout :
Je risque d'avoir un problème si plusieurs cmd.exe sont en train de tourner pour savoir lequel est le bon. Il faudrait donc que je connaisse son ID au démarrage sachant que c'est le .bat qui le lance... Une idée ?
Je vais être obligé de devoir me passer de .bat non ? il me semble qu'on peut connaitre l'ID du processus quand on le lance via wmi...
Du coup, ce n'est pas un mais 7 arguments que je vais devoir donner à cmd en le lançant avec wmi, comment fait on ?

Soyez assurés que je cherche de mon côté
Merci de votre aide
Tarmineldur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2012, 16h34   #19
DotNetMatt
Membre Expert
 
Avatar de DotNetMatt
 
Homme Mathieu
Conseil - Consultant en systèmes d'information
Inscription : février 2010
Messages : 977
Détails du profil
Informations personnelles :
Nom : Homme Mathieu
Âge : 25
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Finance

Informations forums :
Inscription : février 2010
Messages : 977
Points : 2 005
Points : 2 005
A mon avis, il faut que tu choisisses clairement ton camp :
- soit tu restes en pur .NET avec la class Process
- soit tu restes sur WMI

Avec WMI, tu peux récupérer les informations sur les processus en utilisant ce genre de code :
Code C# :
1
2
3
4
5
6
7
8
9
string query = "Select * From Win32_Process Where Name = 'notepad.exe'";
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection processList = searcher.Get();
 
foreach (var obj in processList)
{
    string cmdLine = obj.GetPropertyValue("CommandLine").ToString();
    string handle = obj.GetPropertyValue("Handle").ToString();
}
Dans l'exemple ci-dessus, je récupère les informations pour les processus ayant pour nom "notepad.exe". Pour info, j'ai auparavant lancé un processus visant notepad.exe (tu peux te servir du code posté ici précédemment).

Dans la variable cmdLine, il je récupère la commande qui a servi a lancer le processus (donc avec les paramètres s'il y en a).
Dans la variable handle, je récupère l'ID du process.

Une série d'articles à voir sur CodeProject :
Working With Windows Management Instrumentation (WMI) - Part 1
Working With Windows Management Instrumentation (WMI) - Part 2
Working With Windows Management Instrumentation (WMI) - Part 3
Working With Windows Management Instrumentation (WMI) - Part 4
DotNetMatt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/09/2012, 08h33   #20
Tarmineldur
Candidat au titre de Membre du Club
 
Femme
Étudiant
Inscription : septembre 2012
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2012
Messages : 54
Points : 13
Points : 13
Merci beaucoup de ta réponse. Il semblerait effectivement que la voix mixte ne mène nulle part. Quant à la classe Process, elle semble un peu faible.
Vive WMI !
Je m'en vais donc chercher dans cette voix.
Tarmineldur est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 02h02.


 
 
 
 
Partenaires

Hébergement Web