コマンド ライン アプリケーションを自動化する必要があります。ユーザーにパスワードの入力を求めます。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)
stdin パイプを使用した 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
他に何を試すべきか、または上記を正しい方法で行う方法を誰か教えてもらえますか? ありがとう!
Tim Robinsons answere に基づいて、このコードを取得しましたが、機能しません:
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)
私のプログラムは、ラッパーとして機能するコマンドライン アプリケーションです。
入力は送信されますが、パスワード フィールドに入力されるのではなく、パスワード フィールドの下に新しいプロンプトが表示されます (入力を表示することさえありません)。
ティム、例を挙げてくれる?