Bisakah saya menutupi teks input dalam file bat?


102

Saya menulis file batch untuk menjalankan beberapa program lain. Dalam hal ini saya perlu meminta kata sandi. Apakah saya punya cara untuk menutupi teks masukan? Saya tidak perlu mencetak karakter ******* alih-alih karakter input. Perilaku prompt Kata Sandi Linux (Tidak mencetak apa pun saat mengetik) sudah cukup.

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

Ini akan membaca input tetapi saya tidak bisa menutupi teks menggunakan pendekatan ini.


Jawaban:


50

Hingga XP dan Server 2003, Anda dapat menggunakan alat lain yang disertakan (VBScript) - dua skrip berikut melakukan pekerjaan yang Anda inginkan.

Pertama, getpwd.cmd:

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

Kemudian, getpwd.vbs:

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

The getpwd.vbshanya menggunakan objek password untuk input password dari pengguna dan kemudian mencetaknya ke output standar (paragraf berikutnya akan menjelaskan mengapa yang tidak muncul di terminal).

The getpwd.cmdScript perintah adalah rumit sedikit tapi pada dasarnya bekerja sebagai berikut.

Efek dari "<nul: set /p passwd=Password: "perintah ini adalah untuk menampilkan prompt tanpa karakter baris baru - ini adalah cara licik untuk meniru "echo -n"perintah dari bashshell. Ini disetel passwdke string kosong sebagai efek samping yang tidak relevan dan tidak menunggu masukan karena mengambil masukan dari nul:perangkat.

The "for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i"pernyataan adalah bit paling sulit. Ini menjalankan VBScript tanpa "iklan" Microsoft, sehingga satu-satunya keluaran baris adalah kata sandi (dari VBscript "Wscript.StdOut.WriteLine strPassword".

Mengatur pembatas menjadi tidak ada diperlukan untuk menangkap seluruh baris masukan dengan spasi, jika tidak, Anda hanya akan mendapatkan kata pertama. The "for ... do set ..."bit set passwdmenjadi output password yang sebenarnya dari VBScript.

Kemudian kami menggemakan baris kosong (untuk menghentikan "Password: "baris) dan kata sandi akan berada di passwdvariabel lingkungan setelah kode dijalankan.


Sekarang, seperti yang disebutkan, scriptpw.dllhanya tersedia hingga XP / 2003. Untuk memperbaikinya, Anda cukup menyalin scriptpw.dllfile dari Windows\System32folder sistem XP / 2003 ke folder Winnt\System32atau Windows\System32di sistem Anda sendiri. Setelah DLL disalin, Anda harus mendaftarkannya dengan menjalankan:

regsvr32 scriptpw.dll

Untuk berhasil mendaftarkan DLL di Vista dan yang lebih baru, Anda memerlukan hak administrator. Saya belum memeriksa legalitas dari langkah seperti itu jadi lektor gua.


Jika Anda tidak terlalu tertarik untuk mencoba melacak dan mendaftarkan file DLL yang lebih lama (untuk kenyamanan atau alasan hukum), ada cara lain. Versi Windows yang lebih baru (yang tidak memiliki DLL yang diperlukan) seharusnya memiliki Powershell yang tersedia untuk Anda.

Dan, pada kenyataannya, Anda benar-benar harus mempertimbangkan untuk meningkatkan skrip Anda untuk menggunakannya sepenuhnya karena ini adalah bahasa skrip yang jauh lebih mumpuni daripada cmd.exe. Namun, jika Anda ingin menyimpan sebagian besar kode Anda sebagai cmd.exeskrip (seperti jika Anda memiliki banyak kode yang tidak ingin Anda ubah), Anda dapat menggunakan trik yang sama.

Pertama, ubah cmdskrip sehingga memanggil Powershell daripada CScript:

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

Skrip Powershell sama sederhananya:

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

meskipun dengan beberapa pengaturan untuk mendapatkan teks kata sandi yang sebenarnya.

Ingatlah bahwa, untuk menjalankan skrip Powershell lokal yang tidak ditandatangani di komputer Anda, Anda mungkin perlu mengubah kebijakan eksekusi dari default (draconian, meskipun sangat aman), dengan sesuatu seperti:

set-executionpolicy remotesigned

dari dalam Powershell itu sendiri.


2
Wah, <nul: set / p itu keren banget. Sejauh ini tidak tahu :-). Tetapi VBScript tidak berfungsi untuk saya: Microsoft VBScript runtime error: Komponen ActiveX tidak dapat membuat objek: 'ScriptPW.Password'. Windows 7 Beta x64 di sini.
Joey

