Puis-je masquer un texte d'entrée dans un fichier chauve-souris?

102

J'écris un fichier batch pour exécuter d'autres programmes. Dans ce cas, je dois demander un mot de passe. Ai-je un moyen de masquer le texte d'entrée? Je n'ai pas besoin d'imprimer des caractères ******* au lieu des caractères d'entrée. Le comportement d'invite de mot de passe de Linux (ne rien imprimer pendant la saisie) est suffisant.

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

Cela lira l'entrée mais je ne peux pas masquer le texte en utilisant cette approche.

Chathuranga Chandrasekara
la source

Réponses:

50

Jusqu'à XP et Server 2003, vous pouvez utiliser un autre outil inclus (VBScript) - les deux scripts suivants font le travail que vous souhaitez.

Premièrement getpwd.cmd,:

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

Ensuite getpwd.vbs,:

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

Le getpwd.vbsutilise simplement l'objet mot de passe pour saisir le mot de passe de l'utilisateur, puis l'imprimer sur la sortie standard (le paragraphe suivant expliquera pourquoi cela n'apparaît pas dans le terminal).

Le getpwd.cmdscript de commande est un peu plus délicat mais il fonctionne essentiellement comme suit.

L'effet de la "<nul: set /p passwd=Password: "commande est de sortir l'invite sans caractère de fin de ligne - c'est un moyen sournois d'émuler la "echo -n"commande à partir du bashshell. Il définit passwdune chaîne vide comme un effet secondaire non pertinent et n'attend pas d'entrée car il prend son entrée du nul:périphérique.

La "for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i"déclaration est la partie la plus délicate. Il exécute le VBScript sans "publicité" Microsoft, de sorte que la seule sortie de ligne est le mot de passe (du VBscript "Wscript.StdOut.WriteLine strPassword".

La définition des délimiteurs sur rien est nécessaire pour capturer une ligne d'entrée entière avec des espaces, sinon vous obtenez juste le premier mot. Le "for ... do set ..."bit est défini passwdcomme étant la sortie de mot de passe réelle du VBScript.

Ensuite, nous renvoyons une ligne vide (pour terminer la "Password: "ligne) et le mot de passe sera dans la passwdvariable d'environnement une fois le code exécuté.


Maintenant, comme mentionné, scriptpw.dlln'est disponible que jusqu'à XP / 2003. Pour corriger cela, vous pouvez simplement copier le scriptpw.dllfichier du Windows\System32dossier d'un système XP / 2003 vers le dossier Winnt\System32ou Windows\System32de votre propre système. Une fois la DLL copiée, vous devrez l'enregistrer en exécutant:

regsvr32 scriptpw.dll

Pour enregistrer correctement la DLL sur Vista et versions ultérieures, vous aurez besoin de privilèges d'administrateur. Je n'ai pas examiné la légalité d'un tel mouvement, donc lecteur de caverne.


Si vous n'êtes pas trop désireux d'essayer de retrouver et d'enregistrer des fichiers DLL plus anciens (pour des raisons pratiques ou légales), il existe un autre moyen. Les versions ultérieures de Windows (celles qui n'ont pas la DLL requise) devraient avoir Powershell à votre disposition.

Et, en fait, vous devriez vraiment envisager de mettre à niveau vos scripts pour les utiliser pleinement, car il s'agit d'un langage de script beaucoup plus performant que cmd.exe. Cependant, si vous souhaitez conserver la majeure partie de votre code sous forme de cmd.exescripts (par exemple, si vous avez beaucoup de code que vous ne souhaitez pas convertir), vous pouvez utiliser la même astuce.

Tout d'abord, modifiez le cmdscript pour qu'il appelle Powershell plutôt que CScript:

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

Le script Powershell est tout aussi simple:

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

bien qu'avec un peu de rassemblement pour obtenir le texte du mot de passe réel.

N'oubliez pas que, pour exécuter des scripts Powershell locaux non signés sur votre machine, vous devrez peut-être modifier la politique d'exécution par défaut (draconienne, bien que très sûre), avec quelque chose comme:

set-executionpolicy remotesigned

de l'intérieur de Powershell lui-même.

