¿Puedo enmascarar un texto de entrada en un archivo bat?

102

Estoy escribiendo un archivo por lotes para ejecutar algunos otros programas. En este caso, necesito solicitar una contraseña. ¿Tengo alguna forma de enmascarar el texto de entrada? No necesito imprimir caracteres ******* en lugar de introducir caracteres. El comportamiento de solicitud de contraseña de Linux (no imprima nada mientras escribe) es suficiente.

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

Esto leerá la entrada pero no puedo enmascarar el texto usando este enfoque.

Chathuranga Chandrasekara
fuente

Respuestas:

50

Hasta XP y Server 2003, puede hacer uso de otra herramienta incluida (VBScript): los dos scripts siguientes hacen el trabajo que desea.

Primero getpwd.cmd:

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

Entonces getpwd.vbs,:

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

los getpwd.vbs simplemente utiliza el objeto contraseña que introduzca la contraseña del usuario y luego imprimir en la salida estándar (el párrafo siguiente explicará por qué no se presenta en el terminal).

los getpwd.cmd script de comando es un poco más complicado, pero básicamente funciona de la siguiente manera.

El efecto del "<nul: set /p passwd=Password: "comando es generar el indicador sin un carácter de nueva línea al final; es una forma engañosa de emular el "echo -n" comando desde el bashshell. Se establece passwden una cadena vacía como un efecto secundario irrelevante y no espera la entrada, ya que la toma del nul:dispositivo.

La "for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i"declaración es la parte más complicada. Ejecuta VBScript sin "publicidad" de Microsoft, por lo que la única salida de línea es la contraseña (de VBscript"Wscript.StdOut.WriteLine strPassword" .

No es necesario establecer los delimitadores en nada para capturar una línea de entrada completa con espacios; de lo contrario, solo obtiene la primera palabra. los"for ... do set ..." bit se establecepasswd como la salida de contraseña real de VBScript.

Luego hacemos eco de una línea en blanco (para terminar la "Password: "línea) y la contraseña estará en elpasswd variable de entorno después de que se haya ejecutado el código.


Ahora, como se mencionó, scriptpw.dllsolo está disponible hasta XP / 2003. Para rectificar esto, simplemente puede copiar el scriptpw.dllarchivo de la Windows\System32carpeta de un sistema XP / 2003 a la carpeta Winnt\System32o Windows\System32en su propio sistema. Una vez que se haya copiado la DLL, deberá registrarla ejecutando:

regsvr32 scriptpw.dll

Para registrar correctamente la DLL en Vista y versiones posteriores, necesitará privilegios de administrador. No he examinado la legalidad de un movimiento así, lector de cuevas.


Si no está demasiado interesado en intentar rastrear y registrar archivos DLL más antiguos (por conveniencia o razones legales), existe otra forma. Versiones posteriores de Windows (las que no tienen la DLL requerida) deberían tener Powershell disponible para usted.

Y, de hecho, debería considerar actualizar sus scripts para usarlos por completo, ya que es un lenguaje de scripting mucho más capaz que cmd.exe. Sin embargo, si desea mantener la mayor parte de su código como cmd.exescripts (por ejemplo, si tiene un muchos código que no desea convertir), puede usar el mismo truco.

Primero, modifique el cmdscript para que llame a Powershell en lugar de CScript:

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

El script de Powershell es igualmente simple:

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

aunque con algunas referencias para obtener el texto real de la contraseña.

Recuerde que, para ejecutar scripts de Powershell locales sin firmar en su máquina, es posible que deba modificar la política de ejecución del valor predeterminado (draconiano, aunque muy seguro), con algo como:

set-executionpolicy remotesigned

desde dentro de Powershell.

paxdiablo
fuente
2
Vaya, ese <nul: set / p es realmente genial. No lo sabía hasta ahora :-). Pero el VBScript no me funciona: error de tiempo de ejecución de Microsoft VBScript: el componente ActiveX no puede crear el objeto: 'ScriptPW.Password'. Windows 7 Beta x64 aquí.
Joey
Interesante, se supone que está disponible a partir de XP. Sospecho que Win7 aún no está terminado si no funciona allí (o tienes que hacer algún otro truco para que funcione). Un poco de investigación muestra por qué: vea mi actualización.
paxdiablo
2
Agradable. También es bueno tener en cuenta que puede sustituir el archivo VBS por cualquier idioma equivalente al que se pueda llamar desde la línea de comandos. Por ejemplo, puede reemplazar la sección cscript con: 'python -c "de getpass import getpass; pwd = getpass (); print pwd;"'
Cerin
1
Solía ​​usar esta forma cuando esta pregunta era nueva: respondí a continuación una forma de hacerlo sin scripts adicionales.
carne de tío
1
@Bill: De ahí que mi sección comience "Ahora, desafortunadamente, ..." :-) Sin embargo, he agregado más opciones a la respuesta para, con suerte, mejorarla. Específicamente, el uso de powershell en lugar de scriptpw.dll.
paxdiablo
153

