Utiliser process avec psexec

Signaler
Messages postés
125
Date d'inscription
dimanche 28 février 2010
Statut
Membre
Dernière intervention
21 juin 2015
-
Messages postés
125
Date d'inscription
dimanche 28 février 2010
Statut
Membre
Dernière intervention
21 juin 2015
-
Bonjour tous le monde, je suis entrain (j'essaye) de faire un petit programme pour gérer l'utilitaire "PsExec" via C# pour que sa soit plus sympa. J'arrive a utiliser Process (en général) avec les .exe de Windows mais je n'y arrive pas avec PsExec :(, il me renvoi l'erreur, "fichier introuvable", pour information, PsExec est un .exe qui se place dans system32. (A savoir , j'ai essayé aussi en entrant l'adresse complète (C:\Windows\system32\PsExec.exe). Voici le code :




using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;


namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void onoff_CheckedChanged(object sender, EventArgs e)
        {
            if (onoff.Checked == true)
            {
                login.ReadOnly = false;
                mdp.ReadOnly = false;
            }
            else
            {
                login.ReadOnly = true;
                mdp.ReadOnly = true;
            }
        }

        private void psexec_CheckedChanged(object sender, EventArgs e)
        {
            if (psexec.Checked == true)
            {
                arguments.ReadOnly = false;
            }
            else
            {
                arguments.ReadOnly = true;
            }
        }

//DEBUT DU PROGRAMME APRES CLICK SUR VALIDER

        private void button1_Click(object sender, EventArgs e)
        {      
            string Sip = ip.Text;
            string Slogin = login.Text;
            string Smdp = mdp.Text;

            if (onoff.Checked == true)
            {
                ProcessStartInfo startcmd = new ProcessStartInfo("cmd");
                startcmd.WindowStyle = ProcessWindowStyle.Minimized;
                startcmd.Arguments = "psexec \" + Sip + " -u " + Slogin + " -p " + Smdp + " ipconfig /all";
                Process.Start(startcmd);
            }
            else
            {
                ProcessStartInfo startcmd = new ProcessStartInfo("cmd");
                startcmd.WindowStyle = ProcessWindowStyle.Minimized;
                startcmd.Arguments = "psexec \" + Sip +" ipconfig /all";
                Process.Start(startcmd);
            }
        }
    }
}

Voila,
Merci d'avance.





Linux c'est une question de VI ou de MORE !
Si Bill Gates donnait du lait à ses programmeurs, ça ferait peut-être des OS costaud.

20 réponses

Messages postés
125
Date d'inscription
dimanche 28 février 2010
Statut
Membre
Dernière intervention
21 juin 2015
2
Zut y'a pas d’édit ??
J'ai oublier de préciser, "PsExec" ne marche que depuis "cmd", on ne peux pas (a ma connaissance) le lancer directement.

Linux c'est une question de VI ou de MORE !
Si Bill Gates donnait du lait à ses programmeurs, ça ferait peut-être des OS costaud.
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Salut,

"on ne peut pas à ma connaissance [..]", t'as tenté au cas où quand même ? Perso j'ai fait un petit test avec le client mysql (en ligne de commandes également), et le code qui suit fonctionne :

	ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "mysql";
psi.Arguments = "-h localhost -u root -proot awtt";
psi.WorkingDirectory = @"C:\Programmes\MySQL\MySQL Server 5.5\bin";
Process proc = Process.Start(psi);
Messages postés
125
Date d'inscription
dimanche 28 février 2010
Statut
Membre
Dernière intervention
21 juin 2015
2
Salut jopop,
J'avais essayé comme ça aussi, mais il me dit toujours que le fichier est introuvable
:(.
Si ta une autre idée je suis partant :).
Merci d'avance


Linux c'est une question de VI ou de MORE !
Si Bill Gates donnait du lait à ses programmeurs, ça ferait peut-être des OS costaud.
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Tu peux déjà vérifier que ton system32 est référencé dans ton %PATH% (mais à part modif perso il devrait y être).

Tu peux aussi tenter de te positionner sur le bon répertoire avant l'exécution de la commande via le membre ProcessStartInfo.WorkingDirectory (cf. mon exemple plus haut).

Je récupère PsTools pour regarder ça de plus près.
Messages postés
125
Date d'inscription
dimanche 28 février 2010
Statut
Membre
Dernière intervention
21 juin 2015
2
J'ai vérifié mon %PATH% system32 y est bien référencé (de plus tous les .exe fonctionnent mis à part psexec :( )

J'ai vu ProcessStartInfo.WorkingDirectory je l'ai essayé mais ça ne change pas, fichier introuvable.

            ProcessStartInfo psi = new ProcessStartInfo();
            psi.FileName = "PsExec";
            psi.Arguments = "ipconfig";
            psi.WorkingDirectory = @"C:\Windows\System32";
            Process.Start(psi);


