Laden...

CMD aufrufen und automatische Antwort senden

Erstellt von chriz257 vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.378 Views
C
chriz257 Themenstarter:in
3 Beiträge seit 2018
vor 5 Jahren
CMD aufrufen und automatische Antwort senden

Hi Zusammen, ich hoffe Ihr könnt mir helfen.

Ich baue gerade für die Firma eine GUI für die SSH Einwahlmethode via plink.
Aufgerufen wird das ganze mit folgendem Befehl:

plink.exe -L 3391:HOSTNAME:3389 -P PORT -l USERNAME@DOMAIN -pw PASSWORT

Das ganze per C# abzusetzen ist kein Problem und mache ich folgendermaßen:


System.Diagnostics.Process process = new System.Diagnostics.Process();
                    System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                    //startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
                    startInfo.FileName = "cmd.exe";
                    startInfo.Arguments = "/K \"" +  Application.StartupPath + "\\plink.exe\" -L 3391:" + COMPUTERNAME + ":3389 -P PORT -l " + USERNAME + DOMAIN + " -pw " + textBox4.Text;
                    process.StartInfo = startInfo;
                    process.Start();
                    startmstsc(this, null);

Das Klappt auch soweit und die Verbindung bleibt auch erfolgreich bestehen.
Jetzt zum eigentlichen Problem an dem ich schon ne ganze weile meinen Kopf zerbreche:
Es soll nun zusätzlich ein zweiter Faktor abgefragt werden, dieser wird direkt nach Eingabe des o.g. Befehlt abgefragt. Ich gebe den zweiten Faktor ein und drücke Enter, dann besteht die Verbindung.

Wie schicke ich das nun aber über CMD bzw C# raus?

Ich habe es mit folgender Ergänzung probiert:


System.Diagnostics.Process process = new System.Diagnostics.Process();
                    System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                    //startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
                    startInfo.FileName = "cmd.exe";
                    startInfo.Arguments = "/K \"" + "echo " + ZWEITFAKTORKEY + "|" + Application.StartupPath + "\\plink.exe\" -L 3391:" + COMPUTERNAME + ":3389 -P PORT -l " + USERNAME + DOMAIN + " -pw " + textBox4.Text;
                    process.StartInfo = startInfo;
                    process.Start();
                    startmstsc(this, null);

(echo am Anfang.) Das klappt auch und die Verbindung wird erfolgreich aufgebaut, jedoch gleich wieder beendet. Das verhält sich genauso, wenn ich es direkt in die CMD reinkloppe.

Ich vermute, dass durch dieses echo * am Anfang, eine Art Termination o.ä. mitgeschickt wird und dadurch der Prozess plink gleich wieder abgeschossen wird.

Vielleicht gibt es auch eine Möglichkeit den ersten Befehl abzusetzen und mittels SendKeys in das CMD Fenster (welches unsichtbar ist) den zweiten Faktor zu übermitteln?

Bisschen blöd das Problem zu erklären, aber ich hoffe es versteht jemand und kann eventuell helfen.

Lg, Chris

4.939 Beiträge seit 2008
vor 5 Jahren

Dies sollte mittels Process.StandardInput gehen:


startInfo.RedirectStandardInput = true;

// ...

process.StandardInput.WriteLine("test");

C
chriz257 Themenstarter:in
3 Beiträge seit 2018
vor 5 Jahren
Danke!

Wahnsinn - doch so simpel.
Vielen Dank, damit hat es letztendlich geklappt.

Ich habe zuerst die folgende exception bekommen:

System.InvalidOperationException: Für das Prozessobjekt muss die UseShellExecute-Eigenschaft auf "false" festgelegt sein, um IO-Streams umzuleiten.

konnte diesen Fehler aber mit


startInfo.UseShellExecute = false;

beseitigen.

Vielen Dank Th69 !

Aaaber...
leider kann ich nun das CMD Fenster nicht mehr ausblenden wegen dem UseShellExecute = false.
Dadurch ird, wie es aussieht

startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

ignoriert.

Ich kann es zwar mit /min bestimmt minimiert starten, aber ich würde das Konsolenfenster gerne komplett ausgeblendet haben...

Hat mit hier auch jemand einen Tipp?

C
chriz257 Themenstarter:in
3 Beiträge seit 2018
vor 5 Jahren

ok, selbst rausgefunden.
Klappt mit

startInfo.CreateNoWindow = true;

Vielen Dank nochmal. Schließe nun hier