Kann ich einen Eingabetext in einer Bat-Datei maskieren?


102

Ich schreibe eine Batch-Datei, um einige andere Programme auszuführen. In diesem Fall muss ich zur Eingabe eines Passworts auffordern. Kann ich den eingegebenen Text maskieren? Ich muss keine ******* Zeichen anstelle von Eingabezeichen drucken. Das Verhalten von Linux bei der Kennwortabfrage (während der Eingabe nichts drucken) reicht aus.

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

Dadurch wird die Eingabe gelesen, aber ich kann den Text mit diesem Ansatz nicht maskieren.


Antworten:


50

Bis XP und Server 2003 können Sie ein anderes enthaltenes Tool (VBScript) verwenden - die folgenden beiden Skripte erledigen den gewünschten Job.

Erstens getpwd.cmd:

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

Dann getpwd.vbs:

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

Der getpwd.vbsBenutzer verwendet einfach das Kennwortobjekt, um das Kennwort vom Benutzer einzugeben und es dann in der Standardausgabe auszudrucken (im nächsten Absatz wird erläutert, warum dies im Terminal nicht angezeigt wird).

Das getpwd.cmdBefehlsskript ist etwas kniffliger, funktioniert aber grundsätzlich wie folgt.

Der "<nul: set /p passwd=Password: "Befehl bewirkt , dass die Eingabeaufforderung ohne nachfolgendes Zeilenumbruchzeichen ausgegeben wird. Dies ist eine einfache Möglichkeit, den "echo -n"Befehl aus der bashShell zu emulieren . Es wird passwdals irrelevanter Nebeneffekt auf eine leere Zeichenfolge gesetzt und wartet nicht auf Eingaben, da die Eingaben vom nul:Gerät übernommen werden.

Die "for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i"Aussage ist das schwierigste Stück. Das VBScript wird ohne Microsoft "Werbung" ausgeführt, sodass die einzige Zeilenausgabe das Kennwort (aus dem VBscript) ist "Wscript.StdOut.WriteLine strPassword".

Das Setzen der Trennzeichen auf nichts ist erforderlich, um eine gesamte Eingabezeile mit Leerzeichen zu erfassen. Andernfalls erhalten Sie nur das erste Wort. Das "for ... do set ..."Bit wird passwdals tatsächliche Kennwortausgabe aus dem VBScript festgelegt.

Dann geben wir eine leere Zeile zurück (um die "Password: "Zeile zu beenden ) und das Kennwort befindet sich in der passwdUmgebungsvariablen, nachdem der Code ausgeführt wurde.


Wie bereits erwähnt, scriptpw.dllist es jetzt nur bis XP / 2003 verfügbar. Um dies zu korrigieren, können Sie die scriptpw.dllDatei einfach aus dem Windows\System32Ordner eines XP / 2003-Systems in den Ordner Winnt\System32oder Windows\System32auf Ihrem eigenen System kopieren . Nachdem die DLL kopiert wurde, müssen Sie sie registrieren, indem Sie Folgendes ausführen:

regsvr32 scriptpw.dll

Um die DLL unter Vista und höher erfolgreich zu registrieren, benötigen Sie Administratorrechte. Ich habe die Rechtmäßigkeit eines solchen Schrittes nicht geprüft, also Höhlenlektor.


Wenn Sie nicht sind allzu scharf auf versuchen , ältere DLL - Dateien aufzuspüren und registrieren (der Einfachheit halber oder aus rechtlichen Gründen), gibt es eine andere Art und Weise. In späteren Windows-Versionen (die nicht über die erforderliche DLL verfügen) sollte Powershell verfügbar sein.

Tatsächlich sollten Sie in Betracht ziehen, Ihre Skripte zu aktualisieren, um sie vollständig nutzen zu können, da sie eine viel leistungsfähigere Skriptsprache sind als cmd.exe. Wenn Sie jedoch den Großteil Ihres Codes als cmd.exeSkripte behalten möchten (z. B. wenn Sie viel Code haben, den Sie nicht konvertieren möchten), können Sie denselben Trick verwenden.

