我需要自動執行命令行應用程序。它要求用戶輸入密碼。我所有的通過STDIN發送密碼失敗。現在我試圖用一個使用.NET的包裝程序來做到這一點。.NET:將數據注入進程的輸入緩衝區
我開始了應用程序創建一個新的進程,設置StartInfo
-Properties,然後啓動過程:
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)
爪哇 - 傳遞輸入到外部的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
誰能告訴我,還有什麼嘗試或如何做正確的方式上面? 謝謝!
基於蒂姆·羅賓遜的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)
我PROGRAMM是一個命令行應用程序,它應該作爲包裝行事。
輸入是發送的,但不是輸入到密碼字段中,而是在密碼字段下面顯示一個新的promt(甚至沒有顯示輸入)。
蒂姆,你能舉個例子嗎?
什麼是需要密碼的應用程序?可能比這更容易。 – 2009-12-07 11:23:27
這是思科證書管理器控制檯應用程序cisco_cert_mgr.exe 但我沒有搜索任何不同的解決方案,但似乎沒有。 – sc911 2009-12-07 13:11:31