我需要从一个Windows脚本,但经典的“第一谷歌的结果”的做法中得到了用户的身份验证凭据:
SET /P USR=Username:
SET /P PWD=Password:
不到满足,所以如果有我们说的“相当于” HTML的输入型=“密码”我想知道?
任何意见将非常感激,感谢很多提前!
我需要从一个Windows脚本,但经典的“第一谷歌的结果”的做法中得到了用户的身份验证凭据:
SET /P USR=Username:
SET /P PWD=Password:
不到满足,所以如果有我们说的“相当于” HTML的输入型=“密码”我想知道?
任何意见将非常感激,感谢很多提前!
看看这个
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:设备。
的"for /f "delims=" %%i in ('cscript /nologo GetPwd.vbs') do set passwd=%%i"
语句是最棘手的位。 它运行没有微软广告(VBScript的/nologo
),因此,唯一的线路输出是密码(从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
文件从Windows\System32
的XP系统文件夹,或Windows 2003系统的Winnt\System32
或Windows\System32
您的Windows 2000或Vista系统上的文件夹中。 一旦DLL已被复制,则需要通过运行以下命令进行注册:
regsvr32 scriptpw.dll
要成功注册了Vista计算机上的DLL,你需要打开命令提示符作为管理员。 要做到这一点,单击开始| 所有程序| 配件。 然后在命令提示符快捷方式在命令提示符下以管理员身份单击鼠标右键,选择“以管理员身份运行。”有一次,你就可以成功运行
regsvr32 scriptpw.dll
命令注册DLL。
1.Pure批次的解决方案 ,(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
使用一个HTA弹出2.Password提交 。 这是一个hybrit .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 Framework但那而不是一个问题:
@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) 。
问候,迪沃
如果你可以安装Cygwin,你会得到默认的是bash shell,所以这个命令将工作:
阅读-s -p“密码:”密码
唯一的问题是现在的密码值仅在bash shell中设置,而不是作为一个环境变量的批处理文件可以看到(不使用PWD,因为这意味着在Cygwin的别的东西)。 所以,你将不得不重写你的脚本作为一个bash shell脚本(也许不是太难给出命令提示符的局限性!)。
或者你也可以通过密码进入cygwin的版本批处理脚本,但是这意味着运行命令提示符的新实例:
CMD /cyourbatchfile.bat $ PASSWORD
一切有点令人费解,而不是在所有的满意;)
我们做的东西像这一切的时候,但在命令行把密码并将其传递给在批处理文件中的变量。
另一种选择是我的EditV32(86)或EditV64(x64)的命令行工具。 例如:
editv32 -m -p "Password: " PWD
-m
是指“掩蔽的输入”和-p
是提示。 用户的输入被存储在PWD环境变量。 你可以在这里得到它:
http://www.westmesatech.com/editv.html
另一种方法是调用PowerShell
从你的命令Batch
脚本。 下面是配置服务的登录帐户的例子:
$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
(在我的例子一样)调用或将其存储在一个环境变量,然后从你的批处理脚本中使用它。 我preffer前者,因为它更安全,更简单。
另一种选择是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.西湖写了一个免费的工具。 这是标准的Windows命令集的扩展版本。
ConSet.exe - 显示,设置或删除CMD.EXE环境变量,修改控制台的参数,并执行浮点数学。
因为它不是一个标准的Windows控制台应用程序,该工具的使用与批处理文件要求要么这个工具的分布一起或工具存储在服务器共享和批处理文件,直接从服务器共享调用该工具。
ConSet使得与分配给一个环境变量很容易隐藏输入密码字符串的提示:
ConSet.exe /PH "PWD=Password: "
附加参数H
导致隐藏用户输入。