Laden...

Process.WaitForExit() wartet (scheinbar) nicht auf das Ende des gestarteten Prozesses

Erstellt von shad0wman vor 11 Jahren Letzter Beitrag vor 11 Jahren 3.041 Views
S
shad0wman Themenstarter:in
17 Beiträge seit 2013
vor 11 Jahren
Process.WaitForExit() wartet (scheinbar) nicht auf das Ende des gestarteten Prozesses

Hallo,

Ich habe mal beispielhaft folgenden Code:


            Process rdpConnection = new Process();
            rdpConnection.StartInfo.FileName = Environment.ExpandEnvironmentVariables( @"%SystemRoot%\system32\cmdkey.exe" );
            rdpConnection.StartInfo.Arguments = "/generic:TERMSRV/192.168.1.xxx /user:abc /pass:abc";
            rdpConnection.Start();

            rdpConnection.StartInfo.FileName = Environment.ExpandEnvironmentVariables( @"%SystemRoot%\system32\mstsc.exe" );
            rdpConnection.StartInfo.Arguments = connectionParameter;
            rdpConnection.Start();

            // rdpConnection.WaitForExit();

            rdpConnection.StartInfo.FileName = Environment.ExpandEnvironmentVariables( @"%SystemRoot%\system32\cmdkey.exe" );
            rdpConnection.StartInfo.Arguments = "/delete:TERMSRV/192.168.1.xxx";
            rdpConnection.Start();

Wie man erkennen kann, rufe ich damit eine RDP Connection auf, was auch einwandfrei funktioniert.
Was mich stört, ist daß die Zugangsdaten in der cmdkey nach dem Schliessen der RDP Connection erhalten bleiben.
Diese will ich über den dritten Block wieder entfernen.

Lasse ich allerdings das WaitForExit() weg, wie oben gezeigt, löscht er die Daten natürlich sofort, so daß ich aufgefordert werde, Benutzername und Passwort für die Verbindung anzugeben.

Setze ich das WaitForExit() ein, passiert exakt dasselbe?!
Auch folgender "trick", den ich gefunden hatte, hat nichts geholfen:

while ( !rdpConnection.HasExited );

Ich habe einige Foren-Beiträge gelesen und auch im MSDN geschaut und festgestellt, daß es nicht ganz falsch sein kann, was ich da vorhabe.

Kann mir jemand sagen, wo genau ich das nicht verstanden habe oder wo ich etwas umbauen muß?

Danke

C
258 Beiträge seit 2011
vor 11 Jahren

Das Problem ist das mstsc.exe trotz WaitForExit() sofort zurückkehrt (auch wenn das Remote Fenster noch offen ist). Kannst du mit folgendem Code ausporbieren:

Process.Start(@"C:\Windows\System32\mstsc.exe").WaitForExit();

Das Programm läuft ungebremst weiter.

Mit folgendem Code hat es funktioniert:


                Process.Start(@"C:\Windows\System32\mstsc.exe").WaitForExit();
                Process.GetProcessesByName("mstsc")[0].WaitForExit();

Wirklich schön ist das nicht und wenn bereits ein "mstsc" läuft müsste man irgendwie sicherstellen das der richtige Prozess von GetProcessesByName verwendet wird.

S
shad0wman Themenstarter:in
17 Beiträge seit 2013
vor 11 Jahren

Joa, vielen Dank, das hat schon mal gewirkt.

Wenn ich noch eine Frage bzgl. des Process Indexes stellen dürfte, gibt es ein Möglichkeit, den Index des gestarteten Prozesses herauszufinden?

So daß ich es so anwenden könnte, bspw.:


Process.getProcessByName( "mstsc" )[myProcessIndex].WaitForExit();

Der Grund ist der, daß evtl. auch mal zwei oder drei RDPs offen sein könnten...

C
258 Beiträge seit 2011
vor 11 Jahren

Okay der Grund warum der ursprünglich code nicht funktioniert ist hier beschrieben: starting-remote-desktop-client-no-control-over-pid-kill-pid-changes-after-star

Es ist auch ein Lösungsansatz beschrieben der wesentlich schöner ist als meiner 😉.