我编写了一个脚本,通过命令行提示从程序中获取一些信息。 只要您登录程序我就会尝试从中提取信息,从而获取信息。
这就是我连接程序的方式:
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: 每次提供凭据的问题如下: 在您成功输入密码后,请求密码的程序会保存密码以登录服务器。这意味着下次您必须输入它(在最好的情况下)是三个月后标准密码轮换要求您为您的用户帐户设置新密码。因此,每隔一段时间输入一次密码真的很烦人,因为每三个月它都不起作用..
答案 0 :(得分:1)
如果“shell卡在等待用户输入”,那么可能没有一个简单的解决方案.... VBA不是多线程的,所以如果shell .Exec
正在等待用户输入,没有错误已被提出,执行正在进行中。不幸的是,这意味着您不能“破解”该线程并使用FindWindow
或其他API调用来操作CMD窗口。
一种方法是将AppWinStyle
arguments中的一个传递给Exec语句(另请参阅:this vb.net answer),以便最大化CMD窗口,以便立即执行无论凭证检查如何,用户都可以看到。这样,如果登录失败,他们将看到它并有机会回复它。