paxdiablo
la source
2
Whoa, ce <nul: set / p est vraiment cool. Je ne savais pas que jusqu'à présent :-). Mais le VBScript ne fonctionne pas pour moi: Erreur d'exécution Microsoft VBScript: le composant ActiveX ne peut pas créer l'objet: 'ScriptPW.Password'. Windows 7 Beta x64 ici.
Joey
Intéressant, il est censé être disponible à partir de XP. Je soupçonne que Win7 n'est pas encore tout à fait terminé s'il ne fonctionne pas là-bas (ou si vous devez faire une autre supercherie pour le faire fonctionner). Un peu de recherche montre pourquoi: voir ma mise à jour.
paxdiablo
2
Agréable. Il est également bon de noter que vous pouvez remplacer le fichier VBS par tout langage équivalent pouvant être appelé à partir de la ligne de commande. Par exemple, vous pouvez remplacer la section cscript par: 'python -c "from getpass import getpass; pwd = getpass (); print pwd;"'
Cerin
1
J'avais l'habitude d'utiliser cette façon lorsque cette question était nouvelle - j'ai répondu ci - dessous à un moyen de le faire sans scripts supplémentaires.
démêler
1
@Bill: D'où ma section commençant "Maintenant, malheureusement, ..." :-) Cependant, j'ai ajouté plus d'options à la réponse pour l'améliorer. Plus précisément, l'utilisation de PowerShell plutôt que scriptpw.dll.
paxdiablo
153

Oui, j'ai 4 ans de retard.

Mais j'ai trouvé un moyen de le faire en une seule ligne sans avoir à créer un script externe; en appelant des commandes PowerShell à partir d'un fichier de commandes.