Sí, llego 4 años tarde.

Pero encontré una manera de hacer esto en una línea sin tener que crear un script externo; llamando a los comandos de PowerShell desde un archivo por lotes.

Gracias a TessellatesHeckler, sin generar un archivo de texto (configuré el comando powershell en una variable, porque es bastante complicado en una línea larga dentro de un bucle 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%

Originalmente lo escribí para enviarlo a un archivo de texto, luego lo leí desde ese archivo de texto. Pero el método anterior es mejor. En una línea extremadamente larga, casi incomprensible:

@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%

Desglosaré esto: puedes dividirlo en unas pocas líneas usando el símbolo de intercalación ^, que es mucho mejor ...

@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%

Este artículo explica qué están haciendo los comandos de PowerShell; esencialmente obtiene entrada usando Read-Host -AsSecureString: las siguientes dos líneas convierten esa cadena segura nuevamente en texto sin formato, la salida (contraseña de texto sin formato) se envía a un archivo de texto usando >.tmp.txt. Luego, ese archivo se lee en una variable y se elimina.

tío
fuente
5
La respuesta original fue excelente, pero creo que esta debería ser la definitiva ahora
James Wiseman
30
Esto es brillante. Pero la forma en que guarda una contraseña de texto sin formato en el disco me incomoda. Evite hacer eso haciendo esto en su lugar: for /f "usebackq tokens=*" %%p in (``powershell -Command "$pword = read-host 'Enter Password' -AsSecureString ; $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)"``) do set password=%%py luego echo %password%. NÓTESE BIEN. No puedo hacer que este comentario escape correctamente a las comillas inversas: antes de "powershell" y antes del final ")" hay dos comillas inversas, pero debería ser una tilde.
TessellatesHeckler
1
@TessellatesHeckler Buena idea, he actualizado mi respuesta. Una versión ligeramente modificada de tu sugerencia. Gracias.
Unclemeat
¿Es posible evitar que este método haga eco de "*" (estrella) con cada pulsación de tecla? es decir, no quiero que un observador sepa la longitud de la contraseña.
Sam Hasler
1
@RegieBaguio No, necesitará Powershell habilitado. Eche un vistazo a la solución Batch pura de npocmaka a continuación. Es mucho más complicado, pero debería funcionar para usted.
unclemeat
26

Solución por lotes pura que (ab) usa el XCOPYcomando y sus /P /Linterruptores que se encuentran aquí (algunas mejoras en esto se pueden encontrar aquí ):

:: 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 Otra forma basada en el comando reemplazar

@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. Remitente de contraseña que utiliza una ventana emergente de HTA . Este es un archivo hybrit .bat / jscript / mshta y debe guardarse como .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' >
        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. Un .net híbrido autocompilado .De nuevo debe guardarse como .bat.A diferencia de otras soluciones, creará / compilará un pequeño archivo .exe que se llamará (si lo desea, puede eliminarlo). También requiere un marco .net instalado, pero eso no es un problema:

@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);
npocmaka
fuente
6
Mi sentido hacky está hormigueando, ¡especialmente en el híbrido!
Mark K Cowan
2
Esa primera solución es muy inteligente: buena +1.
unclemeat
El método 2.1 basado en el comando de reemplazo perderá las pulsaciones de teclas si escribe rápidamente
Sam Hasler
@SamHasler: sí, intentaré arreglar esto, aunque no se pudo reproducir el problema con 2.1. También actualicé la HTA para verificar si se presiona Enter.
npocmaka
1
@npocmaka la última versión del método 1.2 (Última actualización: 20150405) está aquí: consolesoft.com/batch/password_input/password_input.cmd
carlos
16

