12 Stimmen

Was wäre das Windows-Batch-Äquivalent für die HTML-Eingabe type="password"?

Ich muss die Authentifizierungsdaten der Benutzer in einem Windows-Skript abrufen, aber mit dem klassischen Ansatz "erstes Google-Ergebnis":

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

ist weniger als zufriedenstellend, also habe ich mich gefragt, ob es, sagen wir mal, ein "Äquivalent" zu HTML-Eingabe type="Passwort" ?

Für jeden Kommentar wäre ich sehr dankbar, vielen Dank im Voraus!

0 Stimmen

Können Sie ein wenig mehr Kontext zur Verfügung stellen; ist dies für Mapping/Zugriff auf eine Freigabe, Anmeldung bei einem Remotecomputer oder etwas anderes?

0 Stimmen

Grundsätzlich sollten Benutzer ihre Anmeldedaten angeben, um sich gegenüber einem Subversion-Repository zu authentifizieren. Inzwischen haben wir einen Workaround implementiert, der auf einigen Konventionen basiert, aber es wäre großartig, eine Lösung zu implementieren, ohne solche Beschränkungen aufstellen zu müssen, die die Sicherheitsstärke deutlich verringern.

0 Stimmen

Eine sehr wichtige Frage. Wir brauchen Skripte zum Starten von Anwendungen, solche Skripte müssen archiviert werden, aber Passwörter dürfen nicht in Skripten gespeichert werden, nicht in Skripten archiviert werden und bei der Eingabe nicht auf dem Bildschirm erscheinen

5voto

Schau dir das an

http://www.netikka.net/tsneti/info/tscmd052.htm

@echo off & setlocal enableextensions
    :: Build a Visual Basic Script
    set vbs_=%temp%\tmp$$$.vbs
    set skip=
    findstr "'%skip%VBS" "%~f0" > "%vbs_%"
    ::
    :: Prompting without linefeed as in Item #15
    echo.|set /p="Password: "

    :: Run the script with Microsoft Windows Script Host Version 5.6
    for /f "tokens=* delims=" %%a in ('cscript //nologo "%vbs_%"') do set MyPass1=%%a

    ::
    ::echo.
    echo.|set /p="Retype  : "

    for /f "tokens=* delims=" %%a in ('cscript //nologo "%vbs_%"') do set MyPass2=%%a
    ::

    :: Clean up
    for %%f in ("%vbs_%") do if exist %%f del %%f
    ::
    :: Demonstrate the result
    echo.
    if "%MyPass1%"=="%MyPass2%" (
      echo The entered password was %MyPass1%
      ) else (
      echo No match)
    endlocal & goto :EOF
    '
    'The Visual Basic Script
    Set WshPass = WScript.CreateObject("ScriptPW.Password") 'VBS
    Password=WshPass.GetPassWord() 'VBS
    WScript.Echo PassWord 'VBS

0 Stimmen

Da das Objekt "ScriptPW.Password" in Windows Vista, Windows 7 und Windows Server 2008 nicht unterstützt wird, habe ich ein kleine C#-Konsole Anwendung zu verwenden.

4voto

paxdiablo Punkte 809679

Die folgenden beiden Skripte erledigen die gewünschte Aufgabe, wenn Sie ein anderes, unter Windows frei verfügbares Tool sinnvoll einsetzen.

Erstens: GetPwd.cmd:

@echo off
:: GetPwd.cmd - Get password with no echo.
<nul: set /p passwd=Password: 
for /f "delims=" %%i in ('cscript /nologo GetPwd.vbs') do set passwd=%%i
echo.
:: This bit's just to prove we have the password.
echo %passwd%

Dann: GetPwd.vbs:

' GetPwd.vbs - Get password with no echo then echo it. '
Set oScriptPW = CreateObject("ScriptPW.Password")
strPassword = oScriptPW.GetPassword()
Wscript.StdOut.WriteLine strPassword

Erläuterung:

GetPwd.vbs verwendet einfach das Passwort-Objekt, um das Passwort des Benutzers einzugeben und es dann auf der Standardausgabe auszugeben (im nächsten Abschnitt wird erklärt, warum es nicht im Terminal angezeigt wird).

GetPwd.cmd ist etwas komplizierter (aber das sind Befehlsskripte in der Regel).

El "<nul: set /p passwd=Password: " Befehl gibt einfach die Eingabeaufforderung ohne CR/LF am Ende aus - ein raffinierter Weg, die bash-eigene "echo -n" . Sie setzt passwd zu einer leeren Zeichenkette als Nebeneffekt und wartet nicht auf eine Eingabe, da es seine Eingabe vom nul: Gerät erhält.