Menarik, ini seharusnya tersedia mulai dari XP. Saya curiga Win7 belum selesai jika tidak berhasil di sana (atau Anda harus melakukan beberapa tipuan lain untuk membuatnya berfungsi). Sedikit penelitian menunjukkan alasannya: lihat pembaruan saya.
paxdiablo

2
Bagus. Ada baiknya juga untuk dicatat bahwa Anda dapat mengganti file VBS dengan bahasa yang setara yang dapat dipanggil dari baris perintah. Misalnya, Anda dapat mengganti bagian cscript dengan: 'python -c "dari getpass import getpass; pwd = getpass (); print pwd;"'
Cerin

1
Saya biasa menggunakan cara ini ketika pertanyaan ini masih baru - Saya menjawab di bawah ini cara melakukannya tanpa skrip tambahan.
unclemeat

1
@Bill: Oleh karena itu bagian saya mulai "Sekarang, sayangnya, ..." :-) Namun, saya telah menambahkan lebih banyak opsi ke jawaban untuk semoga membuatnya lebih baik. Secara khusus, penggunaan PowerShell daripada scriptpw.dll.
paxdiablo

153

Ya - Saya terlambat 4 tahun.

Tetapi saya menemukan cara untuk melakukan ini dalam satu baris tanpa harus membuat skrip eksternal; dengan memanggil perintah PowerShell dari file batch.

Terima kasih kepada TessellatingHeckler - tanpa menghasilkan file teks (saya mengatur perintah PowerShell dalam variabel, karena cukup berantakan dalam satu baris panjang di dalam for loop).

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

Awalnya saya menulisnya ke output ke file teks, lalu membaca dari file teks itu. Tetapi cara di atas lebih baik. Dalam satu baris yang sangat panjang dan hampir tidak bisa dipahami:

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

Saya akan memecahnya - Anda dapat membaginya menjadi beberapa baris menggunakan tanda sisipan ^, yang jauh lebih bagus ...

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

Artikel ini menjelaskan apa yang dilakukan oleh perintah PowerShell; pada dasarnya itu mendapat input menggunakan Read-Host -AsSecureString- dua baris berikut mengubah string aman itu kembali menjadi teks biasa, output (kata sandi teks biasa) kemudian dikirim ke file teks menggunakan >.tmp.txt. File itu kemudian dibaca menjadi variabel dan dihapus.


5
Jawaban aslinya bagus, tapi saya pikir ini seharusnya menjadi jawaban yang pasti sekarang
James Wiseman

30
Ini brilian. Tetapi cara menyimpan kata sandi teks biasa ke disk membuat saya tidak nyaman. Hindari melakukan itu dengan melakukan ini sebagai gantinya: 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=%%pdan kemudian echo %password%. NB. Saya tidak bisa mendapatkan komentar ini untuk menghindari pukulan balik dengan benar - sebelum "PowerShell", dan sebelum akhir ")" adalah dua pukulan balik, tetapi harus satu pukulan balasan.
TessellatingHeckler

1
@TessellatingHeckler Ide bagus, saya telah memperbarui jawaban saya. Versi saran Anda yang sedikit dimodifikasi. Terima kasih.
daging

Apakah mungkin untuk menghentikan metode ini agar tidak menggemakan "*" (bintang) untuk setiap penekanan tombol? yaitu, saya tidak ingin pengamat mengetahui berapa panjang kata sandinya.
Sam Hasler

1
@RegieBaguio Tidak, Anda perlu mengaktifkan Powershell. Lihatlah solusi Batch murni npocmaka di bawah ini. Ini jauh lebih rumit, tetapi semestinya berhasil untuk Anda.
daging

26

1. Solusi batch murni yang (ab) menggunakan XCOPYperintah dan /P /Lsakelar - sakunya ditemukan di sini (beberapa peningkatan pada hal ini dapat ditemukan di sini ):

:: 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 Cara lain berdasarkan perintah ganti

@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. Pengirim kata sandi yang menggunakan pop-up HTA . Ini adalah file .bat / jscript / mshta hybrit dan harus disimpan sebagai .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. Hibrid .net yang dikompilasi sendiri. Sekali lagi harus disimpan sebagai .bat. Berbeda dengan solusi lain, ia akan membuat / mengompilasi file .exe kecil yang akan dipanggil (jika Anda ingin, Anda dapat menghapusnya). Juga membutuhkan kerangka kerja .net yang diinstal tetapi itu bukan masalah:

@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
Perasaan hacky saya kesemutan, terutama pada hybrid!
Mark K Cowan

2
Solusi pertama itu sangat pintar - bagus +1.
unclemeat

Metode 2.1 berdasarkan perintah ganti akan kehilangan penekanan tombol jika Anda mengetik dengan cepat
Sam Hasler

@ SamHasler - ya. Saya akan mencoba untuk memperbaikinya. Meskipun tidak dapat mereproduksi masalah dengan versi 2.1. Saya juga telah memperbarui HTA untuk memeriksa apakah enter ditekan.
npocmaka

1
@npocmaka versi terakhir dari metode 1.2 (Terakhir diperbarui: 20150405) ada di sini: consolesoft.com/batch/password_input/password_input.cmd
carlos

16

Saya mungkin hanya akan melakukan:

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

Jadi Anda mendapatkan prompt, lalu layar bersih setelah masuk.

Perhatikan bahwa kata sandi yang dimasukkan akan disimpan dalam sejarah CMD jika file batch dijalankan dari prompt perintah (Terima kasih @Mark K Cowan ).

Jika itu tidak cukup baik, saya akan beralih ke python, atau menulis yang dapat dieksekusi alih-alih skrip.

Saya tahu tidak ada yang sempurna, tapi mungkin satu cukup baik untuk Anda :)


4
Perhatikan bahwa kata sandi yang dimasukkan akan disimpan dalam sejarah CMD jika file batch dijalankan dari prompt perintah. Tidak ada suara negatif seperti yang Anda lakukan cukup banyak yang mengatakan bahwa cmd adalah alat yang salah untuk pekerjaan itu.
Mark K Cowan

Anda dapat menjalankan doskey /reinstalluntuk menghapus buffer perintah sebelumnya segera setelahnya cls, jika riwayat perintah di konsol tidak penting bagi Anda.
RuntimeException

1
jika Anda tidak ingin menggunakan doskey / instal ulang dan menghapus riwayat perintah, opsi lain adalah menjalankan kode di atas di jendela terminal terpisah dan segera keluar. Perhatikan bahwa itu masih tidak mengganti String yang Anda ketik dengan tanda bintang. Solusi di atas adalah pilihan jika Anda tidak ingin menjalankan PowerShell. C:\>start "console" cmd /c ireadconsole.bat
RuntimeException

9

Anda dapat menggunakan subrutin ReadFormattedLine untuk semua jenis masukan yang diformat. Misalnya, perintah di bawah ini membaca kata sandi yang terdiri dari 8 karakter, menampilkan tanda bintang di layar, dan melanjutkan secara otomatis tanpa perlu menekan Enter:

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

Subrutin ini ditulis dalam Batch murni sehingga tidak memerlukan program tambahan apa pun, dan memungkinkan beberapa operasi input yang diformat, seperti membaca angka saja, mengubah huruf menjadi huruf besar, dll. Anda dapat mengunduh subrutin ReadFormattedLine dari Membaca baris dengan format tertentu .


EDIT 18-08-2018 : Metode baru untuk memasukkan kata sandi "tidak terlihat"

Perintah FINDSTR memiliki bug aneh yang terjadi saat perintah ini digunakan untuk menampilkan karakter dalam warna DAN output dari perintah semacam itu diarahkan ke perangkat CON. Untuk detail tentang bagaimana menggunakan perintah FINDSTR untuk menampilkan teks berwarna, lihat topik ini .

Ketika keluaran dari bentuk perintah FINDSTR ini diarahkan ke CON, sesuatu yang aneh terjadi setelah teks dikeluarkan dalam warna yang diinginkan: semua teks setelah itu dikeluarkan sebagai karakter "tidak terlihat", meskipun penjelasan yang lebih tepat adalah bahwa teks tersebut adalah keluaran sebagai teks hitam di atas latar belakang hitam. Teks asli akan muncul jika Anda menggunakan perintah COLOR untuk mengatur ulang warna latar depan dan latar belakang seluruh layar. Namun, jika teks "tidak terlihat", kita dapat menjalankan perintah SET / P, sehingga semua karakter yang dimasukkan tidak akan muncul di layar.

@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

