.NET: inyecte datos en el buffer de entrada del proceso

Necesito automatizar una aplicación de línea de comandos. Le pide al usuario que introduzca una contraseña. Todos mis approches para enviar la contraseña vía STDIN fallaron. Ahora estoy tratando de hacer esto con un programa de envoltura usando .NET.

Estoy iniciando la aplicación creando un nuevo proceso, configurando elStartInfo-propiedades y luego iniciar el proceso:

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()

Intenté usar elStartInfo.RedirectStandardInput Propiedad pero sin éxito.

Ahora me encontré con elWriteConsoleInput función de lakernel32.dll que he incluido de esta manera:

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

Puedo obtener el manejo del proceso a través demyProcess.Handle propiedad. Pero el envío de entrada al buffer de entrada de esta manera tampoco fue posible.

Encontré esas preguntas pero no ayudaron:

¿Cómo escribo ‘PAGE DOWN’ en el búfer de entrada de la consola? (1475353)

Java: pasar la entrada a la aplicación C / C ++ externa (1421273)

Controlar una aplicación de consola de Windows con canalización estándar (723424)

Usando StraceNtX.exe obtuve esta salida en el momento en que la aplicación está esperando la entrada:

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

¿Alguien me puede decir qué más intentar o cómo hacer lo anterior de la manera correcta? ¡Gracias!

Según la respuesta de Tim Robinsons, ahora tengo este código, pero no funciona:

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)

Mi programa es una aplicación de línea de comandos que debe actuar como un contenedor.

La entrada se envía, pero de una manera que no se escribe en el campo de la contraseña, pero que debajo del campo de la contraseña se muestra un nuevo promt (sin siquiera mostrar la entrada).

Tim, ¿puedes darme un ejemplo?

Respuestas a la pregunta(2)

Su respuesta a la pregunta