.NET: Injizieren von Daten in den Eingabepuffer des Prozesses

Ich muss eine Befehlszeilenanwendung automatisieren. Der Benutzer wird aufgefordert, ein Passwort einzugeben. Alle meine Versuche, das Passwort über STDIN zu senden, sind fehlgeschlagen. Jetzt versuche ich dies mit einem Wrapper-Programm unter Verwendung von .NET zu tun.

Ich starte die Anwendung und erstelle einen neuen ProzessStartInfo-properties und starte dann den Prozess:

Dim app_path As String
Dim app_args As String
Dim myProcess As Process = New Process()
myProcess.StartInfo.FileName = app_path
myProcess.StartInfo.Arguments = app_args
myProcess.StartInfo.UseShellExecute = False
myProcess.Start()

Ich habe versucht, die zu verwendenStartInfo.RedirectStandardInput Habe aber keinen Erfolg.

Jetzt bin ich über die gekommenWriteConsoleInput Funktion von derkernel32.dll das habe ich so aufgenommen:

Declare Function WriteConsoleInput Lib "kernel32.dll" Alias "WriteConsoleInputA" (ByVal hConsoleInput As Integer, ByVal lpBuffer As String, ByVal nNumberOfCharsToWrite As Integer, ByRef lpNumberOfCharsWritten As Integer) As Boolean

Ich kann den Prozess über das Internet abwickelnmyProcess.Handle Eigentum. Es war aber auch nicht möglich, auf diese Weise Eingaben in den Eingabepuffer zu senden.

Ich habe diese Fragen gefunden, aber sie haben nicht geholfen:

Wie schreibe ich "PAGE DOWN" in den Eingabepuffer der Konsole? (1475353)

Java - Eingabe an externe C / C ++ - Anwendung übergeben (1421273)

Steuern einer Windows-Konsolenanwendung mit stdin-Pipe (723424)

Mit StraceNtX.exe habe ich diese Ausgabe für den Moment, in dem die App auf Eingabe wartet:

[T4024] GetConsoleMode(f, 12d35c, 12d3af, 77bff894, ...) = 1
[T4024] SetConsoleMode(f, 0, 12d3af, 77bff894, ...) = 1
[T4024] ReadConsoleInputA(f, 12d348, 1, 12d360, ...) = 1

Kann mir jemand sagen, was man noch probieren soll oder wie man das oben richtig macht? Vielen Dank!

Basierend auf Tim Robinsons Antwort habe ich diesen Code jetzt, aber es funktioniert nicht:

myProcess = New Process()
myProcess.StartInfo.FileName = app_path
myProcess.StartInfo.Arguments = app_args
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal
myProcess.StartInfo.UseShellExecute = False
myProcess.Start()
' Wait for process requesting passwort input
System.Threading.Thread.Sleep(3000)
Dim len As Integer
len = 0
Dim handle As Integer
handle = GetStdHandle(STD_INPUT_HANDLE)
WriteConsoleInput(handle, "Test", 4, len)

Mein Programm ist eine Befehlszeilenanwendung, die als Wrapper fungieren soll.

Die Eingabe wird gesendet, jedoch so, dass sie nicht in das Passwortfeld eingegeben wird, sondern dass unterhalb des Passwortfelds eine neue Eingabeaufforderung angezeigt wird (ohne die Eingabe überhaupt anzuzeigen).

Tim, kannst du mir ein Beispiel geben?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage