对于HTML的输入类型=“密码”,Windows批处理等价物是什么?

时间:2008-11-13 13:12:02

标签: windows batch-file passwords cmd

我需要从Windows脚本中获取用户的身份验证凭据,但需要使用经典的“首次Google结果”方法:

SET /P USR=Username: 
SET /P PWD=Password: 

不太令人满意,所以我想知道是否让我们说“等同于” HTML的输入类型=“密码”

任何评论都会非常感谢,非常感谢!

12 个答案:

答案 0 :(得分:5)

看看这个

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

答案 1 :(得分:4)

通过明智地使用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对象。默认情况下,在Windows XP和Windows 2003上加载ScriptPW。如果您运行的是Windows 2000或Windows Vista,则需要从XP系统的scriptpw.dll文件夹或Windows中复制Windows\System32文件2003系统到Windows 2000或Vista系统上的Winnt\System32Windows\System32文件夹。复制DLL后,您需要通过运行命令注册它:

     

regsvr32 scriptpw.dll

     

要在Vista计算机上成功注册DLL,您需要以管理员身份打开命令提示符。为此,请单击“开始”|所有课程|配件。然后右键单击“命令提示符”快捷方式并选择“以管理员身份运行”。以管理员身份运行命令提示符后,您将能够成功运行regsvr32 scriptpw.dll命令来注册DLL。

答案 2 :(得分:2)

1.纯批处理解决方案(ab)使用XCOPY命令及其/P /L转换找到here

:: 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弹出窗口的密码提交者This is a 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. A self-compiled .net hybrid 。应该保存为.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);

答案 3 :(得分:1)

我假设你不想在屏幕上回显密码。

如果弹出窗口适合您,您可以使用例如VBScript显示一个显示密码字段的IE窗口。这是一个example

作为替代方案,您可以从HTA(HTML应用程序)文件中调用脚本(请参阅Introduction to HTML Applications (HTAs)

此致 DIVO

答案 4 :(得分:1)

如果您可以安装Cygwin,默认情况下您将获得一个bash shell,因此该命令将起作用:

read -s -p“密码:”密码

现在唯一的问题是PASSWORD的值只在bash shell中设置,而不是批处理文件可以看到的环境变量(不要使用PWD,因为这意味着cygwin中的其他内容)。因此,您必须将脚本重写为bash shell脚本(考虑到命令提示符的限制,可能不会太难!)。

或者您可以将密码从cygwin传递到批处理脚本中,但这意味着运行命令提示符的新实例:

cmd /cyourbatchfile.bat $ PASSWORD

有点令人费解,完全不满意;)

答案 5 :(得分:1)

我们一直这样做,但是把密码放在命令行中,并将其传递给批处理文件中的变量。

答案 6 :(得分:0)

另一种选择是我的EditV32(x86)或EditV64(x64)命令行工具。例如:

editv32 -m -p "Password: " PWD

-m表示“屏蔽输入”,提示符为-p。用户的输入存储在PWD环境变量中。你可以在这里得到它:

http://www.westmesatech.com/editv.html

答案 7 :(得分:0)

另一种方法是从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调用中使用密码(如我的示例中所示)或将其存储在环境变量中,然后在批处理脚本中使用它。我喜欢前者,因为它更安全,更简单。

答案 8 :(得分:0)

另一种选择是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

答案 9 :(得分:0)

您可以对所有类型的格式化输入使用ReadFormattedLine子例程。例如,下面的命令读取每个8个字符的用户名和密码,在屏幕上显示星号,并自动继续,无需按Enter键:

call :ReadFormattedLine USR="********" /M "Username: "
call :ReadFormattedLine PWD="********" /M "Password: "

或以不同的方式:

call :ReadFormattedLine nameAndPass="******** / ********" /M "Enter Username / Password: "

在前面的例子中,当用户完成用户名时,子程序显示斜杠并读取密码;如果用户删除字符,斜杠也会自动删除。

这个子程序是用纯批处理编写的,所以它不需要任何额外的程序,它允许几个格式化的输入操作,如只读数字,将字母转换为大写等。您可以从Read a line with specific format下载ReadFormattedLine子程序

答案 10 :(得分:0)

ConSet是由Frank P. Westlake编写的免费工具。它是标准Windows命令设置的扩展版本。

  

ConSet.exe - 显示,设置或删除cmd.exe环境变量,修改控制台参数,并执行浮点数学。

由于它不是标准的Windows控制台应用程序,因此使用此工具需要将此工具与批处理文件一起分发,或者该工具存储在服务器共享上,批处理文件直接从服务器调用此工具份额。

ConSet 会提示输入密码字符串,其中隐藏的输入很容易分配给环境变量:

ConSet.exe /PH "PWD=Password: "

附加参数H会导致隐藏用户输入。

答案 11 :(得分:0)

我编写了一个名为editenv的开源工具,该工具替代了以前的editv32 / editv64实用程序:

https://github.com/Bill-Stewart/editenv

它提供了--maskinput-m)选项[*],可用于隐藏键入的输入。示例:

editenv -m -p "Password: " PWD

此命令显示一个Password:提示符,并将您输入的内容放在PWD环境变量中。

在这里下载:

https://github.com/Bill-Stewart/editenv/releases

[*]请注意,--maskinput-m)选项不安全-输入的输入在环境中以纯文本格式放置。此功能仅是为了方便。