我需要从Windows脚本中获取用户的身份validation凭据,但需要经典的“Google结果”方法:
SET /P USR=Username: SET /P PWD=Password:
是不是令人满意,所以我想知道是否有一个“等效” HTMLinputtypes=“密码” ?
任何评论将非常感激,多谢提前!
看看这个
http://www.netikka.net/tsneti/info/tscmd052.htm
@echo off & setlocal enableextensions :: Build a Visual Basic Script set vbs_=%temp%\tmp$$$.vbs set skip= findstr "'%skip%VBS" "%~f0" > "%vbs_%" :: :: Prompting without linefeed as in Item #15 echo.|set /p="Password: " :: Run the script with Microsoft Windows Script Host Version 5.6 for /f "tokens=* delims=" %%a in ('cscript //nologo "%vbs_%"') do set MyPass1=%%a :: ::echo. echo.|set /p="Retype : " for /f "tokens=* delims=" %%a in ('cscript //nologo "%vbs_%"') do set MyPass2=%%a :: :: Clean up for %%f in ("%vbs_%") do if exist %%f del %%f :: :: Demonstrate the result echo. if "%MyPass1%"=="%MyPass2%" ( echo The entered password was %MyPass1% ) else ( echo No match) endlocal & goto :EOF ' 'The Visual Basic Script Set WshPass = WScript.CreateObject("ScriptPW.Password") 'VBS Password=WshPass.GetPassWord() 'VBS WScript.Echo PassWord 'VBS
通过明智地使用Windows上免费提供的另一个工具,以下两个脚本可完成所需的工作。
首先,GetPwd.cmd:
@echo off :: GetPwd.cmd - Get password with no echo. <nul: set /p passwd=Password: for /f "delims=" %%i in ('cscript /nologo GetPwd.vbs') do set passwd=%%i echo. :: This bit's just to prove we have the password. echo %passwd%
然后,GetPwd.vbs:
' GetPwd.vbs - Get password with no echo then echo it. ' Set oScriptPW = CreateObject("ScriptPW.Password") strPassword = oScriptPW.GetPassword() Wscript.StdOut.WriteLine strPassword
说明:
GetPwd.vbs只是使用密码对象从用户输入密码,然后打印到标准输出(下一段将解释为什么不显示在终端中)。
GetPwd.cmd有点棘手(但通常是命令脚本)。
"<nul: set /p passwd=Password: "
命令只是简单地输出没有结尾的CR / LF的提示 – 这是一种模仿bash的"echo -n"
的偷偷摸摸的方式。 它将passwd
设置为空字符串作为副作用,并且不会等待输入,因为它正在从nul:device中获取输入。
"for /f "delims=" %%i in ('cscript /nologo GetPwd.vbs') do set passwd=%%i"
语句是最棘手的位。 它运行没有Microsoft广告( /nologo
)的vbscript,所以唯一的行输出是密码(来自vbscript "Wscript.StdOut.WriteLine strPassword"
。
将分隔符设置为空,需要用空格捕获输入行,否则只需要输入第一个单词。 "for ... do set ..."
设置passwd
为vbscript输出的实际密码。
然后,我们回显一个空白行(实际上终止"Password: "
行)并回显密码,以便您可以验证它的工作原理:
C:\Pax> GetPwd Password: this is my password C:\Pax>
scriptpw.dll可用于XP和2K3,但不一定是更高版本。
Vista和Win7的说明如下,给他们一个尝试:
为了掩盖密码,脚本利用ScriptPW COM对象。 ScriptPW在Windows XP和Windows 2003上默认加载。如果您运行的是Windows 2000或Windows Vista,则需要将
scriptpw.dll
文件从XP系统的Windows\System32
文件夹或Windows 2003系统复制到您的Windows 2000或Vista系统上的Winnt\System32
或Windows\System32
文件夹。 一旦DLL被复制,您将需要通过运行以下命令来注册它:
regsvr32 scriptpw.dll
要在Vista机器上成功注册DLL,您需要以管理员身份打开命令提示符。 为此,请单击开始| 所有程序| 配件。 然后,右键单击命令提示符快捷方式,选择“以管理员身份运行”。以管理员身份进入命令提示符后,您将能够成功运行
regsvr32 scriptpw.dll
命令来注册该DLL。
1. (ab)使用XCOPY
命令及其/P /L
开关的纯批处理解决方案 :
:: Hidden.cmd ::Tom Lavedas, 02/05/2013, 02/20/2013 ::Carlos, 02/22/2013 ::https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/f7mb_f99lYI @Echo Off :HInput SetLocal EnableExtensions EnableDelayedExpansion Set "FILE=%Temp%.\T" Set "FILE=.\T" Keys List >"%File%" Set /P "=Hidden text ending with Ctrl-C?: " <Nul Echo. Set "HInput=" :HInput_ For /F "tokens=1* delims=?" %%A In ( '"Xcopy /P /L "%FILE%" "%FILE%" 2>Nul"' ) Do ( Set "Text=%%B" If Defined Text ( Set "Char=!Text:~1,1!" Set "Intro=1" For /F delims^=^ eol^= %%Z in ("!Char!") Do Set "Intro=0" Rem If press Intro If 1 Equ !Intro! Goto :HInput# Set "HInput=!HInput!!Char!" ) ) Goto :HInput_ :HInput# Echo(!HInput! Goto :Eof
2.使用HTA弹出窗口的密码提交者 。 这是一个.bat / jscript / mshta文件,应保存为.bat:
<!-- : :: PasswordSubmitter.bat @echo off for /f "tokens=* delims=" %%p in ('mshta.exe "%~f0"') do ( set "pass=%%p" ) echo your password is %pass% exit /b --> <html> <head><title>Password submitter</title></head> <body> <script language='javascript' > function pipePass() { var pass=document.getElementById('pass').value; var fso= new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1); close(fso.Write(pass)); } </script> <input type='password' name='pass' size='15'></input> <hr> <button onclick='pipePass()'>Submit</button> </body> </html>
3. 一个自编译的.net混合文件,另外应该保存为.bat
。与其他解决方案不同的是,它会创建/编译一个小的.exe文件,这个文件将被调用(如果你希望删除的话)。 还需要安装.NET框架,但这不是一个问题:
@if (@X)==(@Y) @end /* JScript comment @echo off setlocal for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d /o:-n "%SystemRoot%\Microsoft.NET\Framework\*jsc.exe"') do ( set "jsc=%%v" ) if not exist "%~n0.exe" ( "%jsc%" /nologo /out:"%~n0.exe" "%~dpsfnx0" ) for /f "tokens=* delims=" %%p in ('"%~n0.exe"') do ( set "pass=%%p" ) echo your password is %pass% endlocal & exit /b %errorlevel% */ import System; var pwd = ""; var key; Console.Error.Write("Enter password: "); do { key = Console.ReadKey(true); if ( (key.KeyChar.ToString().charCodeAt(0)) >= 20 && (key.KeyChar.ToString().charCodeAt(0) <= 126) ) { pwd=pwd+(key.KeyChar.ToString()); Console.Error.Write("*"); } } while (key.Key != ConsoleKey.Enter); Console.Error.WriteLine(); Console.WriteLine(pwd);
我假设你不需要在屏幕上回显密码。
如果弹出式窗口对您来说可以,您可以使用例如VBScript来显示一个显示密码字段的IE窗口。 这是一个例子 。
作为替代,您可以从HTA(HTML应用程序)文件中调用脚本(请参阅HTML应用程序简介(HTA)) 。
问候,divo
如果你可以安装Cygwin,默认情况下会得到一个bash shell,所以这个命令可以工作:
阅读-s -p“密码:”密码
现在唯一的问题是PASSWORD的值只能在bash shell中设置,而不能作为批处理文件可以看到的环境变量(不要使用PWD,因为这意味着cygwin中的其他内容)。 所以你将不得不重写你的脚本作为bash shell脚本(可能不太难给予命令提示符的限制!)。
或者你可以将密码从cygwin传递给批处理脚本,但这意味着运行命令提示符的新实例:
cmd /cyourbatchfile.bat $密码
都有点复杂,一点也不令人满意;)
我们一直这样做,但将密码放在命令行中,并将其传递给批处理文件中的变量。
另一种选择是我的EditV32(x86)或EditV64(x64)命令行工具。 例如:
editv32 -m -p "Password: " PWD
-m
表示“屏蔽输入”, -p
表示提示。 用户的输入存储在PWD环境变量中。 你可以在这里得到它:
另一种方法是从Batch
脚本中调用PowerShell
命令。 以下是配置服务的登录帐户的示例:
$password = Read-Host "Enter password" -AsSecureString; $decodedpassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)); & "sc.exe" config THE_SERVICE_NAME obj= THE_ACCOUNT password= $decodedPassword;
其中THE_SERVICE_NAME是要配置的服务的名称,THE_ACCOUNT是登录帐户。
然后我们可以从批处理脚本中使用它:
call powershell -Command "$password = Read-Host "Enter password" -AsSecureString; $decodedpassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)); & "sc.exe" config THE_SERVICE_NAME obj= THE_ACCOUNT password= $decodedPassword;"
它只是调用PowerShell.exe并传递三个命令。
这种方法的优点是今天的大部分Windows安装包括PowerShell
,所以不需要额外的程序或脚本。 缺点是你需要在PowerShell
调用中使用密码(比如在我的例子中),或者将它存储在一个环境变量中,然后在你的批处理脚本中使用它。 我假装前者是因为它更安全,更简单。
另一种选择是ReadLine.exe 。 例:
@echo off setlocal enableextensions set PASSWORD= for /f "delims=" %%p in ('readline -h -p "Enter password: "') do set PASSWORD=%%p echo You entered: %PASSWORD% endlocal
您可以使用ReadFormattedLine子例程来处理所有类型的输入。 例如,下面的命令读取每个8个字符的用户名和密码,在屏幕上显示星号,并自动继续,不需要按Enter键:
call :ReadFormattedLine USR="********" /M "Username: " call :ReadFormattedLine PWD="********" /M "Password: "
或者以不同的方式:
call :ReadFormattedLine nameAndPass="******** / ********" /M "Enter Username / Password: "
在前面的示例中,当用户完成用户名时,子例程显示斜线并读取密码; 如果用户删除了字符,斜线也会自动删除。
这个子程序是用纯批量编写的,因此它不需要任何额外的程序,它允许进行多种格式化的输入操作,比如只读数字,将字母转换为大写等等。您可以通过读取具有特定格式的行下载ReadFormattedLine子例程。
ConSet是由Frank P. Westlake编写的免费工具。 它是标准Windows命令集的扩展版本。
ConSet.exe – 显示,设置或删除cmd.exe环境变量,修改控制台参数并执行浮点数学运算。
由于它不是标准的Windows控制台应用程序,因此使用此工具需要将此工具与批处理文件一起分发,或者该工具存储在服务器共享中,批处理文件直接从服务器共享中调用此工具。
ConSet提供了一个密码字符串,其中隐藏的输入分配给一个环境变量非常简单:
ConSet.exe /PH "PWD=Password: "
附加参数H
导致隐藏用户输入。