3

我有一个 Windows exe,它显示一些版权信息,连接到服务器,然后提示输入用户名和密码。

所以每当我运行它时,我都必须等待提示输入用户名和密码。我一般在命令开始显示版权信息后先输入用户名、密码,但这是一种粗略的方式。

有没有更好的方法在批处理文件中将参数传递给 windows 命令的输入提示,这样我就可以避免总是输入它们?

PS 在 Linux 中,我们使用 << 操作符来做到这一点,就像这样

linux_command <<delimiter
inputparamvalue1
inputparamvalue2
delimiter

linux_command 将运行,在第一个输入提示符下,它读取 inputparamvalue1,在下一个输入提示符下,它读取 inputparamvalue2

作为对詹姆斯的回应,感谢您提供有关安全性的建议。我会处理的。

我试图实施您的解决方案,但没有奏效。

这些是我的文件。请看看你是否得到任何提示。

vpn.bat

@ echo off    
"C:\Program Files (x86)\Cisco\Cisco AnyConnect VPN Client\vpncli.exe" connect "mycompanyvpnsite.com"

登录.txt

myusername  
mypassword

启动VPN.bat

@ECHO OFF  
CALL vpn.bat < login.txt  
ECHO I'm back!

结果

D:\>startvpn.bat  
Cisco AnyConnect VPN Client (version 2.5.6005) .  

Copyright (c) 2004 - 2010 Cisco Systems, Inc.  
All Rights Reserved.  


  >> state: Disconnected  
  >> notice: Ready to connect.  
  >> registered with local VPN subsystem.  
  >> state: Disconnected  
  >> notice: Ready to connect.  
VPN>   >> contacting host (mycompanyvpnsite.com) for login information...  
  >> notice: Contacting mycompanyvpnsite.com.  
VPN>  
  >> Please enter your username and password.  

Username: [myusername] Password:  

它显示的用户名 myusername 是从我以前的手动登录中缓存的。因此,这次运行似乎没有从 login.txt 中获取任何值。
如果我在没有任何参数的情况下单独执行了我的 vpn.bat,我会得到这样的提示

VPN>  
  >> Please enter your username and password.  

Username: [myusername] <i press enter to take the cached value>  
Password: ******** <i enter password and press enter>  

它连接起来。

vpn 客户端没有权限在命令行上指定密码,这就是我尝试这种方式的原因。

4

2 回答 2

2

我有一个工作代码!它与 James K 的相似,但有一些错误被敲定。我想再次重申,这是相当不安全的,因为它会将您的密码暴露在未加密的设置中。话虽如此:

'Anyconnect login script
Dim oShell
Set oShell = WScript.CreateObject("WScript.Shell")

' rather clunky way of selecting the correct directory - open to suggestion
oShell.Run "cmd /k cd %PROGRAMFILES(x86)%\Cisco & cd Cisco* & vpncli.exe connect MYCOMPANYVPN.COM"

' sleep of 100 neccessary or else it opens multiple cmd windows
Wscript.sleep 100

' activate correct window
oShell.AppActivate "Connect"

' optional ipsec Identifier used for multiple VPN profiles on the same server
'(if you don't have one, just comment this out)
oShell.SendKeys "IPSECID{ENTER}"

' Send Username and Password to Active Window.
oShell.SendKeys "USERNAME{ENTER}"
oShell.SendKeys "USERPASSSWORD{ENTER}"

oShell.SendKeys "exit{ENTER}"

祝你好运!

于 2013-03-30T18:57:50.077 回答
1

将您的用户名和密码保存在一个文件中以自动执行登录过程是一个非常糟糕的主意,并且会使需要用户名和密码提供的任何安全性无效,因为任何获得对您计算机的电子或物理访问权限的人都可以访问您的纯文本用户名和密码。

也就是说,在 DOS / Windows 命令提示符中,您将需要一个包含您的用户名和密码的额外文件,如下所示:

LOGIN.TXT

MyUserName
MyPassword

然后将该文件通过管道传输到您的命令中,如下所示:

@ECHO OFF
CALL Command_Or_Batch < login.txt
ECHO I'm back!

这将就像您在控制台并键入一样MyUserName[ENTER] MyPassword[ENTER]

login.txt只是一个普通的文本文件,不需要.txt扩展名,或者根本不需要任何扩展名。

CALL语句仅在启动另一个批处理文件时才需要,如果您希望它在完成后继续在原始调用批处理文件中执行。CALL调用可执行文件(批处理文件以外的任何内容)时,使用没有区别。


编辑:根据您的评论,我相信您需要这样做才能使其正常工作:

@ echo off    
"C:\Program Files (x86)\Cisco\Cisco AnyConnect VPN Client\vpncli.exe" connect "mycompanyvpnsite.com" < login.txt

在这种情况下,您将重定向到您的vpncli.exe,但我相信这会产生副作用,即vpncli.exe 接受来自 的输入,而在退出login.txt之前根本不接受来自键盘的输入。vpncli.exe这意味着您需要自动化(存储在login.txt)您通常需要输入的所有内容。这应该不是问题,除非您vpncli.exe以后需要手动交互。


编辑:由于vpncli.exe似乎在读取任何击键之前清除了缓冲区,我建议可能使用 VBS 可能会让你到达你想去的地方。

VPN.VBS
'VBScript 示例集 WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run "C:\Program Files (x86)\Cisco\Cisco AnyConnect VPN Client\vpncli.exe connect mycompanyvpnsite.com"

' You need to know the name of the window, It should be in the upper left corner
' I'm guessing that it will be the filename of the executible
WshShell.AppActivate "vpncli.exe"

' Send Username and Password to Active Window.
WshShell.SendKeys "MyUserName{ENTER}"
WshShell.SendKeys "MyPassword{ENTER}"

但我不能确定。我在测试这个时遇到了问题,尽管我只是在批处理文件和 VBS 脚本之间来回切换。

虽然我知道您是否将WshShell.RunWshShell.AppActivate替换为以下两行...

WshShell.Run "%windir%\notepad.exe"
WshShell.AppActivate "Notepad"

...记事本将打开,将出现以下两行:

MyUserName
MyPassword

如果这对您不起作用,我正在考虑完全删除此答案,因为它仅包含无效的建议。

于 2012-08-31T03:04:52.197 回答