PSTools - PSExec über Process starten und Befehle übergeben
-
Hallo,
Meine momentanen Mittel
- Visual Studio 2010 Express
- PSExec
- Computer auf dem das Programm läuft
- Notebook als ZielrechnerQuellen
- PSExec http://technet.microsoft.com/en-us/sysinternals/bb897553
- Process Klasse http://msdn.microsoft.com/de-de/library/ccf1tfx0.aspxZiel
Mein Ziel ist es mithilfe von PSExec, die CMD auf einem Zielrechner zu starten, diesem einige Befehle zu übergeben und die Ausgabe die man eigentlich auf der CMD sehen würde danach weiter zu verarbeiten.Momentane Situation
Ich habe es momentan mit Hilfe der Klasse Process geschafft, ein neuen Prozess zu starten und diesem die Parameter zur Herstellung einer Verbindung zum Zielrechner und starten der CMD zu übergeben.
So weit so gut...
Problem
Ich weiss nicht, wie ich nach dem Verbinden zum Zielrechner Befehle zum Prozess schicken kann, damit diese so ausgeführt werden, als ob ich sie in die CMD eintippen würde.
Versuch 1 (Lokale CMD als Prozess starten und in den Stream schreiben)
/ Test.cpp : main project file. #include "stdafx.h" using namespace System; using namespace System::Diagnostics; using namespace System::IO; void GetSystemInfos(String ^hostname) { Process ^process = gcnew Process(); process->StartInfo->FileName = "cmd.exe"; process->StartInfo->UseShellExecute = false; process->StartInfo->RedirectStandardOutput = true; process->StartInfo->RedirectStandardInput = true; process->StartInfo->CreateNoWindow = false; process->Start(); StreamWriter ^sw = process->StandardInput; sw->WriteLine("getmac"); sw->WriteLine("ipconfig /all"); sw->Close(); StreamReader ^sr = process->StandardOutput; while(String ^line = sr->ReadLine()) Console::WriteLine(line); process->Close(); } int main(array<System::String ^> ^args) { GetSystemInfos("Target"); Console::ReadLine(); return 0; }
Dies Funktioniert die Befehle werden nacheinander ausgeführt und die Ausgabe kann ich dann in der Konsole meines Programmes sehen.
Versuch 2 (CMD des Zielrechners über PSExec starten)
// Test.cpp : main project file. #include "stdafx.h" using namespace System; using namespace System::Diagnostics; using namespace System::IO; void GetSystemInfos(String ^hostname) { Process ^process = gcnew Process(); process->StartInfo->FileName = "psexec.exe"; process->StartInfo->Arguments = "\\\\hostname cmd -u username -p password"; process->StartInfo->UseShellExecute = false; process->StartInfo->RedirectStandardOutput = true; process->StartInfo->CreateNoWindow = false; process->Start(); StreamReader ^sr = process->StandardOutput; while(String ^line = sr->ReadLine()) Console::WriteLine(line); process->Close(); } int main(array<System::String ^> ^args) { GetSystemInfos("Target"); Console::ReadLine(); return 0; }
Das Funktioniert ebenso, sobald die Verbindung hergestellt wurde, kann ich ganz normal in die Konsole meines Programmes Befehle eintippen und diese werden auf dem Zielrechner ausgeführt.
// Test.cpp : main project file. #include "stdafx.h" using namespace System; using namespace System::Diagnostics; using namespace System::IO; void GetSystemInfos(String ^hostname) { Process ^process = gcnew Process(); process->StartInfo->FileName = "psexec.exe"; process->StartInfo->Arguments = "\\\\hostname cmd -u username -p password"; process->StartInfo->UseShellExecute = false; process->StartInfo->RedirectStandardOutput = true; process->StartInfo->RedirectStandardInput = true; process->StartInfo->CreateNoWindow = false; process->Start(); StreamWriter ^sw = process->StandardInput; sw->WriteLine("getmac"); sw->Close(); StreamReader ^sr = process->StandardOutput; while(String ^line = sr->ReadLine()) Console::WriteLine(line); process->Close(); } int main(array<System::String ^> ^args) { GetSystemInfos("Target"); Console::ReadLine(); return 0; }
Ab hier wenn ich versuche den StreamWriter zu benutzen, steht in der Konsole dass die CMD auf dem Zielrechner gestartet wird und nichts anderes mehr. Ich kann nichts in der Konsole eintippen und das Programm schein auch nicht wirklich weiter zu arbeiten, wie ich beim Debuggen feststellen konnte. Vor der While Anweisung bleibt das Programm stehen, stürzt aber nicht ab.
Ich hoffe, dass das Ausführlich genug ist und ihr etwas damit Anfangen könnt.
Grüsse
Aero