2010-01-19 9 views
11

Ich habe es schwer gehabt, die Ausgabe eines "Unterprozesses" zu erhalten (einer intern von einem Blackbox-Prozess gestartet, den ich über C# System überwache). Diagnostics.Process)C#: Redirect Standardausgabe eines Prozesses, der bereits ausgeführt wird

Ich nahm den Rat von der Antwort meiner früheren Post gegeben: here. Und dort findest du die Details von dem, was ich durchgemacht habe.

An dieser Stelle, obwohl ich in der Lage bin, den ssh-Prozess zu finden, der von process1.exe hervorgebracht wurde, die ich überwache. Ich kann die Ausgabe nicht in mein C# -Programm umleiten, weil es ein "bereits laufender Prozess" ist und nicht direkt von C# gestartet wurde.

Es scheint, dass alle Eigenschaften, die Sie für ein System.Diagnostics.Process-Objekt festlegen, nur wirksam werden, wenn Sie diesen Prozess explizit von Ihrer C# -Anwendung aus starten. Wenn ein anderer "nicht verwalteter Prozess" den Prozess gestartet hat, hat das Festlegen dieser Umleitung keine Auswirkungen, da der Prozess bereits von etwas gestartet wurde, das die erforderliche Umleitung nicht angibt.

Gibt es eine Möglichkeit, die Ausgabe eines Prozesses umzuleiten, der bereits gestartet wurde (ein Prozess, der von einem Programm gestartet wurde, für das ich keinen Spielraum habe, die Umleitung vor dem Start dieses Prozesses vorzugeben)?

Antwort

1

Anstatt die Ausgabe direkt vom laufenden Prozess umzuleiten, können Sie die Ausgabe erfassen, wenn sie den Prozess A am beabsichtigten Zielort verlässt, und den Prozess an Ihren neuen Prozess weitergeben?

+0

Wie ist das möglich? Ich leite bereits alle Ausgaben von process1.exe zu meiner C# -Anwendung um. An dem Punkt, dass Prozess1 ssh.exe (process2) intern startet, erhalte ich 3 Zeilen mehr Ausgabe von process1, und dann hört die Ausgabe auf, weil process2 die einzige Ausgabe ist (ich vermute), und ich kann process2's nicht umleiten Ausgabe, weil es intern von process1 gestartet wird (für die ich Umleitung nicht steuern kann). –

2

Angenommen, es gibt keine einfachere Lösung, könnten Sie versuchen, ein Stück Code in einem anderen Prozess durch CreateRemoteThread() auszuführen, erklärte here.

1

Vielleicht können Sie sich das code ansehen. Ich habe es gefunden, als ich nach einer Lösung für die gleiche Sache suchte; es war jedoch nicht wirklich interprozessual.

Wenn das nicht hilft, können Sie P/Invoking SetStdHandle und GetStdHandle betrachten, die beim Umleiten der Standardausgabe verwendet werden sollen. Ich denke, das ist der Code, mit dem das Codebeispiel verknüpft ist, um die Weiterleitung zu ermöglichen.

Hinweis: Ich habe mir nur dieses Zeug angeschaut und es nicht wirklich richtig funktionieren lassen. (Ich hatte eine bessere Lösung für mich, weil ich Zugriff auf den Quellcode hatte, der an die Konsole ausgegeben wurde)

+0

Während nicht vollständig getestet (oder wirklich funktionierende AFAIR): http://pastebin.com/m13ab7101 Dies ist, was ich basierend auf dem 'SetStdHandle' Zeug entwickelt hatte. HTH! – cmw