Ändern Sie zunächst das cmdSkript so, dass es Powershell anstelle von CScript aufruft:

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

Das Powershell-Skript ist ebenso einfach:

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

obwohl mit etwas Marshalling, um den eigentlichen Passworttext zu erhalten.

Denken Sie daran, dass Sie zum Ausführen lokaler nicht signierter Powershell-Skripts auf Ihrem Computer möglicherweise die Ausführungsrichtlinie von der (drakonischen, wenn auch sehr sicheren) Standardeinstellung mit folgenden Elementen ändern müssen:

set-executionpolicy remotesigned

aus Powershell heraus.


2
Whoa, das <nul: set / p ist wirklich cool. Wusste das bisher nicht :-). Aber das VBScript funktioniert bei mir nicht: Microsoft VBScript-Laufzeitfehler: ActiveX-Komponente kann kein Objekt erstellen: 'ScriptPW.Password'. Windows 7 Beta x64 hier.
Joey

Interessant, es soll ab XP verfügbar sein. Ich vermute, dass Win7 noch nicht ganz fertig ist, wenn es dort nicht funktioniert (oder Sie müssen andere Tricks ausführen, um es zum Laufen zu bringen). Ein bisschen Forschung zeigt warum: siehe mein Update.
Paxdiablo

2
Nett. Beachten Sie auch, dass Sie die VBS-Datei durch eine beliebige äquivalente Sprache ersetzen können, die über die Befehlszeile aufgerufen werden kann. Zum Beispiel können Sie den cscript-Abschnitt durch Folgendes ersetzen: 'python -c "aus getpass import getpass; pwd = getpass (); print pwd;"'
Cerin

1
Ich habe diesen Weg früher verwendet, als diese Frage neu war - ich habe unten eine Möglichkeit beantwortet , dies ohne zusätzliche Skripte zu tun.
Unclemeat

1
@ Bill: Daher beginnt mein Abschnitt mit "Jetzt leider ..." :-) Ich habe der Antwort jedoch weitere Optionen hinzugefügt, um sie hoffentlich zu verbessern. Insbesondere die Verwendung von Powershell eher als scriptpw.dll.
Paxdiablo

153

Ja - ich bin 4 Jahre zu spät.

Aber ich habe einen Weg gefunden, dies in einer Zeile zu tun, ohne ein externes Skript erstellen zu müssen. durch Aufrufen von Powershell-Befehlen aus einer Batch-Datei.

Dank TessellatingHeckler - ohne Ausgabe in eine Textdatei (ich habe den Powershell-Befehl in einer Variablen festgelegt, weil er in einer langen Zeile innerhalb einer for-Schleife ziemlich chaotisch ist).

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

Ursprünglich habe ich es geschrieben, um es in eine Textdatei auszugeben, und dann aus dieser Textdatei gelesen. Aber die obige Methode ist besser. In einer extrem langen, nahezu unverständlichen Zeile:

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

Ich werde das aufschlüsseln - Sie können es mit Caret auf ein paar Zeilen aufteilen ^, was viel schöner ist ...

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

Dieser Artikel erklärt, was die Powershell-Befehle tun. Im Wesentlichen wird es mit eingegeben Read-Host -AsSecureString- die folgenden zwei Zeilen konvertieren diese sichere Zeichenfolge wieder in Klartext. Die Ausgabe (Klartext-Passwort) wird dann mit an eine Textdatei gesendet >.tmp.txt. Diese Datei wird dann in eine Variable eingelesen und gelöscht.


5
Die ursprüngliche Antwort war großartig, aber ich denke, dies sollte jetzt die endgültige sein
James Wiseman

