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