Probablemente solo haría:

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

Entonces recibe un mensaje, luego la pantalla se borra después de ingresar.

Tenga en cuenta que la contraseña ingresada se almacenará en el historial de CMD si el archivo por lotes se ejecuta desde un símbolo del sistema (Gracias @Mark K Cowan ).

Si eso no fuera lo suficientemente bueno, cambiaría a Python o escribiría un ejecutable en lugar de un script.

Sé que ninguna de estas son sociones perfectas, pero tal vez una sea lo suficientemente buena para ti :)

Blorgbeard está fuera
fuente
4
Tenga en cuenta que la contraseña ingresada se almacenará en el historial de CMD si el archivo por lotes se ejecuta desde un símbolo del sistema. Sin embargo, no hay voto negativo, ya que casi dijiste que cmd es la herramienta incorrecta para el trabajo.
Mark K Cowan
Puede ejecutar doskey /reinstallpara borrar el búfer de comandos anterior inmediatamente después cls, si el historial de comandos en la consola no es importante para usted.
RuntimeException
1
Si no desea usar doskey / reinstall y borrar el historial de comandos, otra opción es ejecutar el código anterior en una ventana de terminal separada y salir de él inmediatamente. Tenga en cuenta que todavía no reemplaza su Cadena escrita con asteriscos. La solución anterior es una opción si no desea ejecutar powershell. C:\>start "console" cmd /c ireadconsole.bat
RuntimeException
9

Puede utilizar la subrutina ReadFormattedLine para todo tipo de entrada formateada. Por ejemplo, el siguiente comando lee una contraseña de 8 caracteres, muestra asteriscos en la pantalla y continúa automáticamente sin necesidad de presionar Enter:

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

Esta subrutina está escrita en Batch puro por lo que no requiere ningún programa adicional, y permite varias operaciones de entrada formateadas, como leer solo números, convertir letras a mayúsculas, etc. Puede descargar la subrutina ReadFormattedLine desde Leer una línea con un formato específico .


EDITAR 2018-08-18 : Nuevo método para ingresar una contraseña "invisible"

El comando FINDSTR tiene un error extraño que ocurre cuando este comando se usa para mostrar caracteres en color Y la salida de dicho comando se redirige al dispositivo CON. Para obtener detalles sobre cómo usar el comando FINDSTR para mostrar texto en color, consulte este tema .

Cuando la salida de esta forma de comando FINDSTR se redirige a CON, sucede algo extraño después de que el texto se imprime en el color deseado: todo el texto después de que sale como caracteres "invisibles", aunque una descripción más precisa es que el texto es salida como texto negro sobre fondo negro. El texto original aparecerá si usa el comando COLOR para restablecer los colores de primer plano y fondo de toda la pantalla. Sin embargo, cuando el texto es "invisible" podríamos ejecutar un comando SET / P, por lo que todos los caracteres ingresados ​​no aparecerán en la pantalla.

@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%"
Aacini
fuente
5

otra alternativa son mis herramientas de línea de comandos EditV32 (x86) o EditV64 (x64). Por ejemplo:

editv32 -m -p "Password: " PWD

