我可以屏蔽bat文件中的输入文本

时间:2009-03-20 04:14:00

标签: batch-file cmd command-prompt

我正在编写一个批处理文件来执行其他一些程序。在这种情况下,我需要提示输入密码。我有办法屏蔽输入文本吗?我不需要打印*******字符而不是输入字符。 Linux的密码提示行为(在打字时不打印)就足够了。

@echo off
SET /P variable=Password : 
echo %variable%
Pause

这将读取输入,但我无法使用此方法屏蔽文本。

17 个答案:

答案 0 :(得分:140)

是的 - 我迟到了4年。

但我找到了一种方法,可以在一行中完成此操作,而无需创建外部脚本;通过从批处理文件中调用powershell命令。

感谢TessellatingHeckler - 没有输出到文本文件(我在一个变量中设置了powershell命令,因为在for循环中的一个长行中它非常混乱)。

@echo off
set "psCommand=powershell -Command "$pword = read-host 'Enter Password' -AsSecureString ; ^
    $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^
        [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""
for /f "usebackq delims=" %%p in (`%psCommand%`) do set password=%%p
echo %password%

最初我把它写成输出到文本文件,然后从该文本文件中读取。但是上面的方法更好。在一条非常漫长,近乎难以理解的路线中:

@echo off
powershell -Command $pword = read-host "Enter password" -AsSecureString ; $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword) ; [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR) > .tmp.txt & set /p password=<.tmp.txt & del .tmp.txt
echo %password%

我会打破这个 - 你可以使用插入符号^将它拆分几行,这样更好......

@echo off
powershell -Command $pword = read-host "Enter password" -AsSecureString ; ^
    $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword) ; ^
        [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR) > .tmp.txt 
set /p password=<.tmp.txt & del .tmp.txt
echo %password%

This article解释了powershell命令正在做什么;基本上它使用Read-Host -AsSecureString获取输入 - 以下两行将该安全字符串转换回纯文本,然后使用>.tmp.txt将输出(明文密码)发送到文本文件。然后将该文件读入变量并删除。

答案 1 :(得分:48)

在XP和Server 2003之前,您可以使用另一个包含的工具(VBScript) - 以下两个脚本可以完成您想要的工作。

首先,getpwd.cmd

@echo off
<nul: set /p passwd=Password: 
for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i
echo.

然后,getpwd.vbs

Set oScriptPW = CreateObject("ScriptPW.Password")
strPassword = oScriptPW.GetPassword()
Wscript.StdOut.WriteLine strPassword

getpwd.vbs只是使用密码对象从用户输入密码,然后将其打印到标准输出(下一段将解释为什么不会显示在终端中)。

getpwd.cmd命令脚本有点棘手,但基本上如下工作。

"<nul: set /p passwd=Password: "命令的效果是输出没有尾随换行符的提示符 - 这是一种模仿来自"echo -n" shell的bash命令的偷偷摸摸的方法。它将passwd设置为空字符串作为无关副作用,并且不等待输入,因为它从nul:设备获取输入。

"for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i"语句是最棘手的一点。它运行没有Microsoft“广告”的VBScript,因此唯一的行输出是密码(来自VBscript "Wscript.StdOut.WriteLine strPassword"

将分隔符设置为空,需要使用空格捕获整个输入行,否则您只需获取第一个单词。 "for ... do set ..."位将passwd设置为VBScript的实际密码输出。

然后我们回显一个空行(终止"Password: "行),密码将在代码运行后出现在passwd环境变量中。


现在,如上所述,scriptpw.dll仅适用于XP / 2003。为了解决这个问题,您只需将scriptpw.dll文件从XP / 2003系统的Windows\System32文件夹复制到您自己系统上的Winnt\System32Windows\System32文件夹即可。复制DLL后,您需要运行以下命令注册:

regsvr32 scriptpw.dll

要在Vista及更高版本上成功注册DLL,您将需要管理员权限。我没有检查这样一个举动的合法性,所以洞穴探长。


如果您不是过度热衷于尝试追踪并注册较旧的DLL文件(出于方便或法律原因),还有另一种方法。更高版本的Windows(具有所需的DLL)应该可以使用Powershell。

事实上,你真的应该考虑升级你的脚本以完全使用它,因为它是一种比cmd.exe更强大的脚本语言。但是,如果您希望将大部分代码保留为cmd.exe脚本(例如,如果您有 lot 代码而不想转换),则可以使用同样的伎俩。

首先,修改cmd脚本,使其调用Powershell而不是CScript:

@echo off
for /f "delims=" %%i in ('powershell -file getpwd.ps1') do set passwd=%%i

Powershell脚本同样简单:

$password = Read-Host "Enter password" -AsSecureString
$password = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)
$password = [Runtime.InteropServices.Marshal]::PtrToStringAuto($password)
echo $password

