VBA命令行对象请求登录,等待用户输入

时间:2017-08-07 10:51:30

标签: vba cmd word-vba filesystemobject

我编写了一个脚本,通过命令行提示从程序中获取一些信息。 只要您登录程序我就会尝试从中提取信息,从而获取信息。

这就是我连接程序的方式:

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> (*****):

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

我已经尝试检查返回字符串&#34;输入密码&#34;,但由于调用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

有没有办法检查命令窗口是否在等待用户输入(如上例所示),如果是,请将命令窗口置于前面并要求用户输入密码? 如果可能的话,宏应该在之后顺利运行。

感谢提前输入任何内容!

编辑:由于我尝试运行的命令不常见,请考虑运行&#34; runas&#34;通过宏命令。 runas将类似地提示输入密码,例如:

runas /noprofile /user:Administrator cmd

EDIT2: 每次提供凭据的问题如下: 在您成功输入密码后,请求密码的程序会保存密码以登录服务器。这意味着下次您必须输入它(在最好的情况下)是三个月后标准密码轮换要求您为您的用户帐户设置新密码。因此,每隔一段时间输入一次密码真的很烦人,因为每三个月它都不起作用..

1 个答案:

答案 0 :(得分:1)

如果“shell卡在等待用户输入”,那么可能没有一个简单的解决方案.... VBA不是多线程的,所以如果shell .Exec正在等待用户输入,没有错误已被提出,执行正在进行中。不幸的是,这意味着您不能“破解”该线程并使用FindWindow或其他API调用来操作CMD窗口。

一种方法是将AppWinStyle arguments中的一个传递给Exec语句(另请参阅:this vb.net answer),以便最大化CMD窗口,以便立即执行无论凭证检查如何,用户都可以看到。这样,如果登录失败,他们将看到它并有机会回复它。