-m significa "entrada enmascarada" y -p es el indicador. La entrada del usuario se almacena en la variable de entorno PWD. Puedes obtenerlo aqui:

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

Bill_Stewart
fuente
5
Esta no es la única solución de código cerrado (¡Windows es de código cerrado!). Eres libre de no usarlo, por supuesto ...
Bill_Stewart
Si la falta de código fuente le molesta, vea mi otra respuesta sobre ReadLine.exe .
Bill_Stewart
¡Buena! La licencia le permite usarlo. Además, fácil de integrar. Solo para manejar el código de salida 1. Error en la línea de comando, 2 La línea de entrada estaba en blanco, 3 La variable de entorno no se cambió, 4 Programa abortado con Ctrl-C
James Jithin
Nota: Las utilidades editenv32 / editenv64 y readline han sido reemplazadas por la utilidad editenv de código abierto .
Bill_Stewart
4

Si la falta de código fuente te molesta, tengo otra alternativa.

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

Puede obtenerlo en https://westmesatech.com/?page_id=49 . Se incluye el código fuente.

Bill_Stewart
fuente
Nota: Las utilidades editenv32 / editenv64 y readline han sido reemplazadas por la utilidad editenv de código abierto .
Bill_Stewart
3

Si tiene Python instalado, puede usar:

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

La salida:

Enter the CVS password:
PASS: 123
lutecki
fuente
2

Utilicé la solución anterior de Blorgbeard, que en mi opinión es genial. Luego lo mejoré de la siguiente manera:

  1. Google para ansicon
  2. Descargue el archivo zip y el archivo de texto de muestra.
  3. Instalar (eso significa copiar 2 archivos en system32)

Úselo así:

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

Esto cambia la consola a gris sobre gris para la entrada de su contraseña y vuelve a cambiar cuando haya terminado. El ESC debería ser un carácter no imprimible, que puede copiar del archivo de texto de muestra descargado (aparece como una flecha hacia la izquierda en el Bloc de notas) en su archivo por lotes. Puede utilizar el archivo de texto de muestra para encontrar los códigos de todas las combinaciones de colores.

Si no es el administrador de la máquina, probablemente podrá instalar los archivos en un directorio que no sea del sistema, luego deberá agregar el directorio a la RUTA en su script antes de llamar al programa y usar las secuencias de escape. Probablemente, este podría ser el directorio actual, si necesita un paquete distribuible que no sea de administrador de solo unos pocos archivos.

marcingo
fuente
No puedo probar esto, pero esperaría que la contraseña escrita apareciera en el historial de cmd después.
Mark K Cowan
@MarkKCowan Eso es exactamente lo que sucede.
sjngm
1

cree un archivo por lotes que llame al que se necesita para los caracteres invisibles y luego cree un acceso directo para el archivo por lotes que se está llamando.

botón derecho del ratón

propiedades

colores

texto == negro

fondo == negro

aplicar

Okay

Espero que así te ayude !!!!!!!!

cmd
fuente
Buen enfoque de pensamiento lateral, incluso si no siempre es práctico en una situación de lotes debido a tener que configurar el entorno antes de tiempo. Oh,
espera
1

ACTUALIZACIÓN:
agregué dos nuevos métodos que, en lugar de utilizar cls para ocultar la entrada, crean una nueva ventana emergente con una sola línea.

Los inconvenientes son que un método (método 2) deja basura en el registro - "Si se ejecuta sin los derechos adecuados", y el otro (método tres) agrega algo de basura al script. No hace falta decir que se puede escribir fácilmente en cualquier archivo tmp y eliminarlo. Intenté encontrar una alternativa.

Limitación: La contraseña solo puede ser alfanumérica, ¡sin otros caracteres!

@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.

Actualización: Encontré que la publicación de sachadee era perfecta y solo le agregué mi peculiaridad "emergente".

@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
Ir relevante
fuente
1

Escribí un programa de código abierto llamado editenvque reemplaza mis antiguas editv32/ editv64utilidades:

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

