Мне нужно автоматизировать приложение командной строки. Он просит пользователя ввести пароль. Все мои подходы к отправке пароля через 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)
Моя программа представляет собой приложение командной строки, которое должно действовать как оболочка.
Ввод отправляется, но таким образом, что он не вводится в поле пароля, а под полем пароля отображается новое приглашение (даже без отображения ввода).
Тим, можешь привести пример?