30
Das ist brilliant. Aber die Art und Weise, wie ein Nur-Text-Passwort auf der Festplatte gespeichert wird, macht mich unbehaglich. Vermeiden Sie dies, indem Sie dies stattdessen tun: 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=%%pund dann echo %password%. NB. Ich kann diesen Kommentar nicht dazu bringen, Backticks richtig zu entkommen - vor "Powershell" und vor dem Ende ")" sind zwei Backticks, sollten aber ein Backtick sein.
TessellatingHeckler

1
@TessellatingHeckler Gute Idee, ich habe meine Antwort aktualisiert. Eine leicht modifizierte Version Ihres Vorschlags. Vielen Dank.
Unclemeat

Ist es möglich zu verhindern, dass diese Methode bei jedem Tastendruck "*" (Stern) wiedergibt? dh ich möchte nicht, dass ein Beobachter weiß, wie lang das Passwort ist.
Sam Hasler

1
@RegieBaguio Nein, Powershell muss aktiviert sein. Schauen Sie sich unten die reine Batch-Lösung von npocmaka an. Es ist viel komplizierter, sollte aber für Sie funktionieren.
Unclemeat

26

1. Reine Batch-Lösung , die (ab) den XCOPYBefehl und seine hier/P /L gefundenen Schalter verwendet (einige Verbesserungen hierzu finden Sie hier ):

:: 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 Eine andere Möglichkeit basierend auf dem Ersetzungsbefehl

@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.Password-Übermittler, der ein HTA-Popup verwendet . Dies ist eine hybrit .bat / jscript / mshta- Datei und sollte als .bat gespeichert werden :

<!-- :
:: 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. Ein selbstkompilierter .net-Hybrid .Again sollte als .bat. Gespeichert werden. Im Gegensatz zu anderen Lösungen wird eine kleine EXE-Datei erstellt / kompiliert, die aufgerufen wird (wenn Sie möchten, können Sie sie löschen). Erfordert auch ein installiertes .net-Framework, aber das ist kein Problem:

@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);

6
Mein hackiger Sinn kribbelt, besonders beim Hybrid!
Mark K Cowan

2
Diese erste Lösung ist sehr clever - schön +1.
Unclemeat

Die 2.1-Methode, die auf dem Befehl replace basiert, verpasst Tastendrücke, wenn Sie schnell tippen
Sam Hasler

@ SamHasler - ja. Ich werde versuchen, dies zu beheben. Obwohl das Problem mit dem 2.1 nicht reproduziert werden konnte. Ich habe auch die HTA aktualisiert, um zu überprüfen, ob die Eingabetaste gedrückt wird.
Npocmaka

1
@npocmaka die letzte Version des 1.2 - Methode (Letzte Änderung: 20150405) ist hier: consolesoft.com/batch/password_input/password_input.cmd
carlos

16

Ich würde wahrscheinlich nur tun:

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

Sie erhalten eine Eingabeaufforderung, und der Bildschirm wird nach der Eingabe gelöscht.

Beachten Sie, dass das eingegebene Kennwort im CMD-Verlauf gespeichert wird, wenn die Batchdatei über eine Eingabeaufforderung ausgeführt wird (Danke @Mark K Cowan ).

Wenn das nicht gut genug wäre, würde ich entweder zu Python wechseln oder eine ausführbare Datei anstelle eines Skripts schreiben.

Ich weiß, dass keine dieser Lösungen perfekt ist, aber vielleicht ist eine gut genug für dich :)


4
Beachten Sie, dass das eingegebene Kennwort im CMD-Verlauf gespeichert wird, wenn die Batchdatei an einer Eingabeaufforderung ausgeführt wird. Keine Ablehnung, da Sie so ziemlich gesagt haben, dass cmd das falsche Werkzeug für den Job ist.
Mark K Cowan

Sie können doskey /reinstallden vorherigen Befehlspuffer unmittelbar danach ausführen cls, wenn der Befehlsverlauf in der Konsole für Sie nicht wichtig ist.
RuntimeException