El "for /f "delims=" %%i in ('cscript /nologo GetPwd.vbs') do set passwd=%%i" Aussage ist der schwierigste Teil. Sie führt das vbscript ohne Microsoft-Werbung aus ( /nologo ), so dass die einzige Ausgabezeile das Passwort ist (aus dem vbscript "Wscript.StdOut.WriteLine strPassword" .

Um Eingabezeilen mit Leerzeichen zu erfassen, müssen die Begrenzungszeichen auf Null gesetzt werden, da sonst nur das erste Wort ausgegeben wird. Die "for ... do set ..." establece passwd ist das tatsächliche Kennwort, das vom Vbscript ausgegeben wird.

Dann geben wir eine Leerzeile aus (beenden also die "Password: " Zeile) und geben Sie das Passwort ein, damit Sie überprüfen können, ob es funktioniert:

C:\Pax> GetPwd
Password:
this is my password

C:\Pax> 

Die scriptpw.dll ist mit XP und 2K3 verfügbar, aber nicht unbedingt mit späteren Versionen.

Anleitungen für Vista und vermutlich auch für Win7 finden Sie unten, probieren Sie sie aus:

Um das Passwort zu maskieren, nutzt das Skript das COM-Objekt ScriptPW. ScriptPW ist unter Windows XP und Windows 2003 standardmäßig geladen. Wenn Sie mit Windows 2000 oder Windows Vista arbeiten, müssen Sie das scriptpw.dll Datei aus der Windows\System32 eines XP-Systems oder eines Windows 2003-Systems in den Ordner Winnt\System32 o Windows\System32 Ordner auf Ihrem Windows 2000- oder Vista-System. Sobald die DLL kopiert wurde, müssen Sie sie registrieren, indem Sie den Befehl ausführen:

regsvr32 scriptpw.dll

Um die DLL auf einem Vista-Rechner erfolgreich zu registrieren, müssen Sie die Eingabeaufforderung als Administrator öffnen. Klicken Sie dazu auf Start | Alle Programme | Zubehör. Klicken Sie dann mit der rechten Maustaste auf die Verknüpfung mit der Eingabeaufforderung und wählen Sie "Als Administrator ausführen". Sobald Sie die Eingabeaufforderung als Administrator geöffnet haben, können Sie die DLL erfolgreich ausführen. regsvr32 scriptpw.dll Befehl, um die DLL zu registrieren.

2voto

npocmaka Punkte 52753

1. reine Batch-Lösung die (ab)nutzt XCOPY Befehl und dessen /P /L Schalter gefunden 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 

2.Passwort-Einreicher, die ein HTA-Pop-up verwenden . Dies ist eine hybrit .bat/jscript/mshta Datei und sollte als .bat-Datei 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' >
        function pipePass() {
            var pass=document.getElementById('pass').value;
            var fso= new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1);
            close(fso.Write(pass));

        }
    </script>

    <input type='password' name='pass' size='15'></input>
    <hr>
    <button onclick='pipePass()'>Submit</button>

</body>
</html>

3. Ein selbst kompilierter .net-Hybrid .Again sollte gespeichert werden als .bat Im Unterschied zu anderen Lösungen wird eine kleine .exe-Datei erstellt/kompiliert, die aufgerufen wird (auf Wunsch können Sie sie löschen). Auch erfordert installiert .net Framework, aber das ist eher kein Problem:

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

for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\*jsc.exe"') do (
   set "jsc=%%v"
)

if not exist "%~n0.exe" (
    "%jsc%" /nologo /out:"%~n0.exe" "%~dpsfnx0"
)

for /f "tokens=* delims=" %%p in ('"%~n0.exe"') do (
    set "pass=%%p"
)

echo your password is %pass%

endlocal & exit /b %errorlevel%

*/

import System;

var pwd = "";
var key;

Console.Error.Write("Enter password: ");

        do {
           key = Console.ReadKey(true);
           if ( (key.KeyChar.ToString().charCodeAt(0)) >= 20 && (key.KeyChar.ToString().charCodeAt(0) <= 126) ) {
              pwd=pwd+(key.KeyChar.ToString());
              Console.Error.Write("*");
           }   

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

1voto

Dirk Vollmar Punkte 166522

Ich gehe davon aus, dass Sie kein Echo des Kennworts auf dem Bildschirm wünschen.

Wenn ein Popup-Fenster für Sie in Ordnung ist, könnten Sie z. B. VBScript verwenden, um ein IE-Fenster mit einem Kennwortfeld anzuzeigen. Hier ist ein Beispiel .

Alternativ können Sie Ihr Skript auch aus einer HTA-Datei (HTML Application) aufrufen (siehe Einführung in HTML-Anwendungen (HTAs) .

Grußworte, divo

1voto

Michael Hinds Punkte 821

Wenn Sie Cygwin installieren können, erhalten Sie standardmäßig eine Bash-Shell, so dass dieser Befehl funktionieren wird:

read -s -p "Kennwort: " PASSWORT

Das einzige Problem ist, dass der Wert von PASSWORD nur in der Bash-Shell gesetzt wird, nicht als Umgebungsvariable, die eine Batch-Datei sehen kann (verwenden Sie nicht PWD, da dies in Cygwin etwas anderes bedeutet). Sie müssten also Ihr Skript als Bash-Shell-Skript umschreiben (was angesichts der Beschränkungen der Eingabeaufforderung vielleicht nicht allzu schwer ist!).

Sie könnten das Kennwort auch in ein Batch-Skript von Cygwin aus eingeben, aber das bedeutet, dass Sie eine neue Instanz der Eingabeaufforderung ausführen müssen:

cmd /cyourbatchfile.bat $PASSWORD

Alles ein bisschen verworren und überhaupt nicht befriedigend ;)

3 Stimmen

Wenn Sie Cygwin installieren können ... scheint ein Overkill zu sein

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X