La opción --maskinput( -m) [*] le permite ocultar (enmascarar) la entrada escrita y tiene un carácter configurable (el carácter predeterminado es *); p.ej:

editenv -m -p "Password: " PWD

La opción --prompt( -p) le permite especificar una solicitud de entrada. Lo anterior mostrará un Password:mensaje y esperará a que ingrese algo. Los caracteres escritos aparecerán como *. Al presionar Ctrl+ Cfinalizará el programa con un código de salida de 1223.

La descarga está aquí:

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

[*] Tenga en cuenta que la opción --maskinput( -m) no es segura : la cadena ingresada se ingresa como texto sin formato en el entorno. Esta función es solo para su comodidad.

Bill_Stewart
fuente
-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
CODEMASTER
fuente
No explicaste el código y simplemente lo copiaste. Esta no es una buena manera de hacerlo, ya que necesita actualizar la pantalla y la contraseña debe tener x caracteres.
Anic17
-1

Otra opción, en la misma línea que Blorgbeard está fuera , es usar algo como:

SET /P pw=C:\^>

El ^escapa >para que la solicitud de contraseña se vea como una solicitud de consola cmd estándar.

nimbell
fuente
1
La pregunta no es cómo ocultar / disfrazar la solicitud de contraseña, sino evitar que se muestre al escribir. Así que esto no (intenta) responder la pregunta.
Stephan
Tampoco la respuesta a la que me vinculé (que en el momento de escribir este artículo tiene 13 votos a favor). Mi respuesta es simplemente ampliar eso, ya que esta puede ser una alternativa útil para algunos (ya que Blogbeard es para mí). (Lo habría agregado como comentario, pero el sitio no me lo permite)
nimbell
Esa no es una buena respuesta. No estás enmascarando ni ocultando la contraseña. Comente una vez que tenga una buena solución o respuesta.
Anic17
-3

Leí todas las soluciones torpes en la red sobre cómo enmascarar contraseñas en un archivo por lotes, las que usan una solución de hide.com e incluso las que hacen que el texto y el fondo tengan el mismo color. La solución hide.com funciona decente, no es muy segura y no funciona en Windows de 64 bits. De todos modos, usando utilidades 100% de Microsoft, ¡hay una manera!

Primero, déjame explicarte mi uso. Tengo alrededor de 20 estaciones de trabajo que inician sesión automáticamente en Windows. Tienen un acceso directo en su escritorio: una aplicación clínica. Las máquinas están bloqueadas, no pueden hacer clic con el botón derecho, no pueden hacer nada más que acceder a un acceso directo en su escritorio. A veces es necesario que un técnico inicie algunas aplicaciones de depuración, explore el explorador de Windows y observe los archivos de registro sin cerrar la cuenta de usuario de autolog.

Así que esto es lo que hice.

Hágalo como desee, pero pongo mis dos archivos por lotes en un recurso compartido de red al que tiene acceso la computadora bloqueada.

Mi solución utiliza 1 componente principal de Windows: runas. Ponga un acceso directo en los clientes al runas.bat que está a punto de crear. Para su información, en mis clientes cambié el nombre del acceso directo para una mejor visualización y cambié el icono.

Deberá crear dos archivos por lotes.

Nombré los archivos por lotes runas.bat y Debug Support.bat

runas.bat contiene el siguiente código:

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

Puede agregar tantos si "% un%" y si no "% un%" para todos los usuarios a los que desea dar acceso. El @ping es mi forma coonass de hacer un temporizador de segundos.

Así que eso se encarga del primer archivo por lotes, bastante simple, ¿eh?

Aquí está el código de 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

No soy un codificador y realmente comencé a hacer scripts por lotes hace aproximadamente un año, ¡y esta forma redonda que descubrí de enmascarar una contraseña en un archivo por lotes es bastante impresionante!

¡Espero escuchar que alguien que no sea yo pueda aprovecharlo!

Cajún Maravilla
fuente