Alternatif lain adalah alat baris perintah EditV32 (x86) atau EditV64 (x64) saya. Sebagai contoh:

editv32 -m -p "Password: " PWD

-m berarti "input bertopeng" dan -p adalah promptnya. Masukan pengguna disimpan di variabel lingkungan PWD. Anda bisa mendapatkannya disini:

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


5
Ini bukan satu-satunya solusi sumber tertutup (Windows adalah sumber tertutup!). Anda bebas untuk tidak menggunakannya, tentu saja ...
Bill_Stewart

Jika kurangnya kode sumber mengganggu Anda, lihat jawaban saya yang lain tentang ReadLine.exe .
Bill_Stewart

Bagus! Lisensi memungkinkan Anda untuk menggunakannya. Apalagi mudah diintegrasikan. Hanya untuk menangani kode keluar 1. Kesalahan pada baris perintah, 2 baris masukan kosong, 3 variabel lingkungan tidak diubah, 4 Program dibatalkan dengan Ctrl-C
James Jithin

Catatan: Utilitas editenv32 / editenv64 dan readline telah digantikan oleh utilitas editenv sumber terbuka .
Bill_Stewart

4

Jika kurangnya kode sumber mengganggu Anda, saya punya alternatif lain.

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

Anda bisa mendapatkannya dari https://westmesatech.com/?page_id=49 . Kode sumber disertakan.


Catatan: Utilitas editenv32 / editenv64 dan readline telah digantikan oleh utilitas editenv sumber terbuka .
Bill_Stewart

3

Jika Anda menginstal Python, Anda dapat menggunakan:

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

hasil:

Enter the CVS password:
PASS: 123

2

Saya menggunakan solusi Blorgbeard di atas yang sebenarnya bagus menurut saya. Lalu saya tingkatkan sebagai berikut:

  1. Google untuk ansicon
  2. Unduh file zip dan contoh file teks.
  3. Instal (itu berarti salin 2 file ke system32)

Gunakan seperti ini:

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

Ini mengubah konsol menjadi abu-abu pada abu-abu untuk entri kata sandi Anda dan beralih kembali ketika Anda selesai. ESC seharusnya merupakan karakter yang tidak dapat dicetak, yang dapat Anda salin dari file teks sampel yang diunduh (tampak seperti panah kiri di Notepad) ke dalam file batch Anda. Anda dapat menggunakan file teks contoh untuk menemukan kode untuk semua kombinasi warna.

Jika Anda bukan admin mesin, Anda mungkin dapat menginstal file di direktori non-sistem, lalu Anda harus menambahkan direktori ke PATH di skrip Anda sebelum memanggil program dan menggunakan urutan escape. Ini bahkan bisa menjadi direktori saat ini, jika Anda memerlukan paket yang dapat didistribusikan non-admin hanya dari beberapa file.


Saya tidak bisa menguji ini, tetapi akan mengharapkan kata sandi yang diketik muncul di sejarah cmd sesudahnya.
Mark K Cowan

@ MarkKCowan Itulah yang terjadi.
sjngm

1

buat file batch yang memanggil file yang diperlukan untuk karakter tak terlihat, lalu buat pintasan untuk file batch yang dipanggil.

klik kanan

properti

warna

teks == hitam

background == hitam

menerapkan

baik

berharap dapat membantu Anda !!!!!!!!


pendekatan berpikir ke samping yang bagus, meskipun tidak semuanya selalu praktis dalam situasi batch karena harus mengatur lingkungan sebelumnya.
Tunggu

1

UPDATE:
Saya menambahkan dua metode baru yang alih-alih menggunakan cls untuk menyembunyikan input, mereka membuat pop-up baru dengan satu baris saja.

Kekurangannya adalah bahwa satu metode (metode 2) meninggalkan sampah di registri - "Jika dijalankan tanpa hak yang tepat", dan metode lainnya (metode tiga) menambahkan beberapa sampah ke skrip. Tak perlu dikatakan bahwa itu dapat dengan mudah ditulis ke file tmp apa pun dan dihapus, saya hanya mencoba mencari alternatif.

Batasan: Kata sandi hanya boleh alfanumerik - tidak ada karakter lain!

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

Pembaruan: Saya menemukan posting sachadee menjadi sempurna dan saya baru saja menambahkan kekhasan "pop-up" saya untuk itu.

@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

Saya menulis program sumber terbuka yang disebut editenvyang menggantikan editv32/ editv64utilitas lama saya :

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