1
Wenn Sie doskey / neu installieren und den Befehlsverlauf nicht löschen möchten, können Sie den obigen Code auch in einem separaten Terminalfenster ausführen und sofort beenden. Beachten Sie, dass Ihre eingegebene Zeichenfolge immer noch nicht durch Sternchen ersetzt wird. Die obige Lösung ist eine Option, wenn Sie Powershell nicht ausführen möchten. C:\>start "console" cmd /c ireadconsole.bat
RuntimeException

9

Sie können die Unterroutine ReadFormattedLine für alle Arten von formatierten Eingaben verwenden. Mit dem folgenden Befehl können Sie beispielsweise ein Kennwort mit 8 Zeichen lesen, Sternchen auf dem Bildschirm anzeigen und automatisch fortfahren, ohne die Eingabetaste drücken zu müssen:

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

Diese Unterroutine ist in reinem Stapel geschrieben, sodass kein zusätzliches Programm erforderlich ist. Sie ermöglicht mehrere formatierte Eingabeoperationen wie das Lesen von Zahlen, das Konvertieren von Buchstaben in Großbuchstaben usw. Sie können die Unterroutine ReadFormattedLine von Read a line mit einem bestimmten Format herunterladen .


EDIT 2018-08-18 : Neue Methode zur Eingabe eines "unsichtbaren" Passworts

Der Befehl FINDSTR hat einen seltsamen Fehler, der auftritt, wenn dieser Befehl verwendet wird, um Zeichen in Farbe anzuzeigen UND die Ausgabe eines solchen Befehls an das CON-Gerät umgeleitet wird. Ausführliche Informationen zur Verwendung des Befehls FINDSTR zum Anzeigen von Text in Farbe finden Sie in diesem Thema .

Wenn die Ausgabe dieser Form des FINDSTR-Befehls an CON umgeleitet wird, passiert etwas Seltsames, nachdem der Text in der gewünschten Farbe ausgegeben wurde: Der gesamte Text nach der Ausgabe als "unsichtbare" Zeichen, obwohl eine genauere Beschreibung lautet, dass der Text ist Ausgabe als schwarzer Text über schwarzem Hintergrund. Der Originaltext wird angezeigt, wenn Sie mit dem Befehl COLOR die Vordergrund- und Hintergrundfarben des gesamten Bildschirms zurücksetzen. Wenn der Text jedoch "unsichtbar" ist, können wir einen SET / P-Befehl ausführen, sodass nicht alle eingegebenen Zeichen auf dem Bildschirm angezeigt werden.

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

5

Eine andere Alternative sind meine Befehlszeilentools EditV32 (x86) oder EditV64 (x64). Beispielsweise:

editv32 -m -p "Password: " PWD

-m bedeutet "maskierte Eingabe" und -p ist die Eingabeaufforderung. Die Benutzereingaben werden in der PWD-Umgebungsvariablen gespeichert. Sie können es hier bekommen:

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


5
Dies ist nicht die einzige Closed-Source-Lösung (Windows ist Closed-Source!). Sie können es natürlich nicht benutzen ...
Bill_Stewart

Wenn Sie der Mangel an Quellcode stört, lesen Sie meine andere Antwort zu ReadLine.exe .
Bill_Stewart

Gut! Mit der Lizenz können Sie es verwenden. Darüber hinaus einfach zu integrieren. Nur um den Exit-Code zu behandeln 1. Fehler in der Befehlszeile, 2 Eingabezeile war leer, 3 Umgebungsvariable wurde nicht geändert, 4 Programm mit Strg-C abgebrochen
James Jithin

Hinweis: Die Dienstprogramme editenv32 / editenv64 und readline wurden durch das Open-Source- Dienstprogramm editenv ersetzt.
Bill_Stewart


3

Wenn Sie Python installiert haben, können Sie Folgendes verwenden:

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

die Ausgabe:

Enter the CVS password:
PASS: 123

2

