2017-08-07 107 views
4

我編寫了一個腳本,通過命令行提示從程序中獲取一些信息。 只要您登錄到程序中,就可以獲取信息,我試圖從中提取信息。VBA命令行對象請求登錄,等待用戶輸入

這是我如何連接到程序:

Set Appl = CreateObject("WScript.Shell").Exec("cmd.exe im connect") 

返回(如果你沒有登錄): (請注意:這是理論上的輸出,如果我手動鍵入命令進入一個命令窗口)

Connecting to <some server or another>... 
Authentication failed for <user: me> on <some server or another> 
Enter password for <user: me> on <some server or another> (*****): 

這就是我的宏被卡住的地方。

我試着檢查返回字符串「輸入密碼」,但由於調用shell的文件系統對象卡住等待用戶輸入,我無法真正做到這一點。

因此,所有的這是行不通的:

Set ApplOutput = Appl.StdOut 
While Not ApplOutput.AtEndOfStream 
    sLine = ApplOutput.ReadLine 
    If Left(sLine, 14) = "Enter password" Then 
     MsgBox ("ERROR!!" & vbCrLf & "Please login to the Integrity Client") 
    End If 
Wend 

有沒有什麼辦法來檢查命令窗口等待用戶輸入(如上面的情況下),如果是把命令窗口前面並要求用戶輸入他們的密碼? 如果可能,宏應該在平穩運行之後。

感謝您提前提出任何意見!

編輯:由於我試圖運行的命令不是很常見,請考慮通過宏運行「runas」命令的問題。該運行方式將相若方式被提示輸入密碼,如:

runas /noprofile /user:Administrator cmd 

EDIT2: 與提供的憑據每次都是以下問題: 程序請求口令保存後您登錄到服務器的密碼已經成功輸入了一次。這意味着下次必須輸入密碼時(最好的情況下)是三個月後,當標準密碼輪換要求您爲用戶帳戶設置新密碼時。因此,每次都必須輸入密碼真的很煩人,因爲每三個月它就不能工作。

+0

有趣的問題,值得StackOverflowers關注。可悲的是,我沒有一個模仿行爲的命令行程序。 –

+0

如果「外殼卡住等待用戶輸入」,那麼可能不會有簡單的解決方案.... VBA不是多線程的,所以如果外殼「.Exec」正在等待用戶輸入,則沒有錯誤發生,執行正在進行中。您不能「破解」該線程並使用「FindWindow」或其他API調用來操縱CMD窗口等。 –

+0

是否可以簡單地向「Shell.Execute」提供憑據(即假設用戶必須*總是*輸入憑據)以避免這種情況/問題?我想,這就是我將如何處理它。 –

回答

1

如果「shell卡住等待用戶輸入」,那麼可能並不簡單解決方案.... VBA不是多線程的,所以如果shell .Exec正在等待用戶輸入,則沒有錯誤發生,並且正在執行。不幸的是,這意味着您無法「破解」該線程,並使用FindWindow或其他API調用來操縱CMD窗口。

一種方法,將通過AppWinStyle arguments之一exec語句(參見:this vb.net答案),以最大限度的CMD窗口,以便它會立即對用戶可見不論憑證檢查。這樣,如果登錄失敗,他們會看到它並有機會迴應。

+0

訣竅!非常感謝! – budekatude