Opsi --maskinput( -m) [*] memungkinkan Anda menyembunyikan (menutupi) input yang diketik dan memiliki karakter yang dapat dikonfigurasi (karakter default adalah *); misalnya:

editenv -m -p "Password: " PWD

Opsi --prompt( -p) memungkinkan Anda menentukan prompt input. Di atas akan menampilkan Password:prompt dan menunggu Anda memasukkan sesuatu. Karakter yang diketik akan muncul sebagai *. Menekan Ctrl+ Cakan mengakhiri program dengan kode keluar 1223.

Unduh di sini:

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

[*] Perhatikan bahwa opsi --maskinput( -m) tidak aman - string yang dimasukkan dimasukkan sebagai teks biasa di lingkungan. Fitur ini hanya untuk kenyamanan.



-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

Anda tidak menjelaskan kodenya dan Anda baru saja menyalin kode itu. Ini bukan cara yang baik untuk melakukannya, karena Anda perlu menyegarkan layar dan kata sandi harus sepanjang karakter x.
Anic17

-1

Pilihan lain, sepanjang baris yang sama seperti Blorgbeard keluar , adalah menggunakan sesuatu seperti:

SET /P pw=C:\^>

Itu ^lolos >sehingga prompt kata sandi akan terlihat seperti prompt konsol cmd standar.


1
Pertanyaannya bukanlah bagaimana menyembunyikan / menyamarkan prompt kata sandi tetapi untuk mencegah kata sandi muncul saat mengetik. Jadi ini tidak (mencoba) menjawab pertanyaan itu.
Stephan

Begitu pula jawaban yang saya tautkan (yang pada saat penulisan ini memiliki 13 suara positif). Jawaban saya hanya memperluas itu, karena ini mungkin alternatif yang berguna bagi sebagian orang (karena Blogbeard keluar untuk saya). (Saya akan menambahkan sebagai komentar, tetapi situs tidak mengizinkan saya.)
nimbell

Itu bukan jawaban yang bagus. Anda tidak menutupi atau menyembunyikan kata sandi. Tolong beri komentar setelah Anda memiliki solusi atau jawaban yang baik.
Anic17

-3

Saya membaca semua solusi kikuk di internet tentang cara menutupi kata sandi dalam file batch, yang menggunakan solusi hide.com dan bahkan yang membuat teks dan latar belakang memiliki warna yang sama. Solusi hide.com berfungsi dengan baik, tidak terlalu aman, dan tidak bekerja di Windows 64-bit. Jadi, dengan menggunakan 100% utilitas Microsoft, ada caranya!

Pertama, izinkan saya menjelaskan penggunaan saya. Saya memiliki sekitar 20 workstation yang logon otomatis ke Windows. Mereka memiliki satu pintasan di desktop mereka - ke aplikasi klinis. Mesin terkunci, mereka tidak dapat mengklik kanan, mereka tidak dapat melakukan apa pun selain mengakses satu pintasan di desktop mereka. Kadang-kadang teknisi perlu menjalankan beberapa aplikasi debug, menjelajahi windows explorer dan melihat file log tanpa logout akun pengguna autolog.

Jadi inilah yang telah saya lakukan.

Lakukan sesuka Anda, tetapi saya meletakkan dua file batch saya di jaringan bersama yang dapat diakses oleh komputer yang terkunci.

Solusi saya menggunakan 1 komponen utama Windows - runas. Letakkan pintasan pada klien ke runas.bat yang akan Anda buat. FYI, pada klien saya, saya mengganti nama pintasan untuk tujuan tampilan yang lebih baik dan mengubah ikon.

Anda perlu membuat dua file batch.

Saya menamai file batch runas.bat dan Debug Support.bat

runas.bat berisi kode berikut:

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

Anda dapat menambahkan sebanyak "% un%" dan jika tidak "% un%" untuk semua pengguna yang ingin Anda beri akses. @Ping adalah cara coonass saya untuk membuat timer detik.

Jadi itu menangani file batch pertama - cukup sederhana ya?

Berikut adalah kode untuk 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

Saya bukan seorang pembuat kode dan benar-benar baru mulai masuk ke skrip batch sekitar setahun yang lalu, dan putaran ini tentang cara saya menemukan penyamaran kata sandi dalam file batch cukup mengagumkan!

Saya berharap mendengar bahwa orang lain selain saya bisa memanfaatkannya!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.