Merci à TessellatingHeckler - sans sortie dans un fichier texte (j'ai défini la commande powershell dans une variable, car c'est assez désordonné dans une longue ligne dans une boucle 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%

À l'origine, je l'ai écrit pour le sortir dans un fichier texte, puis je l'ai lu à partir de ce fichier texte. Mais la méthode ci-dessus est meilleure. Dans une ligne extrêmement longue, presque incompréhensible:

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

Je vais le décomposer - vous pouvez le diviser en quelques lignes en utilisant le curseur ^, ce qui est beaucoup plus agréable ...

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

Cet article explique ce que font les commandes PowerShell; essentiellement, il obtient l'entrée en utilisant Read-Host -AsSecureString- les deux lignes suivantes convertissent cette chaîne sécurisée en texte brut, la sortie (mot de passe en clair) est ensuite envoyée dans un fichier texte en utilisant >.tmp.txt. Ce fichier est ensuite lu dans une variable et supprimé.

démêler
la source
5
La réponse originale était excellente, mais je pense que cela devrait être la réponse définitive maintenant
James Wiseman
30
C'est génial. Mais la façon dont il enregistre un mot de passe en texte brut sur le disque me met mal à l'aise. Évitez de faire cela en faisant cela à la place: 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=%%pet ensuite echo %password%. NB. Je ne peux pas obtenir ce commentaire pour échapper correctement aux backticks - avant "powershell", et avant la fin ")" il y a deux backticks, mais devrait être un backtick.
TessellatingHeckler
1
@TessellatingHeckler Bonne idée, j'ai mis à jour ma réponse. Une version légèrement modifiée de votre suggestion. Merci.
démêler
Est-il possible d'empêcher cette méthode de faire écho "*" (étoile) à chaque pression de touche? c'est-à-dire que je ne veux pas qu'un observateur sache la durée du mot de passe.
Sam Hasler
1
@RegieBaguio Non, vous devrez activer Powershell. Jetez un œil à la solution pure Batch de npocmaka ci-dessous. C'est beaucoup plus compliqué, mais cela devrait fonctionner pour vous.
démêler
26

Solution par lots pure qui (ab) utilise la XCOPYcommande et ses /P /Lcommutateurs trouvés ici (quelques améliorations à ce sujet peuvent être trouvées ici ):

:: 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 Une autre méthode basée sur la commande replace

@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. émetteur de mot de passe qui utilise une fenêtre contextuelle HTA . Il s'agit d'un fichier hybrit .bat / jscript / mshta et doit être enregistré en tant que .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 hybride .net auto-compilé .Again doit être sauvegardé sous .bat.A la différence des autres solutions, il créera / compilera un petit fichier .exe qui sera appelé (si vous le souhaitez, vous pouvez le supprimer). Nécessite également un framework .net installé, mais ce n'est pas un problème:

@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
la source
6
Mon sens hacky me pique, surtout chez l'hybride!
Mark K Cowan
2
Cette première solution est très intelligente - belle +1.
démêler
La méthode 2.1 basée sur la commande de remplacement manquera d'appuyer sur les touches si vous tapez rapidement
Sam Hasler
@SamHasler - oui, je vais essayer de résoudre ce problème, mais je n'ai pas pu reproduire le problème avec la version 2.1. J'ai également mis à jour le HTA pour vérifier si vous appuyez sur Entrée.
npocmaka
1
@npocmaka la dernière version de la méthode 1.2 (Dernière mise à jour: 20150405) est ici: consolesoft.com/batch/password_input/password_input.cmd
carlos
16

Je ferais probablement juste:

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

Ainsi, vous obtenez une invite, puis l'écran s'efface une fois entré.

Notez que le mot de passe saisi sera stocké dans l'historique CMD si le fichier batch est exécuté à partir d'une invite de commande (Merci @Mark K Cowan ).

Si cela ne suffisait pas, je passerais soit à python, soit j'écrirais un exécutable au lieu d'un script.

Je sais qu'aucune de ces solutions n'est parfaite, mais peut-être qu'une est assez bonne pour vous :)

Blorgbeard est sorti
la source
4
Notez que le mot de passe saisi sera stocké dans l'historique CMD si le fichier de commandes est exécuté à partir d'une invite de commande. Pas de vote négatif, car vous avez à peu près dit que cmd est le mauvais outil pour le travail.
Mark K Cowan du
Vous pouvez exécuter doskey /reinstallpour effacer le tampon de commande précédent immédiatement après cls, si l'historique des commandes dans la console n'est pas important pour vous.
RuntimeException
1
si vous ne souhaitez pas utiliser doskey / reinstall et effacer l'historique des commandes, une autre option consiste à exécuter le code ci-dessus dans une fenêtre de terminal séparée et à le quitter immédiatement. Notez qu'il ne remplace toujours pas votre chaîne saisie par des astérisques. La solution ci-dessus est une option si vous ne souhaitez pas exécuter PowerShell. C:\>start "console" cmd /c ireadconsole.bat
RuntimeException
9

Vous pouvez utiliser le sous-programme ReadFormattedLine pour tout type d'entrée formatée. Par exemple, la commande ci-dessous lit un mot de passe de 8 caractères, affiche des astérisques à l'écran et continue automatiquement sans avoir besoin d'appuyer sur Entrée:

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

Ce sous-programme est écrit en pur Batch donc il ne nécessite aucun programme supplémentaire, et il permet plusieurs opérations d'entrée formatées, comme lire uniquement des nombres, convertir des lettres en majuscules, etc. Vous pouvez télécharger le sous-programme ReadFormattedLine à partir de Lire une ligne avec un format spécifique .


EDIT 2018-08-18 : Nouvelle méthode pour saisir un mot de passe "invisible"

La commande FINDSTR a un bogue étrange qui se produit lorsque cette commande est utilisée pour afficher des caractères en couleur ET que la sortie d'une telle commande est redirigée vers le périphérique CON. Pour plus d'informations sur l'utilisation de la commande FINDSTR pour afficher le texte en couleur, consultez cette rubrique .

Lorsque la sortie de cette forme de commande FINDSTR est redirigée vers CON, quelque chose d'étrange se produit après que le texte est sorti dans la couleur souhaitée: tout le texte après qu'il est sorti en tant que caractères "invisibles", bien qu'une description plus précise soit que le texte est sortie sous forme de texte noir sur fond noir. Le texte d'origine apparaîtra si vous utilisez la commande COULEUR pour réinitialiser les couleurs de premier plan et d'arrière-plan de tout l'écran. Cependant, lorsque le texte est "invisible", nous pouvons exécuter une commande SET / P, de sorte que tous les caractères saisis n'apparaissent pas à l'écran.

@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
la source
5

une autre alternative est mes outils de ligne de commande EditV32 (x86) ou EditV64 (x64). Par exemple:

editv32 -m -p "Password: " PWD

-m signifie "entrée masquée" et -p est l'invite. L'entrée de l'utilisateur est stockée dans la variable d'environnement PWD. Vous pouvez l'obtenir ici:

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

Bill_Stewart
la source
5
Ce n'est pas la seule solution à source fermée (Windows est une source fermée!). Vous êtes libre de ne pas l'utiliser, bien sûr ...
Bill_Stewart
Si le manque de code source vous dérange, consultez mon autre réponse concernant ReadLine.exe .
Bill_Stewart
Bon! La licence vous permet de l'utiliser. De plus, facile à intégrer. Juste pour gérer le code de sortie 1. Erreur sur la ligne de commande, 2 La ligne d'entrée était vide, 3 La variable d'environnement n'a pas été modifiée, 4 Programme abandonné avec Ctrl-C
James Jithin
Note: Le editenv32 / editenv64 et les services publics readline ont été remplacées par l'open source editenv utilty.
Bill_Stewart
4

Si le manque de code source vous dérange, j'ai une autre alternative.

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

Vous pouvez l'obtenir sur https://westmesatech.com/?page_id=49 . Le code source est inclus.

Bill_Stewart
la source
Note: Le editenv32 / editenv64 et les services publics readline ont été remplacées par l'open source editenv utilty.
Bill_Stewart le
3

Si vous avez installé Python, vous pouvez utiliser:

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

le résultat:

Enter the CVS password:
PASS: 123
Lutecki
la source
2

J'ai utilisé la solution ci-dessus de Blorgbeard, ce qui est en fait génial à mon avis. Ensuite, je l'ai amélioré comme suit:

  1. Google pour ansicon
  2. Téléchargez le fichier zip et un exemple de fichier texte.
  3. Installer (cela signifie copier 2 fichiers dans system32)

Utilisez-le comme ceci:

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

Cela fait passer la console en gris sur gris pour la saisie de votre mot de passe et revient en arrière lorsque vous avez terminé. L'ESC doit en fait être un caractère non imprimable, que vous pouvez copier à partir du fichier texte d'exemple téléchargé (apparaît comme une flèche gauche dans le Bloc-notes) dans votre fichier de commandes. Vous pouvez utiliser le fichier texte d'exemple pour rechercher les codes de toutes les combinaisons de couleurs.

Si vous n'êtes pas administrateur de la machine, vous pourrez probablement installer les fichiers dans un répertoire non-système, alors vous devrez ajouter le répertoire au PATH dans votre script avant d'appeler le programme et d'utiliser les séquences d'échappement. Cela pourrait même être probablement le répertoire actuel, si vous avez besoin d'un package distribuable non-administrateur contenant seulement quelques fichiers.

marcingo
la source
Je ne peux pas tester cela, mais je m'attendrais à ce que le mot de passe tapé apparaisse dans l'historique cmd par la suite.
Mark K Cowan
@MarkKCowan C'est exactement ce qui se passe.
sjngm
1

créer un fichier batch qui appelle celui nécessaire pour les caractères invisibles puis créer un raccourci pour le fichier batch appelé.

clic-droit

Propriétés

couleurs

texte == noir

fond == noir

appliquer

D'accord

l'espoir vous aide donc !!!!!!!!

cmd
la source
belle approche de réflexion latérale, même si tout n'est pas toujours pratique dans une situation de lot en raison de la nécessité de configurer l'environnement à l'avance. Oh attendez, peut-être que cela fonctionnerait: stackoverflow.com/a/14447306/14420 ou peut-être stackoverflow.com/questions/4339649/…
matt wilkie
1

MISE À JOUR:
J'ai ajouté deux nouvelles méthodes qui, au lieu d'utiliser cls pour masquer l'entrée, créent une nouvelle fenêtre contextuelle avec une seule ligne.

Les inconvénients sont qu'une méthode (méthode 2) laisse des fichiers indésirables dans le registre - "Si elle est exécutée sans les droits appropriés", et l'autre (méthode trois) ajoute des fichiers indésirables au script. Inutile de dire qu'il peut facilement être écrit dans n'importe quel fichier tmp et supprimé. J'ai juste essayé de trouver une alternative.

Limitation: Le mot de passe ne peut être que alphanumérique - pas d'autres caractères!

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

Mise à jour: J'ai trouvé le post de sachadee parfait et je viens d'y ajouter ma bizarrerie "pop-up".

@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
Hors du sujet
la source
1

J'ai écrit un programme open source appelé editenvqui remplace mes anciens editv32/ editv64utilitaires:

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

L' option --maskinput( -m) [*] vous permet de masquer (masquer) l'entrée tapée et a un caractère configurable (le caractère par défaut est *); par exemple:

editenv -m -p "Password: " PWD

L' option --prompt( -p) vous permet de spécifier une invite d'entrée. Ce qui précède affichera une Password:invite et attendra que vous entriez quelque chose. Les caractères tapés apparaîtront comme *. Appuyez sur Ctrl+ Cpour terminer le programme avec un code de sortie de 1223.

Le téléchargement est ici:

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

[*] Notez que l' option --maskinput( -m) n'est pas sécurisée - la chaîne saisie est saisie en texte brut dans l'environnement. Cette fonction est fournie à titre indicatif uniquement.

Bill_Stewart
la source
-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
la source
Vous n'avez pas expliqué le code et vous venez de copier ce code. Ce n'est pas un bon moyen de le faire, car vous devez actualiser l'écran et le mot de passe doit comporter x caractères.
Anic17
-1

Une autre option, dans le même esprit que Blorgbeard is out , est d'utiliser quelque chose comme:

SET /P pw=C:\^>

L' ^échappe le >afin que l'invite de mot de passe ressemble à une invite de console cmd standard.

nimbell
la source
1
La question n'est pas de savoir comment masquer / masquer l'invite de mot de passe, mais d'empêcher le mot de passe de s'afficher lors de la saisie. Donc cela ne répond pas (essaye de) répondre à la question.
Stephan le
Ni la réponse à laquelle j'ai lié (qui au moment de la rédaction a 13 votes positifs). Ma réponse est juste en train de développer cela, car cela peut être une alternative utile pour certains (comme Blogbeard is out l'était pour moi). (J'aurais ajouté comme commentaire, mais le site ne me le permettra pas.)
nimbell
Ce n'est pas une bonne réponse. Vous ne masquez ni ne cachez le mot de passe. Veuillez commenter une fois que vous avez une bonne solution ou réponse.
Anic17
-3

J'ai lu toutes les solutions maladroites sur le net sur la façon de masquer les mots de passe dans un fichier batch, celles qui utilisent une solution hide.com et même celles qui donnent la même couleur au texte et à l'arrière-plan. La solution hide.com fonctionne correctement, n'est pas très sécurisée et ne fonctionne pas sous Windows 64 bits. Donc de toute façon, en utilisant des utilitaires 100% Microsoft, il y a un moyen!

Tout d'abord, laissez-moi vous expliquer mon utilisation. J'ai environ 20 postes de travail qui se connectent automatiquement à Windows. Ils ont un raccourci sur leur bureau - vers une application clinique. Les machines sont verrouillées, elles ne peuvent pas cliquer avec le bouton droit de la souris, elles ne peuvent rien faire d'autre que d'accéder au seul raccourci sur leur bureau. Parfois, il est nécessaire pour un technicien de lancer certaines applications de débogage, de parcourir l'explorateur Windows et de consulter les fichiers journaux sans déconnecter le compte utilisateur d'autolog.

Voici donc ce que j'ai fait.

Faites-le comme vous le souhaitez, mais je place mes deux fichiers batch sur un partage réseau auquel l'ordinateur verrouillé a accès.

Ma solution utilise 1 composant principal de Windows - runas. Mettez un raccourci sur les clients vers le runas.bat que vous êtes sur le point de créer. Pour votre information, sur mes clients, j'ai renommé le raccourci pour une meilleure visualisation et changé l'icône.

Vous devrez créer deux fichiers batch.

J'ai nommé les fichiers batch runas.bat et Debug Support.bat

runas.bat contient le code suivant:

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

Vous pouvez en ajouter autant si "% un%" et sinon "% un%" pour tous les utilisateurs auxquels vous souhaitez donner accès. Le @ping est ma façon coonass de créer une minuterie de secondes.

Donc ça s'occupe du premier fichier batch - assez simple hein?

Voici le code pour 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

Je ne suis pas un codeur et j'ai vraiment commencé à me lancer dans la création de scripts par lots il y a environ un an, et cette manière que j'ai découverte de masquer un mot de passe dans un fichier de commandes est plutôt géniale!

J'espère entendre que quelqu'un d'autre que moi peut en tirer profit!

CajunWonder
la source