虽然有一些编组来获取实际的密码文本。

请记住,要在您的计算机上运行本地未签名的Powershell脚本,您可能需要从(严格的,但非常安全的)默认值修改执行策略,例如:

set-executionpolicy remotesigned

来自Powershell本身。

答案 2 :(得分:23)

1.纯批处理解决方案(ab)使用XCOPY命令及其/P /L转换here(对此进行了一些改进{{3} }):

:: 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 

1.2 be found here

@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion

Set /P "=Enter a Password:" < Nul
Call :PasswordInput
Echo(Your input was:!Line!

Goto :Eof

:PasswordInput
::Author: Carlos Montiers Aguilera
::Last updated: 20150401. Created: 20150401.
::Set in variable Line a input password
For /F skip^=1^ delims^=^ eol^= %%# in (
'"Echo(|Replace.exe "%~f0" . /U /W"') Do Set "CR=%%#"
For /F %%# In (
'"Prompt $H &For %%_ In (_) Do Rem"') Do Set "BS=%%#"
Set "Line="
:_PasswordInput_Kbd
Set "CHR=" & For /F skip^=1^ delims^=^ eol^= %%# in (
'Replace.exe "%~f0" . /U /W') Do Set "CHR=%%#"
If !CHR!==!CR! Echo(&Goto :Eof
If !CHR!==!BS! (If Defined Line (Set /P "=!BS! !BS!" <Nul
Set "Line=!Line:~0,-1!"
)
) Else (Set /P "=*" <Nul
If !CHR!==! (Set "Line=!Line!^!"
) Else Set "Line=!Line!!CHR!"
)
Goto :_PasswordInput_Kbd

2.使用HTA弹出窗口的密码提交者Another way based on replace command文件,应保存为This is a hybrit .bat/jscript/mshta

<!-- :
:: 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' >
        window.resizeTo(300,150);
        function entperPressed(e){
                if (e.keyCode == 13) {
                    pipePass();
                }
        }
        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' onkeypress="return entperPressed(event)" ></input>
    <hr>
    <button onclick='pipePass()'>Submit</button>

</body>
</html>

3. .bat 。应该保存为A self-compiled .net hybrid。与其他解决方案不同的是,它会创建/编译一个将被调用的小.exe文件(如果你希望你可以删除它)。还需要安装.net框架,但这不是问题:

@if (@X)==(@Y) @end /* JScript comment
@echo off
setlocal enableDelayedExpansion

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("*");
           }

           if ( key.Key == ConsoleKey.Backspace && pwd.Length > 0 ) {
               pwd=pwd.Remove(pwd.Length-1);
               Console.Error.Write("\b \b");
           }


        } while (key.Key != ConsoleKey.Enter);
        Console.Error.WriteLine();
        Console.WriteLine(pwd);

答案 3 :(得分:11)

我可能只会这样做:

..
echo Before you enter your password, make sure no-one is looking!
set /P password=Password:  
cls
echo Thanks, got that.
.. 

所以你得到一个提示,然后屏幕在输入后清除。

请注意,如果从命令提示符执行批处理文件,则输入的密码将存储在CMD历史记录中(谢谢@Mark K Cowan)。

如果这还不够好,我会切换到python,或编写可执行文件而不是脚本。

我知道这些都不是完美的,但也许一个对你来说已经足够了:)。

答案 4 :(得分:6)

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

editv32 -m -p "Password: " PWD

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

https://westmesatech.com/?page_id=19

答案 5 :(得分:4)

如果缺乏源代码困扰你,我还有另一种选择。

@echo off
for /f "delims=" %%p in ('ReadLine -h -p "Enter password: "') do set PWD=%%p
echo You entered: %PWD%

您可以从https://westmesatech.com/?page_id=49获取。包含源代码。

答案 6 :(得分:4)

如果您安装了Python,则可以使用:

for /f "delims=" %%A in ('python -c "import getpass; print(getpass.getpass('Enter the CVS password: '));"') do @set CVSPASS=%%A
echo PASS: %CVSPASS%

输出:

Enter the CVS password:
PASS: 123

答案 7 :(得分:4)

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

call :ReadFormattedLine password="********" /M "Enter password (8 chars): "

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


编辑2018-08-18 输入“隐身”密码的新方法

当此命令用于显示颜色字符并且此类命令的输出重定向到CON设备时,FINDSTR命令会发生奇怪的错误。有关如何使用FINDSTR命令以彩色显示文本的详细信息,请参阅this topic

当这种形式的FINDSTR命令的输出被重定向到CON时,在以所需的颜色输出文本后发生了一些奇怪的事情:它之后的所有文本都被输出为“不可见”的字符,尽管更精确的描述是文本在黑色背景上输出为黑色文本。如果使用COLOR命令重置整个屏幕的前景色和背景色,则会出现原始文本。但是,当文本“不可见”时,我们可以执行SET / P命令,因此输入的所有字符都不会出现在屏幕上。

@echo off
setlocal

set /P "=_" < NUL > "Enter password"
findstr /A:1E /V "^$" "Enter password" NUL > CON
del "Enter password"
set /P "password="
cls
color 07
echo The password read is: "%password%"

答案 8 :(得分:3)

您可以将前景色设置为黑色,例如:

:: see https://stackoverflow.com/questions/33293220/what-is-the-fastest-color-function-in-batch
@echo off
for /F %%a in ('echo prompt $E ^| cmd') do set "ESC=%%a"
set color_white=%ESC%[37m
set color_black=%ESC%[30m
echo(
set /p user=Username:
set /p pass=password:%color_black%
echo %color_white%
echo blablablba

享受!!! C。

答案 9 :(得分:1)

创建一个调用不可见字符所需的批处理文件,然后为要调用的批处理文件创建一个快捷方式。

右键单击

属性

颜色

文本==黑

background == black

应用

确定

希望这样可以帮助你!!!!!!!!

答案 10 :(得分:1)

我使用了Blorgbeard的上述解决方案,这在我看来实际上很棒。然后我按如下方式增强了它:

  1. Google for ansicon
  2. 下载zip文件和示例文本文件。
  3. 安装(表示将2个文件复制到system32中)
  4. 像这样使用:

    @echo off
    ansicon -p
    set /p pwd=Password:ESC[0;37;47m
    echo ESC[0m
    

    这会将控制台变为灰色灰色以输入密码,并在完成后切换回来。 ESC实际上应该是一个不可打印的字符,您可以将其从下载的示例文本文件(在记事本中显示为左箭头)复制到批处理文件中。您可以使用示例文本文件查找所有颜色组合的代码。

    如果您不是该计算机的管理员,您可能能够将这些文件安装在非系统目录中,那么在调用该程序并使用转义序列之前,您必须将该目录附加到脚本中的PATH中。 。如果您需要一个只包含少量文件的非管理员可分发包,那么这甚至可能是当前目录。

答案 11 :(得分:1)

<强>更新
我添加了两个新方法,而不是利用cls隐藏输入,他们只创建一个新行的弹出窗口。

缺点是一个方法(方法2)在注册表中留下垃圾 - “如果没有适当的权限运行”,另一个方法(方法3)将一些垃圾添加到脚本中。毋庸置疑,它可以很容易地写入任何tmp文件并删除我只是试图想出一个替代方案。

限制:密码只能是字母数字 - 没有其他字符!

@echo off
if "%1"=="method%choice%" goto :method%choice%
::::::::::::::::::
::Your code here::
::::::::::::::::::
cls
echo :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
echo ::::                   Batch script to prompt for password!                 :::
echo :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:choice
echo.
echo 1. First method
echo.
echo 2. Second method
echo.
echo 3. Third method
echo.
set/p choice=Choose a method: 
if "%choice%" gtr "3" echo. & echo invalid option & echo. & pause & goto choice

call :vars
    set options= %num%%smAlph%%cpAlph%
    set pwdLen=6

if "%choice%" == "1" (
    set /p=Password: <nul 
    for /l %%i in (1,1,%pwdLen%) do call :password
) else (
    start /wait cmd /c call "%~f0" method%choice%
    )

call :result%choice%


::just to see if it worked!
echo.
echo The Password you entered is: "%pwd%"&pause>nul

::::::::::::::::::
::More code here::
::::::::::::::::::
exit /b





:vars
set num=1234567890
set smAlph=abcdefghijklmnopqrstuvwxyz
set cpAlph=ABCDEFGHIJKLMNOPQRSTUVWXYZ
    set pwd=
goto :EOF


:method2
call :popUp
setx result %pwd% >nul
goto :EOF

:method3
call :popUp
    >> "%~f0" echo.
    >> "%~f0" echo :result%choice%
    >> "%~f0" echo set pwd=%pwd%
goto :EOF

:popUp
title Password
mode con lines=1 cols=30
color 5a
set /p=Password: <nul
for /l %%i in (1,1,%pwdLen%) do call :password
goto :EOF

:password
:: If you don't want case sensative remove "/cs" but remember to remove %cpAlph% from the %options%
choice /c %options% /n /cs >nul
    call SET pwd=%pwd%%%options:~%errorlevel%,1%%
    set /p =*<nul
GOTO :EOF


:result2
for /f "tokens=3" %%a in ('reg query hkcu\environment /v result') do set pwd=%%a
    setx result "" >nul
    reg delete hkcu\environment /v result /f >nul 2>&1
:result1
goto :EOF   
::You can delete from here whenever you want.

<强>更新 我找到了sachadee's post to be perfect,我刚刚添加了我的“弹出式”怪癖。

@Echo Off  
  SetLocal EnableDelayedExpansion
  if "%1"==":HInput" goto :HInput
  set r=r%random%
  start /wait cmd /c call "%~f0" :HInput

For /f "tokens=2,13 delims=, " %%a in (
    'tasklist /v /fo csv /fi "imagename eq cmd.exe"
    ^|findstr /v "Windows\\system32\\cmd.exe"
    ^|findstr "set /p=%r%"'
     ) do (
        set pid=%%a
        set Line=%%b
        set Line=!Line:%r%=!
        set Line=!Line:~,-2!
        )       
taskkill /pid %pid:"=%>nul
  goto :HIEnd


  :HInput
  SetLocal DisableDelayedExpansion
  title Password
  mode con lines=2 cols=30

Echo Enter your Code :
   Set "Line="
   For /F %%# In (
   '"Prompt;$H&For %%# in (1) Do Rem"'
   ) Do Set "BS=%%#"

  :HILoop
   Set "Key="
   For /F "delims=" %%# In (
   'Xcopy /W "%~f0" "%~f0" 2^>Nul'
   ) Do If Not Defined Key Set "Key=%%#"
   Set "Key=%Key:~-1%"
   SetLocal EnableDelayedExpansion
   If Not Defined Key start /min cmd /k mode con lines=1 cols=14 ^&set/p %r%!Line!=&exit
  If %BS%==^%Key% (Set /P "=%BS% %BS%" <Nul
   Set "Key="
   If Defined Line Set "Line=!Line:~0,-1!"
   ) Else Set /P "=*" <Nul
   If Not Defined Line (EndLocal &Set "Line=%Key%"
   ) Else For /F delims^=^ eol^= %%# In (
   "!Line!") Do EndLocal &Set "Line=%%#%Key%"
  Goto :HILoop

  :HIEnd
   Echo(
Echo Your code is :  "!Line!"
   Pause
   Goto :Eof

答案 12 :(得分:1)

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

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

--maskinput-m)选项[*]使您可以隐藏(遮盖)键入的输入并具有可配置的字符(默认字符为*);例如:

editenv -m -p "Password: " PWD

使用--prompt-p)选项可以指定输入提示。上面将显示一个Password:提示,并等待您输入内容。输入的字符将显示为*。按下 Ctrl + C 将结束程序,退出代码为1223。

下载在这里:

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

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

答案 13 :(得分:1)

好的,所以我刚刚找到了一个非常体面的解决这个问题的方法。 CMDKEY 适用于 Windows 7+ 并允许您从 cmd 提示符将详细信息输入到 windows cred 管理器中,如果您使用 /pass 开关,它会提供自己的密码条目而不会暴露密码。键入时不显示 *****,但密码已隐藏。

下面的脚本像往常一样请求用户名,并创建一个名为“%username%”的变量,然后检查信用管理器是否已经有目标服务器的条目。如果这样做,它只是将驱动器映射到用户名,而不需要密码。如果没有条目,则使用 CMDKEY 提示输入密码并将其存储在 cred manager 中。

    set /p username="Enter School Username: "
    CMDKEY /list:SERVERNAME | FIND "NONE" > nul 2>&1
    IF %ERRORLEVEL% NEQ 0 GOTO MAPDRIVES
    CMDKEY /ADD:SERVERNAME /username:%username% /pass
    :MAPDRIVES
    NET USE Y: \\SERVERNAME\SHARE\%username%

答案 14 :(得分:0)

这可能是一个较旧的主题,但如果您使用的是Windows Vista或7,我的解决方案可以很好地运行。我在这里制作了一段视频:http://www.youtube.com/watch?v=mk8uAa6PIFM

批处理文件is here

的Pastebin

答案 15 :(得分:-1)

@echo off
color 0f
MODE CON COLS=132 LINES=50
:start
cls
choice /C ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!?.# /N /CS /M Please enter your password to continue. (Valid characters include all letters, numbers, and ! ? .) Press # to submit: 
SET ecode=%ERRORLEVEL%
IF %ecode% EQU 66 goto submit
IF %ecode% EQU 1 SET out=A
IF %ecode% EQU 2 SET out=B
IF %ecode% EQU 3 SET out=C
IF %ecode% EQU 4 SET out=D
IF %ecode% EQU 5 SET out=E
IF %ecode% EQU 6 SET out=F
IF %ecode% EQU 7 SET out=G
IF %ecode% EQU 8 SET out=H
IF %ecode% EQU 9 SET out=I
IF %ecode% EQU 10 SET out=J
IF %ecode% EQU 11 SET out=K
IF %ecode% EQU 12 SET out=L
IF %ecode% EQU 13 SET out=M
IF %ecode% EQU 14 SET out=N
IF %ecode% EQU 15 SET out=O
IF %ecode% EQU 16 SET out=P
IF %ecode% EQU 17 SET out=Q
IF %ecode% EQU 18 SET out=R
IF %ecode% EQU 19 SET out=S
IF %ecode% EQU 20 SET out=T
IF %ecode% EQU 21 SET out=U
IF %ecode% EQU 22 SET out=V
IF %ecode% EQU 23 SET out=W
IF %ecode% EQU 24 SET out=X
IF %ecode% EQU 25 SET out=Y
IF %ecode% EQU 26 SET out=Z
IF %ecode% EQU 27 SET out=a
IF %ecode% EQU 28 SET out=b
IF %ecode% EQU 29 SET out=c
IF %ecode% EQU 30 SET out=d
IF %ecode% EQU 31 SET out=e
IF %ecode% EQU 32 SET out=f
IF %ecode% EQU 33 SET out=g
IF %ecode% EQU 34 SET out=h
IF %ecode% EQU 35 SET out=i
IF %ecode% EQU 36 SET out=j
IF %ecode% EQU 37 SET out=k
IF %ecode% EQU 38 SET out=l
IF %ecode% EQU 39 SET out=m
IF %ecode% EQU 40 SET out=n
IF %ecode% EQU 41 SET out=o
IF %ecode% EQU 42 SET out=p
IF %ecode% EQU 43 SET out=q
IF %ecode% EQU 44 SET out=r
IF %ecode% EQU 45 SET out=s
IF %ecode% EQU 46 SET out=t
IF %ecode% EQU 47 SET out=u
IF %ecode% EQU 48 SET out=v
IF %ecode% EQU 49 SET out=w
IF %ecode% EQU 50 SET out=x
IF %ecode% EQU 51 SET out=y
IF %ecode% EQU 52 SET out=z
IF %ecode% EQU 53 SET out=0
IF %ecode% EQU 54 SET out=1
IF %ecode% EQU 55 SET out=2
IF %ecode% EQU 56 SET out=3
IF %ecode% EQU 57 SET out=4
IF %ecode% EQU 58 SET out=5
IF %ecode% EQU 59 SET out=6
IF %ecode% EQU 60 SET out=7
IF %ecode% EQU 61 SET out=8
IF %ecode% EQU 62 SET out=9
IF %ecode% EQU 63 SET out=!
IF %ecode% EQU 64 SET out=?
IF %ecode% EQU 65 SET out=.
SET code=%out%
SET show=*
:loop
cls
choice /C ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!?.# /N /CS /M Please enter your password to continue. (Valid characters include all letters, numbers, and ! ? .) Press # to submit: %code%
SET ecode=%ERRORLEVEL%
IF %ecode% EQU 66 goto submit
IF %ecode% EQU 1 SET out=A
IF %ecode% EQU 2 SET out=B
IF %ecode% EQU 3 SET out=C
IF %ecode% EQU 4 SET out=D
IF %ecode% EQU 5 SET out=E
IF %ecode% EQU 6 SET out=F
IF %ecode% EQU 7 SET out=G
IF %ecode% EQU 8 SET out=H
IF %ecode% EQU 9 SET out=I
IF %ecode% EQU 10 SET out=J
IF %ecode% EQU 11 SET out=K
IF %ecode% EQU 12 SET out=L
IF %ecode% EQU 13 SET out=M
IF %ecode% EQU 14 SET out=N
IF %ecode% EQU 15 SET out=O
IF %ecode% EQU 16 SET out=P
IF %ecode% EQU 17 SET out=Q
IF %ecode% EQU 18 SET out=R
IF %ecode% EQU 19 SET out=S
IF %ecode% EQU 20 SET out=T
IF %ecode% EQU 21 SET out=U
IF %ecode% EQU 22 SET out=V
IF %ecode% EQU 23 SET out=W
IF %ecode% EQU 24 SET out=X
IF %ecode% EQU 25 SET out=Y
IF %ecode% EQU 26 SET out=Z
IF %ecode% EQU 27 SET out=a
IF %ecode% EQU 28 SET out=b
IF %ecode% EQU 29 SET out=c
IF %ecode% EQU 30 SET out=d
IF %ecode% EQU 31 SET out=e
IF %ecode% EQU 32 SET out=f
IF %ecode% EQU 33 SET out=g
IF %ecode% EQU 34 SET out=h
IF %ecode% EQU 35 SET out=i
IF %ecode% EQU 36 SET out=j
IF %ecode% EQU 37 SET out=k
IF %ecode% EQU 38 SET out=l
IF %ecode% EQU 39 SET out=m
IF %ecode% EQU 40 SET out=n
IF %ecode% EQU 41 SET out=o
IF %ecode% EQU 42 SET out=p
IF %ecode% EQU 43 SET out=q
IF %ecode% EQU 44 SET out=r
IF %ecode% EQU 45 SET out=s
IF %ecode% EQU 46 SET out=t
IF %ecode% EQU 47 SET out=u
IF %ecode% EQU 48 SET out=v
IF %ecode% EQU 49 SET out=w
IF %ecode% EQU 50 SET out=x
IF %ecode% EQU 51 SET out=y
IF %ecode% EQU 52 SET out=z
IF %ecode% EQU 53 SET out=0
IF %ecode% EQU 54 SET out=1
IF %ecode% EQU 55 SET out=2
IF %ecode% EQU 56 SET out=3
IF %ecode% EQU 57 SET out=4
IF %ecode% EQU 58 SET out=5
IF %ecode% EQU 59 SET out=6
IF %ecode% EQU 60 SET out=7
IF %ecode% EQU 61 SET out=8
IF %ecode% EQU 62 SET out=9
IF %ecode% EQU 63 SET out=!
IF %ecode% EQU 64 SET out=?
IF %ecode% EQU 65 SET out=.
SET code=%code%%out%
SET show=%show%*
goto loop
:submit
cls
SET password=%code%
IF %password% EQU 0cZrocks! SET result=1
IF ELSE SET result=2
IF %result% EQU 1 echo password correct
IF %result% EQU 2 echo password incorrect
timeout /T 2 /NOBREAK >nul
cls
IF %result% EQU 1 goto end
IF ELSE goto start
:end

答案 16 :(得分:-2)

我在网上阅读了关于如何在批处理文件中屏蔽密码的所有笨重的解决方案,使用hide.com解决方案甚至是使文本和背景颜色相同的解决方案。 hide.com解决方案工作正常,它不是很安全,并且在64位Windows中不起作用。所以无论如何,使用100%的Microsoft实用程序,有一种方法!

首先,让我解释一下我的用法。我有大约20个自动登录Windows的工作站。他们的桌面上有一个快捷方式 - 临床应用程序。机器被锁定,无法右键单击,除了访问桌面上的一个快捷方式外,它们无法执行任何操作。有时,技术人员需要启动一些调试应用程序,浏览Windows资源管理器并查看日志文件,而无需关闭自动登录用户帐户。

所以这就是我所做的。

按照您的意愿执行此操作,但我将两个批处理文件放在已锁定的计算机可以访问的网络共享上。

我的解决方案使用Windows的1个主要组件 - runas。 将客户端上的快捷方式放到要创建的runas.bat上。 仅供参考,在我的客户上,我重命名了快捷方式以便更好地查看,并更改了图标。

您需要创建两个批处理文件。

我将批处理文件命名为 runas.bat Debug Support.bat

runas.bat包含以下代码:

cls
@echo off
TITLE CHECK CREDENTIALS 
goto menu

:menu
cls
echo.
echo           ....................................
echo            ~Written by Cajun Wonder 4/1/2010~
echo           ....................................
echo.
@set /p un=What is your domain username? 
if "%un%"=="PUT-YOUR-DOMAIN-USERNAME-HERE" goto debugsupport
if not "%un%"=="PUT-YOUR-DOMAIN-USERNAME-HERE" goto noaccess
echo.
:debugsupport
"%SYSTEMROOT%\system32\runas" /netonly /user:PUT-YOUR-DOMAIN-NAME-HERE\%un% "\\PUT-YOUR-NETWORK-SHARE-PATH-HERE\Debug Support.bat"
@echo ACCESS GRANTED! LAUNCHING THE DEBUG UTILITIES....
@ping -n 4 127.0.0.1 > NUL
goto quit
:noaccess
cls
@echo.
@echo.
@echo.
@echo.
@echo   \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
@echo   \\                                   \\
@echo   \\    Insufficient privileges         \\  
@echo   \\                                    \\
@echo   \\      Call Cajun Wonder             \\
@echo   \\                                    \\
@echo   \\              At                    \\
@echo   \\                                    \\
@echo   \\        555-555-5555                \\
@echo   \\                                    \\
@echo   \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
@ping -n 4 127.0.0.1 > NUL
goto quit
@pause
:quit
@exit

您可以为要授予访问权限的所有用户添加尽可能多的如果“%un%”,如果不是“%un%”。 @ping是我制作秒计时器的coonass方式。

这样可以处理第一个批处理文件 - 非常简单呃?

以下是Debug Support.bat的代码:

cls
@echo off
TITLE SUPPORT UTILITIES
goto menu

:menu
cls
@echo %username%
echo.
echo           .....................................
echo            ~Written by Cajun Wonder 4/1/2010~
echo           .....................................
echo.
echo What do you want to do? 
echo.
echo [1]  Launch notepad
echo.

:choice
set /P C=[Option]? 
if "%C%"=="1" goto notepad
goto choice

:notepad
echo.
@echo starting notepad....
@ping -n 3 127.0.0.1 > NUL
start notepad
cls
goto menu

我不是一个程序员,而且大约在一年前开始进入批处理脚本,而这一轮我发现在批处理文件中屏蔽密码非常棒!

我希望听到除了我之外的其他人能够使用它!