.NET: ввод данных в буфер ввода процесса
Мне нужно автоматизировать приложение командной строки. Он просит пользователя ввести пароль. Все мои попытки отправить пароль через STDIN не удалось. Теперь я пытаюсь сделать это с помощью программы-оболочки, используя .NET.
Я запускаю приложение, создавая новый процесс, устанавливаяStartInfo
-свойства, а затем начать процесс:
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()
Я пытался использоватьStartInfo.RedirectStandardInput
Собственность, но без успеха.
Теперь я пришел черезWriteConsoleInput
функция отkernel32.dll
что я включил так:
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
Я могу получить управление процессом черезmyProcess.Handle
свойство. Но отправка ввода во входной буфер таким способом также была невозможна.
Я нашел эти вопросы, но они не помогли:
Как мне записать «PAGE DOWN» во входной буфер консоли? (1475353)
Java - передача ввода во внешнее приложение C / C ++ (1421273)
Управление консольным приложением Windows с помощью стандартного канала (723424)
Используя StraceNtX.exe, я получил этот вывод в тот момент, когда приложение ожидает ввода:
[T4024] GetConsoleMode(f, 12d35c, 12d3af, 77bff894, ...) = 1
[T4024] SetConsoleMode(f, 0, 12d3af, 77bff894, ...) = 1
[T4024] ReadConsoleInputA(f, 12d348, 1, 12d360, ...) = 1
Может кто-нибудь сказать мне, что еще попробовать или как сделать выше, правильно? Спасибо!
Основываясь на ответе Тима Робинсона, я получил этот код сейчас, но он не работает:
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)
Моя программа представляет собой приложение командной строки, которое должно действовать как оболочка.
Входные данные отправляются, но таким образом, что они не вводятся в поле пароля, а под полем пароля отображается новое приглашение (даже без ввода).
Тим, можешь привести пример?