Ich habe die obige Lösung von Blorgbeard verwendet, die meiner Meinung nach wirklich großartig ist. Dann habe ich es wie folgt verbessert:

  1. Google für Ansicon
  2. Laden Sie die Zip-Datei und die Beispieltextdatei herunter.
  3. Installieren (dh 2 Dateien in system32 kopieren)

Verwenden Sie es so:

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

Dadurch wird die Konsole für die Kennworteingabe auf Grau auf Grau umgeschaltet und wenn Sie fertig sind, wird wieder zurückgeschaltet. Der ESC sollte eigentlich ein nicht druckbares Zeichen sein, das Sie aus der heruntergeladenen Beispieltextdatei (erscheint im Editor wie ein Pfeil nach links) in Ihre Batchdatei kopieren können. Sie können die Beispieltextdatei verwenden, um die Codes für alle Farbkombinationen zu finden.

Wenn Sie kein Administrator des Computers sind, können Sie die Dateien wahrscheinlich in einem Nicht-Systemverzeichnis installieren. Anschließend müssen Sie das Verzeichnis an den PATH in Ihrem Skript anhängen, bevor Sie das Programm aufrufen und die Escape-Sequenzen verwenden. Dies könnte wahrscheinlich sogar das aktuelle Verzeichnis sein, wenn Sie ein nicht vom Administrator verteilbares Paket mit nur wenigen Dateien benötigen.


Ich kann dies nicht testen, würde aber erwarten, dass das eingegebene Passwort später im cmd-Verlauf erscheint.
Mark K Cowan

@ MarkKCowan Genau das passiert.
sjngm

1

Erstellen Sie eine Batch-Datei, die die für unsichtbare Zeichen erforderliche aufruft, und erstellen Sie dann eine Verknüpfung für die aufgerufene Batch-Datei.

Rechtsklick

Eigenschaften

Farben

text == schwarz

Hintergrund == schwarz

anwenden

OK

hoffe also hilft dir !!!!!!!!


netter seitwärts denkender Ansatz, auch wenn in einer Batch-Situation nicht immer alle praktisch sind, da die Umgebung im Voraus eingerichtet werden muss. Oh, Moment mal
matt wilkie

1

UPDATE:
Ich habe zwei neue Methoden hinzugefügt, die anstelle von cls zum Ausblenden der Eingabe ein neues Popup mit nur einer Zeile erstellen.

Die Nachteile sind, dass eine Methode (Methode 2) Junk in der Registrierung hinterlässt - "Wenn ohne ordnungsgemäße Rechte ausgeführt" - und die andere (Methode drei) Junk an das Skript anfügt. Unnötig zu erwähnen, dass es leicht in jede tmp-Datei geschrieben und gelöscht werden kann. Ich habe nur versucht, eine Alternative zu finden.

Einschränkung: Das Passwort kann nur alphanumerisch sein - keine anderen Zeichen!

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

Update: Ich fand Sachadees Post perfekt und habe gerade meine "Pop-up" -Spirale hinzugefügt.

@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

1

Ich habe ein Open-Source-Programm namens geschrieben editenv, das meine älteren editv32/ editv64Dienstprogramme ersetzt:

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

Mit der Option --maskinput( -m) [*] können Sie die eingegebene Eingabe ausblenden (maskieren) und haben ein konfigurierbares Zeichen (Standardzeichen ist *). z.B:

editenv -m -p "Password: " PWD

Mit der Option --prompt( -p) können Sie eine Eingabeaufforderung angeben. Das Obige zeigt eine Password:Eingabeaufforderung an und wartet darauf, dass Sie etwas eingeben. Eingegebene Zeichen werden als angezeigt *. Durch Drücken von Ctrl+ Cwird das Programm mit einem Exit-Code von 1223 beendet.

Download ist hier:

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

[*] Beachten Sie, dass die Option --maskinput( -m) nicht sicher ist - die eingegebene Zeichenfolge wird in der Umgebung als Klartext eingegeben. Diese Funktion dient nur der Vereinfachung.



-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