Je te remercie de ton aide, tu verras (si tu ne le connais pas) c'est un utilitaire vraiment sympa.

Linux c'est une question de VI ou de MORE !
Si Bill Gates donnait du lait à ses programmeurs, ça ferait peut-être des OS costaud.
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Re

c'est un utilitaire qui a l'air effectivement sympa, même si je pense pas trop en avoir l'utilité personnellement. Sinon, j'ai ça qui fonctionne :

	ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "PsExec.exe";
psi.Arguments = "\\\\PCHP013 b.bat";
psi.WorkingDirectory = @"C:\Temp\Nouveau dossier";
proc = Process.Start(psi);


- j'ai dézippé les PsTools dans C:\Temp\Nouveau dossier
- PCHP013 est le nom de ma machine (j'allais pas embêter les collègues pour un test ^^) ; à noter le doublement des backslashes ;)
- b.bat est un mini fichier batch créé pour l'occasion qui ne fait rien (affiche une ânerie puis attend la touche Entrée).
Messages postés
125
Date d'inscription
dimanche 28 février 2010
Statut
Membre
Dernière intervention
21 juin 2015
2
Salut jojop !

désolé d'avoir mit du temps a répondre, j'ai quitter le boulot à mon dernier édit.

Alors ça marche bien !
Par contre il me faudrait, je pense,
l’équivalent de Console.ReadLine() dans mon contexte, car le dos se ferme directement.

ET je vais essayer d'abuser un peu si tu pouvais m'expliquer rapidement, pourquoi mettre ceci et pourquoi avec celui ci ça marche ? : \\\\PCHP013
(j'aime bien comprendre, et comme c'est pas évident de rechercher cela sur le net :s )

EN tous cas , merci pour ton aide, ca fonctionne et ca fait bien plaisir .

Linux c'est une question de VI ou de MORE !
Si Bill Gates donnait du lait à ses programmeurs, ça ferait peut-être des OS costaud.
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Re re,

pour le backslash, il faut savoir qu'il s'agit du caractère d'échappement. Il permet d'insérer des caractères spéciaux, ex. :
	\t correspond à une tabulation
\n correspond à un saut de ligne
\0 correspond à la fin de la chaîne de caractère
\\ correspond à la représentation d'un backslash


On peut d'ailleurs voir qu'on utilise une astuce récente dans notre assignation de la variable membre WorkingDirectory. En plaçant un "@" devant la chaîne de caractère on prévient le compilo qu'il ne faut pas surinterpréter les backslashes, fréquent dans un chemin physique sous Windows.

la commande sous DOS
	> psexec \\PC app.exe

doit donc être écrite en C#.. comme suit :
	string pse = "psexec \\\\PC app.exe";


NB : le backslash est le caractère d'échappement de beaucoup de langage : C/C++, C#, Java ...

PS : si ta question portait sur PCHP013, il s'agit en fait du nom de ma machine.
si ta question est sur l'utilité de l'argument \\PCHP013 dans la commande PsExec, j'ai juste suivi les instructions ^^
Messages postés
125
Date d'inscription
dimanche 28 février 2010
Statut
Membre
Dernière intervention
21 juin 2015
2
Ah que tous est plus clair .
IL me semblait bien que le // était pour l’échappement , perso j'utilisais que @ donc j’étais pas sur sur . pour le nom du pc j'avais compris, j'avais pas compris le fait d'utiliser ////le_nom au lieu de @ip mais maintenant ça va mieux .
Effectivement avec le string ça marche mieux pour l'affichage .
Merci beaucoup pour ton aide !
Au plaisir de te re-croiser sur le forum !

Linux c'est une question de VI ou de MORE !
Si Bill Gates donnait du lait à ses programmeurs, ça ferait peut-être des OS costaud.
Messages postés
125
Date d'inscription
dimanche 28 février 2010
Statut
Membre
Dernière intervention
21 juin 2015
2
Arf désolé Jojop , je t’embêtes encore mais , en faite j'ai parlé trop vite :( .

Ton code marche niquel , mais pour les retours ça me pose un soucis,
en gros je lance le programme et je souhaite afficher le résultat dans un richtextbox (vu que les fenêtres DOS se ferme directement après l’exécution de la commande),
pour cela j'ai utilisé les commandes I/O , qui fonctionne bien avec les classic .exe de system32 (ipconfig et tous les cousins) mais pas avec psexec !! (fichier introuvable encore !) tien voici le code, si tu vois l'erreur :


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;


namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void onoff_CheckedChanged(object sender, EventArgs e)
        {
            if (onoff.Checked == true)
            {
                login.ReadOnly = false;
                mdp.ReadOnly = false;
            }
            else
            {
                login.ReadOnly = true;
                mdp.ReadOnly = true;
            }
        }

        private void psexec_CheckedChanged(object sender, EventArgs e)
        {
            if (psexec.Checked == true)
            {
                arguments.ReadOnly = false;
                valider.Visible = true;
            }
            else
            {
                arguments.ReadOnly = true;
            }
        }

//DEBUT DU PROGRAMME APRES CLICK SUR VALIDER

        private void valider_Click(object sender, EventArgs e)
        {   
        //Varibales  
            string Sip = ip.Text;
            string Slogin = login.Text;
            string Smdp = mdp.Text;
            string Sargu = arguments.Text;

        //Psexec ###################################################################################     
            if (psexec.Checked true && onoff.Checked true)
            {
                ProcessStartInfo psi = new ProcessStartInfo();
                psi.FileName = "PsExec.exe";
                psi.Arguments = "\\\"+Sip+" -u "+Slogin+" -p "+Smdp+" "+Sargu;
                psi.WorkingDirectory = @"C:\Windows\Temp\psexec";
                Process.Start(psi);
            }
            else
            {

              //Processus startinfo
                ProcessStartInfo processStartInfo = new ProcessStartInfo();
                processStartInfo.WorkingDirectory = @"C:\Windows\Temp\psexec";
                processStartInfo.FileName = "PsExec.exe";
                processStartInfo.Arguments = "\\\" + Sip + " " + Sargu;
                processStartInfo.UseShellExecute = false;
                processStartInfo.RedirectStandardInput = true;
                processStartInfo.RedirectStandardOutput = true;

              //Lance le processus
                Process process = new Process();
                process.StartInfo = processStartInfo;
                bool processStarted = process.Start();

              //Renvoie les données
                StreamReader outputReader = process.StandardOutput;
                process.WaitForExit();

              //Affiche le resultat
                string displayText = "Output" + Environment.NewLine + "==============" + Environment.NewLine;
                displayText += outputReader.ReadToEnd();
                displayText += Environment.NewLine + "==============" + Environment.NewLine;
                resultat.Text = displayText;

            }


Merci d'avance, pour ton aide et ta patience.


Linux c'est une question de VI ou de MORE !
Si Bill Gates donnait du lait à ses programmeurs, ça ferait peut-être des OS costaud.
Messages postés
125
Date d'inscription
dimanche 28 février 2010
Statut
Membre
Dernière intervention
21 juin 2015
2
En faite dans mon code, si je ne rajoute pas,


                processStartInfo.UseShellExecute = false;
                processStartInfo.RedirectStandardInput = true;
                processStartInfo.RedirectStandardOutput = true;


Il fonctionne correctement, mais si je les rajoutes , il me renvoie l'erreur :
Fichier introuvable. Si ça peux aider .

Merci

Linux c'est une question de VI ou de MORE !
Si Bill Gates donnait du lait à ses programmeurs, ça ferait peut-être des OS costaud.
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Salut,

j'ai pas eu le temps de regarder et je t'avouerai que je suis pas sûr de le trouver rapidement. Juste une remarque rapidement, dans valider_Click, il y a une erreur dans ta condition if :
psexec.Checked = true
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Mince ! Les boutons de mise en forme et de preview marchent plus chez moi.
J'ai tenté d'envoyer pour voir si ça ça marchait et du coup mon message est incomplet.

Je voulais dire que psexec.Checked true renvoie toujours true , car il s'agit d'une assignation (manque un '').
Messages postés
125
Date d'inscription
dimanche 28 février 2010
Statut
Membre
Dernière intervention
21 juin 2015
2
Salut salut jojop.
Pas grave, si tu as des idées ! Qu'importe le temps que cela met, tu m'aides et c'est déjà génial , parce que je me sent seul sinon .
Avec le '=' j'ai corriger , mais ça fonctionnait quand même .
Sinon pour l’exécution du programme, le problème reste le même . Tans que je rajoute :

processStartInfo.UseShellExecute = false;
processStartInfo.RedirectStandardInput = true;
processStartInfo.RedirectStandardOutput = true;

le fichier dans :

bool processStarted = process.Start();

est introuvable ! je comprend vraiment pas pourquoi .
Sinon si je met pas les Input Output , ça marche niquel .


Linux c'est une question de VI ou de MORE !
Si Bill Gates donnait du lait à ses programmeurs, ça ferait peut-être des OS costaud.
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Il se pourrait que ce soit un problème de droit, à tester. As-tu tenté de lancer ton appli (dans sa version "fichier introuvable") en "exécutant en tant qu'administrateur", pour voir ?
Messages postés
125
Date d'inscription
dimanche 28 février 2010
Statut
Membre
Dernière intervention
21 juin 2015
2
Ah savoir, je travail en Admin , mais j'ai essayé tous de même , voici ce que ca me ressort :


Consultez la fin de ce message pour plus de détails sur l'appel du débogage
juste-à-temps (JIT) à la place de cette boîte de dialogue.

************** Texte de l'exception **************
System.ComponentModel.Win32Exception (0x80004005): Le fichier spécifié est introuvable
à System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)
à System.Diagnostics.Process.Start()
à WindowsFormsApplication1.Form1.valider_Click(Object sender, EventArgs e) dans C:\Users\Administrateur\Desktop\c#\soft\soft\Form1.cs:ligne 83
à System.Windows.Forms.Control.OnClick(EventArgs e)
à System.Windows.Forms.Button.OnClick(EventArgs e)
à System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
à System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
à System.Windows.Forms.Control.WndProc(Message& m)
à System.Windows.Forms.ButtonBase.WndProc(Message& m)
à System.Windows.Forms.Button.WndProc(Message& m)
à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
à System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** Assemblys chargés **************
mscorlib
Version de l'assembly : 4.0.0.0
Version Win32 : 4.0.30319.237 (RTMGDR.030319-2300)
CodeBase : file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
----------------------------------------
soft
Version de l'assembly : 1.0.0.0
Version Win32 : 1.0.0.0
CodeBase : file:///C:/Users/Administrateur/Desktop/c%23/soft/soft/obj/x86/Debug/soft.exe
----------------------------------------
System.Windows.Forms
Version de l'assembly : 4.0.0.0
Version Win32 : 4.0.30319.235 built by: RTMGDR
CodeBase : file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
Version de l'assembly : 4.0.0.0
Version Win32 : 4.0.30319.1 built by: RTMRel
CodeBase : file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System
Version de l'assembly : 4.0.0.0
Version Win32 : 4.0.30319.236 built by: RTMGDR
CodeBase : file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Windows.Forms.resources
Version de l'assembly : 4.0.0.0
Version Win32 : 4.0.30319.1 built by: RTMRel
CodeBase : file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_fr_b77a5c561934e089/System.Windows.Forms.resources.dll
----------------------------------------
mscorlib.resources
Version de l'assembly : 4.0.0.0
Version Win32 : 4.0.30319.235 (RTMGDR.030319-2300)
CodeBase : file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_fr_b77a5c561934e089/mscorlib.resources.dll
----------------------------------------

************** Débogage JIT **************
Pour activer le débogage juste-à-temps (JIT), le fichier de configuration pour cette
application ou cet ordinateur (machine.config) doit avoir la valeur
jitDebugging définie dans la section system.windows.forms.
L'application doit également être compilée avec le débogage
activé.

Par exemple :

<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>

Lorsque le débogage juste-à-temps est activé, les exceptions non gérées
seront envoyées au débogueur JIT inscrit sur l'ordinateur
plutôt que d'être gérées par cette boîte de dialogue.



Linux c'est une question de VI ou de MORE !
Si Bill Gates donnait du lait à ses programmeurs, ça ferait peut-être des OS costaud.
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Tu développes en te connectant en Super Admin ? pas bien ^^
Pour le JIT, ça sert à rien de l'activer, la dialogbox te montre la pile d'erreur c'est bien suffisant.

Sinon là je vois pas bien le souci hormis un pb de droit.
Ou alors PsExec ne tournerait pas en-dehors d'un shell ? ça m'étonnerait franchement.
En tout cas j'ai le même comportement que toi sur mon projet de test, à gratter.
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
J'ai trouvé (mais j'ai pas de super explication).
Il faut mettre le chemin complet pour le nom de l'exe, genre :
processStartInfo.FileName = "C:\\psexefolder\\psexec.exe";

Et d'un coup d'un seul, plus d'erreur.

Faudrait retrouver la bonne KB de la MSDN qui nous expliquerait le pourquoi du comment. En attendant tu dois pouvoir avancer dans ton dev ;)
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Encore moi,

la fiche de la MSDN sur l'attribut UseShellExecute, extrait :
When UseShellExecute is false, the WorkingDirectory property is not used to find the executable. Instead, it is used only by the process that is started and has meaning only within the context of the new process. When UseShellExecute is false, the FileName property must be a fully qualified path to the executable.
Messages postés
125
Date d'inscription
dimanche 28 février 2010
Statut
Membre
Dernière intervention
21 juin 2015
2
Coucou jojop, je t'ai pas répondus parce que je bossais dessus, ça marche pas vraiment pour l'instant mais je vais essayer déjà avec les pistes que tu m'as donné et je te tiendrais au courant .


Linux c'est une question de VI ou de MORE !
Si Bill Gates donnait du lait à ses programmeurs, ça ferait peut-être des OS costaud.