8
votes

Problèmes avec stdout et psexec.exe de Sysinternals

J'ai recherché et j'ai lu sur les problèmes avec Psexec.exe à partir de Sysinternals ne fonctionne pas correctement avec C # et STDOUT. J'essaie maintenant de comprendre comment appeler simplement un fichier de commandes qui possède ce qui suit au lieu d'utiliser System.Diagnostics.Process à appeler PSEXEC:

Test.Bat contient la ligne suivante: P>

ipconfig /all >c:\test.txt

c#

6 commentaires

Que se passe-t-il si vous avez fait psexec_run.startinfo.arguments = @ "\\ hostname -u utilisateur -P mot de passe ipconfig / tout> c: \ test.txt"


Parfois, il y a aussi une sortie sur stardr ... alors peut-être que vous avez peut-être besoin d'une deuxième erreur de diffusion de P.Standard et de la lire aussi.


1. Utiliser> C: \ Test.txt ne fonctionne pas, je l'ai même essayé sur une simple commande ipconfig et ne génère pas le fichier, je ne sais pas pourquoi.


2. J'ai essayé de lire la sortie STDRERR et il y avait une sortie de sortie, seulement 1 ligne, tout comme avec stdout a donné ... La sortie de StDerr n'était que la ligne montrant le copyright de l'application etc.


Voir ma mise à jour à ma question initiale. THX


BTW, il n'y a pas de "c Sharp". La langue est nommée "C #".


5 Réponses :


1
votes

Êtes-vous sûr que votre sourcecode est correct? Ce lien est un peu vieux .. Peut-être que c'est corrigé!

Heres un exemple de redirection de la sortie standard et de mettre une sortie entière dans une chaîne via StreamReader: P>

        ProcessStartInfo psi = new ProcessStartInfo("tftp.exe");

        // preferences for tftp process
        psi.CreateNoWindow = true;
        psi.RedirectStandardOutput = true;
        psi.RedirectStandardError = true;
        psi.UseShellExecute = false;

        Process p = Process.Start(psi);

        StreamReader myStreamReader = p.StandardOutput;

        p.WaitForExit();

        // Read the standard output of the spawned process.                
        string sOutput = myStreamReader.ReadToEnd();


5 commentaires

Hey Thx pour une réponse rapide .. j'ai essayé cela et cela n'a pas fonctionné voir mon édition ci-dessus à ma question initiale. Il a juste accroché le code et si j'ai commenté CreateNowindow, j'ai vu la fenêtre juste accrocher, quand j'ai fermé que le code informatique continue et qu'il a obtenu la première ligne de l'IPConfig, donc c'est un grand bond en avant :) mais pas complet. toute aide supplémentaire serait bonne que j'ai passé 2 jours à ce sujet


Votre processus commence, mais n'a pas attendu la sortie. (Dans votre dernier code ajouté-échantillon)


J'ai édité mon échantillon de code. Après l'initialisation du StreamReader avec la liaison de la sortie, vous devez attendre la sortie. Ensuite, vous devriez être capable de lire à la fin.


Etrange, à tout moment que j'utilise Wattiforexit (), la ligne CMD Hors est-elle semble-t-elle. Si j'utilise Fermer (), je reçois la sortie, mais si j'utilise juste ipconfig à partir de l'hôte local, je reçois toute la sortie, si Psexec doit exécuter IPConfig ON Hôte distante, je viens de recevoir la première ligne au lieu de toutes les sorties ??? :( Je ne sais pas siéger pour pleurer ou rire


Vous avez certainement besoin de la méthode d'attente Porexit, car la production doit être remplie. Sinon, vous le lisez directement après le début du processus .. Donc, il ne peut donc pas y avoir de STD-OU à ce moment-là. Avez-vous déjà défini Createnowindow à False? Peut-être que le processus psexec ne finit pas sans une entrée ?!



1
votes

J'ai trouvé une solution. Apparemment, Psexec ne va pas fonctionner dans c Sharp. J'ai donc proposé un code WMI pour vous connecter à un hôte distant et cela fonctionne parfaitement !!! :)

J'ai utilisé Microsoft's Wmicodecreator.exe pour créer un code WMI pour C # pour la méthode de processus sur un hôte distant, WOW Cet outil est incroyable car le code WMI me dérouit peu.


0 commentaires

0
votes

La sortie de Psexec va à StandardError et non à StandardOutput. Je ne sais pas pourquoi c'est comme ça. Suivi de code d'extrait d'accès.

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.RedirectStandardError = true;

Process process = new Process();
process.StartInfo = startInfo;
process.Start();
process.WaitForExit();

errors = process.StandardError.ReadToEnd();

process.Close();


0 commentaires

2
votes

J'ai une réponse à ce problème qui a travaillé pour moi.

Espérons que quelqu'un d'autre le trouvera utile. P>

J'ai littéralement passé les deux dernières heures à déchirer mes cheveux avec ceci. L'outil PSEXEC fonctionne complètement à l'aide d'une invite de commande normale, mais lors de la tentative de redirection des flux, il tronque la sortie et vous obtenez uniquement la moitié de la sortie. P>

à la fin comment j'ai réparé mon problème. un hack. J'ai pipé la sortie de la commande à un fichier texte et lisez-le pour le retourner à partir de la fonction. P>

Je dois aussi définir l'userShelexecute sur true. Sans cela, cela ne fonctionnerait toujours pas. Cela a eu l'effet secondaire malheureux de montrer la fenêtre de la console. Pour contourner ce que j'ai défini le style de la fenêtre pour être masqué et bon presto, ça marche !!! P>

Heres Mon code: P>

string command = @"psexec.exe -l -u domain\username -p password /accepteula \\192.168.1.3 netstat -a -n";

ExecutePSExec(command);


0 commentaires

2
votes

J'avais exactement le même problème. Je recevais "Windows IP Config." Comme première ligne lorsque je cours avec Psexec. J'ai essayé avec Paexec, cela a bien fonctionné. J'ai utilisé le code de Marius.

Remarque: Si vous n'utilisez pas la commande CMD / C en arguments uniquement sur l'ordinateur local, même si vous définissez la cible comme \\ remoteserver p>

 ProcessStartInfo psi = new ProcessStartInfo("cmd.exe");
                        psi.Arguments = @"cmd/c C:\paexec.exe \\\192.168.2.5 -s  -u test.local\administrator -p Password1 cmd /c ipconfig";
                        psi.CreateNoWindow = true;
                        psi.RedirectStandardOutput = true;
                        psi.RedirectStandardError = true;
                        psi.UseShellExecute = false;
                        Process p = Process.Start(psi);

                        System.IO.StreamReader myStreamReader1 = p.StandardOutput;

                        p.WaitForExit();


                        string sOutput = myStreamReader1.ReadToEnd();


1 commentaires

Exactement la même histoire ici. Psexec émettait juste la première ligne et non le reste. Tout essayé mais paexec a résolu le problème.