Sie haben den Code nicht erklärt und nur kopiert. Dies ist keine gute Möglichkeit, da Sie den Bildschirm aktualisieren müssen und das Kennwort x Zeichen lang sein muss.
Anic17

-1

Eine andere Option, ähnlich wie bei Blorgbeard , ist die Verwendung von:

SET /P pw=C:\^>

Das wird ^ausgeblendet, >sodass die Kennwortabfrage wie eine Standard-Cmd-Konsolenaufforderung aussieht.


1
Die Frage ist nicht, wie die Passwortabfrage ausgeblendet / getarnt werden soll, sondern um zu verhindern, dass das Passwort während der Eingabe angezeigt wird. Dies beantwortet die Frage also nicht.
Stephan

Auch die Antwort, auf die ich verlinkt habe (die zum Zeitpunkt des Schreibens 13 positive Stimmen hat). Meine Antwort geht nur darauf ein, da dies für einige eine nützliche Alternative sein kann (da Blogbeard für mich out ist). (Ich hätte als Kommentar hinzugefügt, aber die Seite erlaubt es mir nicht.)
Nimbell

Das ist keine gute Antwort. Sie maskieren oder verbergen das Passwort nicht. Bitte kommentieren Sie, sobald Sie eine gute Lösung oder Antwort haben.
Anic17

-3

Ich habe alle klobigen Lösungen im Internet darüber gelesen, wie Kennwörter in einer Batchdatei maskiert werden können, diejenigen, die eine hide.com-Lösung verwenden, und sogar diejenigen, bei denen Text und Hintergrund dieselbe Farbe haben. Die hide.com-Lösung funktioniert anständig, ist nicht sehr sicher und funktioniert unter 64-Bit-Windows nicht. Mit 100% Microsoft-Dienstprogrammen gibt es also einen Weg!

Lassen Sie mich zunächst meine Verwendung erklären. Ich habe ungefähr 20 Workstations, die sich automatisch bei Windows anmelden. Sie haben eine Verknüpfung auf ihrem Desktop - zu einer klinischen Anwendung. Die Maschinen sind gesperrt, sie können nicht mit der rechten Maustaste klicken, sie können nichts anderes tun, als auf die eine Verknüpfung auf ihrem Desktop zuzugreifen. Manchmal muss ein Techniker einige Debug-Anwendungen starten, den Windows Explorer durchsuchen und Protokolldateien anzeigen, ohne das Autolog-Benutzerkonto abzumelden.

Also hier ist was ich getan habe.

Tun Sie es, wie Sie möchten, aber ich habe meine beiden Batch-Dateien auf einer Netzwerkfreigabe abgelegt, auf die der gesperrte Computer Zugriff hat.

Meine Lösung verwendet 1 Hauptkomponente von Windows - Runas. Fügen Sie den Clients eine Verknüpfung zu der runas.bat hinzu, die Sie erstellen möchten. Zu Ihrer Information, bei meinen Kunden habe ich die Verknüpfung zur besseren Anzeige umbenannt und das Symbol geändert.

Sie müssen zwei Batchdateien erstellen.

Ich habe die Batch-Dateien runas.bat und Debug Support.bat benannt

runas.bat enthält den folgenden Code:

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

Sie können für alle Benutzer, auf die Sie Zugriff gewähren möchten, beliebig viele hinzufügen, wenn "% un%" und wenn nicht "% un%". Das @ping ist meine Coonass-Methode, um einen Sekunden-Timer zu erstellen.

Das kümmert sich also um die erste Batch-Datei - ziemlich einfach, oder?

Hier ist der Code für 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

Ich bin kein Programmierer und habe erst vor ungefähr einem Jahr angefangen, mich mit Batch-Skripten zu beschäftigen, und diese Art und Weise, wie ich herausgefunden habe, ein Passwort in einer Batch-Datei zu maskieren, ist ziemlich großartig!

Ich hoffe zu hören, dass jemand anders als ich etwas davon nutzen kann!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.