Tôi có thể che một văn bản đầu vào trong tệp bat không?


102

Tôi đang viết một tệp hàng loạt để thực thi một số chương trình khác. Trong trường hợp này, tôi cần nhắc nhập mật khẩu. Tôi có cách nào để che văn bản đầu vào không? Tôi không cần in các ký tự ******* thay vì các ký tự đầu vào. Hành vi nhắc mật khẩu của Linux (Không in gì trong khi nhập) là đủ.

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

Điều này sẽ đọc đầu vào nhưng tôi không thể che văn bản bằng cách sử dụng phương pháp này.


Câu trả lời:


50

Lên đến XP và Server 2003, bạn có thể sử dụng một công cụ đi kèm khác (VBScript) - hai tập lệnh sau sẽ thực hiện công việc bạn muốn.

Thứ nhất, getpwd.cmd:

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

Sau đó, getpwd.vbs:

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

Đơn getpwd.vbsgiản là sử dụng đối tượng mật khẩu để nhập mật khẩu từ người dùng và sau đó in nó ra đầu ra tiêu chuẩn (đoạn tiếp theo sẽ giải thích tại sao điều đó không hiển thị trong thiết bị đầu cuối).

Các getpwd.cmd lệnh lệnh phức tạp hơn một chút nhưng về cơ bản nó hoạt động như sau.

Tác dụng của "<nul: set /p passwd=Password: "lệnh là xuất ra dấu nhắc không có ký tự dòng mới ở cuối - đó là một cách lén lút để mô phỏng "echo -n"lệnh từ trình bashbao. Nó đặt passwdthành một chuỗi trống như một tác dụng phụ không liên quan và không đợi đầu vào vì nó lấy đầu vào từ nul:thiết bị.

Các "for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i"tuyên bố là bit khó khăn nhất. Nó chạy VBScript mà không có "quảng cáo" của Microsoft, do đó đầu ra dòng duy nhất là mật khẩu (từ VBscript "Wscript.StdOut.WriteLine strPassword".

Đặt dấu phân cách thành không bắt buộc phải ghi lại toàn bộ dòng đầu vào có dấu cách, nếu không bạn chỉ nhận được từ đầu tiên. Các "for ... do set ..."bộ chút passwdlà ra mật khẩu thực tế từ VBScript.

Sau đó, chúng tôi lặp lại một dòng trống (để kết thúc "Password: "dòng) và mật khẩu sẽ nằm trong passwdbiến môi trường sau khi mã đã chạy.


Bây giờ, như đã đề cập, scriptpw.dllchỉ có sẵn cho XP / 2003. Để khắc phục điều này, bạn chỉ cần sao chép scriptpw.dlltệp từWindows\System32 thư mục của hệ thống XP / 2003 vào Winnt\System32hoặc Windows\System32thư mục trên hệ thống của riêng bạn. Sau khi DLL đã được sao chép, bạn sẽ cần đăng ký nó bằng cách chạy:

regsvr32 scriptpw.dll

Để đăng ký thành công DLL trên Vista trở lên, bạn cần có đặc quyền của quản trị viên. Tôi đã không kiểm tra tính hợp pháp của một động thái như vậy nên kẻ lừa đảo hang động.


Nếu bạn không quá quan tâm đến việc cố gắng theo dõi và đăng ký các tệp DLL cũ hơn (vì lý do thuận tiện hoặc pháp lý), có một cách khác. Các phiên bản Windows mới hơn (những phiên bản không có DLL bắt buộc) sẽ có sẵn Powershell cho bạn.

Và, trên thực tế, bạn thực sự nên xem xét việc nâng cấp các tập lệnh của mình để sử dụng nó đầy đủ vì nó là một ngôn ngữ kịch bản có khả năng hơn nhiều cmd.exe. Tuy nhiên, nếu bạn muốn giữ phần lớn mã của mình nhưcmd.exe tập lệnh (chẳng hạn như nếu bạn có nhiều mã mà bạn không muốn chuyển đổi), bạn có thể sử dụng thủ thuật tương tự.

Đầu tiên, hãy sửa đổi cmd tập lệnh để nó gọi Powershell thay vì CScript:

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

Tập lệnh Powershell cũng đơn giản như nhau:

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

mặc dù với một số điều chỉnh để có được văn bản mật khẩu thực tế.

Hãy nhớ rằng, để chạy các tập lệnh Powershell chưa được ký cục bộ trên máy của bạn, bạn có thể cần phải sửa đổi chính sách thực thi từ mặc định (hà khắc, mặc dù rất an toàn), với những thứ như:

set-executionpolicy remotesigned

từ bên trong chính Powershell.


2
Chà, cái đó <nul: set / p thật là tuyệt. Không biết rằng cho đến nay :-). Nhưng VBScript không hoạt động đối với tôi: Lỗi thời gian chạy Microsoft VBScript: Thành phần ActiveX không thể tạo đối tượng: 'ScriptPW.Password'. Windows 7 Beta x64 tại đây.
Joey

Thật thú vị, nó được cho là sẽ có từ XP trở đi. Tôi nghi ngờ Win7 vẫn chưa hoàn thành nếu nó không hoạt động ở đó (hoặc bạn phải thực hiện một số thủ thuật khác để nó hoạt động). Một chút nghiên cứu cho thấy lý do tại sao: hãy xem bản cập nhật của tôi.
paxdiablo

2
Đẹp. Cũng cần lưu ý rằng bạn có thể thay thế tệp VBS bằng bất kỳ ngôn ngữ tương đương nào có thể được gọi từ dòng lệnh. Ví dụ: bạn có thể thay thế phần cscript bằng: 'python -c "từ getpass import getpass; pwd = getpass (); print pwd;"'
Cerin

1
Tôi đã từng sử dụng cách này khi câu hỏi này mới - tôi đã trả lời bên dưới một cách để thực hiện điều đó mà không cần thêm script.
ô uế

1
@Bill: Do đó, phần của tôi bắt đầu "Bây giờ, thật không may, ..." :-) Tuy nhiên, tôi đã thêm nhiều tùy chọn hơn vào câu trả lời để hy vọng làm cho nó tốt hơn. Cụ thể, việc sử dụng powershell thay vì scriptpw.dll.
paxdiablo

153

Vâng - tôi đến muộn 4 năm.

Nhưng tôi đã tìm ra cách để thực hiện điều này trong một dòng mà không cần phải tạo một tập lệnh bên ngoài; bằng cách gọi các lệnh powershell từ một tệp hàng loạt.

Cảm ơn TessellatingHeckler - mà không cần xuất ra tệp văn bản (tôi đặt lệnh powershell trong một biến, vì nó khá lộn xộn trong một dòng dài bên trong vòng lặp 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%

Ban đầu tôi viết nó để xuất ra tệp văn bản, sau đó đọc từ tệp văn bản đó. Nhưng phương pháp trên là tốt hơn. Trong một dòng cực kỳ dài, gần như không thể hiểu nổi:

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

Tôi sẽ chia nhỏ điều này - bạn có thể chia nó thành một vài dòng bằng cách sử dụng dấu mũ ^, sẽ đẹp hơn nhiều ...

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

Bài viết này giải thích những gì các lệnh powershell đang làm; về cơ bản nó nhận đầu vào bằng cách sử dụng Read-Host -AsSecureString- hai dòng sau chuyển đổi chuỗi an toàn đó trở lại thành văn bản thuần túy, đầu ra (mật khẩu văn bản rõ) sau đó được gửi đến tệp văn bản bằng cách sử dụng >.tmp.txt. Tập tin đó sau đó được đọc thành một biến và bị xóa.


5
Câu trả lời ban đầu là tuyệt vời, nhưng tôi nghĩ rằng đây sẽ là một dứt khoát tại
James Wiseman

30
Điều này là tuyệt vời. Nhưng cách nó lưu mật khẩu văn bản thuần túy vào đĩa khiến tôi khó chịu. Tránh làm điều đó bằng cách thay vào đó: 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=%%pvà sau đó echo %password%. NB. Tôi không thể nhận được nhận xét này để thoát khỏi backticks đúng cách - trước "powershell" và trước ")" là hai backticks, nhưng phải là một backtick.
TessellatingHeckler

1
@TessellatingHeckler Ý kiến ​​hay, tôi đã cập nhật câu trả lời của mình. Một phiên bản sửa đổi một chút của đề xuất của bạn. Cảm ơn.
đúng

Có thể ngăn phương pháp này vang lên "*" (dấu sao) cho mỗi lần nhấn phím không? tức là tôi không muốn người quan sát biết mật khẩu dài bao nhiêu.
Sam Hasler

1
@RegieBaguio Không, bạn cần bật Powershell. Hãy xem giải pháp Batch nguyên chất của npocmaka dưới đây. Nó phức tạp hơn rất nhiều, nhưng sẽ phù hợp với bạn.
ô uế

26

1. Giải pháp hàng loạt tinh khiết (ab) sử dụng XCOPYlệnh và /P /Lcông tắc của nó được tìm thấy ở đây (một số cải tiến về điều này có thể được tìm thấy tại đây ):

:: 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 Một cách khác dựa trên lệnh thay thế

@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. trình gửi mật khẩu sử dụng cửa sổ bật lên HTA . Đây là tệp .bat / jscript / mshta hybrit và phải được lưu dưới dạng .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. Một .net lai .Again tự biên dịch nên được lưu dưới dạng .bat. Trong sự khác biệt với các giải pháp khác, nó sẽ tạo / biên dịch một tệp .exe nhỏ sẽ được gọi (nếu bạn muốn, bạn có thể xóa nó). Cũng yêu cầu khung .net được cài đặt nhưng đó không phải là vấn đề:

@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
Cảm giác hacky của tôi đang rạo rực, đặc biệt là lúc lai!
Mark K Cowan,

2
Giải pháp đầu tiên đó rất thông minh - một giải pháp tốt nhất là +1.
ô uế

Phương pháp 2.1 dựa trên thay thế lệnh sẽ bỏ lỡ bấm phím nếu bạn gõ một cách nhanh chóng
Sam Hasler

@SamHasler - vâng, tôi sẽ cố gắng sửa lỗi này. Mặc dù không thể tái tạo sự cố với 2.1. Tôi cũng đã cập nhật HTA để kiểm tra xem nhập có được nhấn không.
npocmaka

1
@npocmaka phiên bản cuối cùng của phương pháp 1.2 (Cập nhật lần cuối: 20.150.405) là ở đây: consolesoft.com/batch/password_input/password_input.cmd
carlos

16

Tôi có thể sẽ chỉ làm:

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

Vì vậy, bạn nhận được lời nhắc, sau đó màn hình sẽ xóa sau khi nhập.

Lưu ý rằng mật khẩu đã nhập sẽ được lưu trữ trong lịch sử CMD nếu tệp hàng loạt được thực thi từ dấu nhắc lệnh (Cảm ơn @Mark K Cowan ).

Nếu điều đó không đủ tốt, tôi sẽ chuyển sang python hoặc viết tệp thực thi thay vì tập lệnh.

Tôi biết không ai trong số này là những lời khuyên hoàn hảo, nhưng có lẽ một trong số đó đủ tốt cho bạn :)


4
Lưu ý rằng mật khẩu đã nhập sẽ được lưu trữ trong lịch sử CMD nếu tệp lô được thực thi từ dấu nhắc lệnh. Không có phản đối mặc dù như bạn đã nói khá nhiều rằng cmd là công cụ sai cho công việc.
Mark K Cowan

Bạn có thể chạy doskey /reinstallđể xóa bộ đệm lệnh trước đó ngay sau đó cls, nếu lịch sử lệnh trong bảng điều khiển không quan trọng đối với bạn.
RuntimeException

1
nếu bạn không muốn sử dụng doskey / cài đặt lại và xóa lịch sử lệnh, một tùy chọn khác là chạy đoạn mã trên trong một cửa sổ đầu cuối riêng biệt và thoát nó ngay lập tức. Lưu ý rằng nó vẫn không thay thế Chuỗi đã nhập của bạn bằng dấu hoa thị. Giải pháp trên là một tùy chọn nếu bạn không muốn chạy powershell. C:\>start "console" cmd /c ireadconsole.bat
RuntimeException

9

Bạn có thể sử dụng chương trình con ReadFormattedLine cho tất cả các loại đầu vào được định dạng. Ví dụ: lệnh dưới đây đọc mật khẩu gồm 8 ký tự, hiển thị dấu hoa thị trên màn hình và tiếp tục tự động mà không cần nhấn Enter:

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

Chương trình con này được viết bằng Batch thuần túy nên nó không yêu cầu bất kỳ chương trình bổ sung nào và nó cho phép một số thao tác nhập định dạng, như chỉ đọc số, chuyển đổi chữ cái sang chữ hoa, v.v. Bạn có thể tải xuống chương trình con ReadFormattedLine từ Đọc một dòng với định dạng cụ thể .


EDIT 2018-08-18 : Phương pháp mới để nhập mật khẩu "ẩn"

Lệnh FINDSTR có một lỗi lạ xảy ra khi lệnh này được sử dụng để hiển thị các ký tự có màu VÀ đầu ra của lệnh như vậy được chuyển hướng đến thiết bị CON. Để biết chi tiết về cách sử dụng lệnh FINDSTR để hiển thị văn bản bằng màu, hãy xem chủ đề này .

Khi đầu ra của dạng lệnh FINDSTR này được chuyển hướng đến CON, một điều gì đó kỳ lạ xảy ra sau khi văn bản được xuất ra với màu mong muốn: tất cả văn bản sau khi nó được xuất ra dưới dạng ký tự "vô hình", mặc dù mô tả chính xác hơn là văn bản đó xuất ra dưới dạng văn bản màu đen trên nền đen. Văn bản gốc sẽ xuất hiện nếu bạn sử dụng lệnh COLOR để đặt lại màu nền trước và nền của toàn bộ màn hình. Tuy nhiên, khi văn bản ở trạng thái "ẩn", chúng ta có thể thực hiện lệnh SET / P, vì vậy tất cả các ký tự đã nhập sẽ không xuất hiện trên màn hình.

@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

một công cụ thay thế khác là công cụ dòng lệnh EditV32 (x86) hoặc EditV64 (x64) của tôi. Ví dụ:

editv32 -m -p "Password: " PWD

-m có nghĩa là "đầu vào được che" và -p là dấu nhắc. Đầu vào của người dùng được lưu trữ trong biến môi trường PWD. Bạn có thể lấy nó ở đây:

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


5
Đây không phải là giải pháp mã nguồn đóng duy nhất (Windows là mã nguồn đóng!). Tất nhiên, bạn được miễn phí khi không sử dụng nó ...
Bill_Stewart

Nếu việc thiếu mã nguồn làm phiền bạn, hãy xem câu trả lời khác của tôi về ReadLine.exe .
Bill_Stewart

Tốt! Giấy phép cho phép bạn sử dụng nó. Hơn nữa, dễ dàng tích hợp. Chỉ để xử lý mã thoát 1. Lỗi trên dòng lệnh, 2 dòng Input là trống, 3 biến Môi trường đã không được thay đổi, 4 chương trình bị hủy bỏ với Ctrl-C
James Jithin

Lưu ý: Các tiện ích editenv32 / editenv64 và readline đã được thay thế bằng tiện ích editenv mã nguồn mở .
Bill_Stewart

4

Nếu thiếu mã nguồn làm phiền bạn, tôi có một giải pháp thay thế khác.

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

Bạn có thể lấy nó từ https://westmesatech.com/?page_id=49 . Mã nguồn được bao gồm.


Lưu ý: Các tiện ích editenv32 / editenv64 và readline đã được thay thế bằng tiện ích editenv mã nguồn mở .
Bill_Stewart

3

Nếu bạn đã cài đặt Python, bạn có thể sử dụng:

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

đầu ra:

Enter the CVS password:
PASS: 123

2

Tôi đã sử dụng giải pháp trên của Blorgbeard, theo ý kiến ​​của tôi là thực sự tuyệt vời. Sau đó, tôi tăng cường nó như sau:

  1. Google cho pháp y
  2. Tải xuống tệp zip và tệp văn bản mẫu.
  3. Cài đặt (có nghĩa là sao chép 2 tệp vào system32)

Sử dụng nó như thế này:

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

Thao tác này sẽ chuyển bảng điều khiển sang màu xám trên màu xám cho mục nhập mật khẩu của bạn và chuyển trở lại khi bạn hoàn tất. ESC thực sự phải là một ký tự không in được, bạn có thể sao chép từ tệp văn bản mẫu đã tải xuống (xuất hiện giống như mũi tên bên trái trong Notepad) vào tệp lô của bạn. Bạn có thể sử dụng tệp văn bản mẫu để tìm mã cho tất cả các tổ hợp màu.

Nếu bạn không phải là quản trị viên của máy, bạn sẽ có thể cài đặt các tệp trong một thư mục không thuộc hệ thống, sau đó bạn phải nối thư mục vào PATH trong tập lệnh của mình trước khi gọi chương trình và sử dụng trình tự thoát. Đây thậm chí có thể là thư mục hiện tại, nếu bạn cần một gói phân phối không phải quản trị viên chỉ gồm một vài tệp.


Tôi không thể kiểm tra điều này, nhưng sẽ mong đợi mật khẩu đã nhập sẽ xuất hiện trong lịch sử cmd sau đó.
Mark K Cowan,

@MarkKCowan Đó chính xác là những gì sẽ xảy ra.
sjngm

1

tạo một tệp loạt gọi tệp cần thiết cho các ký tự ẩn sau đó tạo một lối tắt cho tệp lô đang được gọi.

kích chuột phải

tính chất

màu sắc

văn bản == đen

nền == đen

ứng dụng

đồng ý

hy vọng như vậy sẽ giúp bạn !!!!!!!!


cách tiếp cận tư duy đi ngang tốt đẹp, ngay cả khi không phải lúc nào cũng thực tế trong tình huống hàng loạt do phải thiết lập môi trường trước thời hạn. Oh treo trên, có lẽ điều này sẽ làm việc: stackoverflow.com/a/14447306/14420 hoặc có lẽ stackoverflow.com/questions/4339649/...
mờ Wilkie

1

CẬP NHẬT:
Tôi đã thêm hai phương thức mới thay vì sử dụng cls để ẩn đầu vào, chúng tạo một cửa sổ bật lên mới chỉ với một dòng.

Hạn chế là một phương pháp (phương pháp 2) để lại rác trong sổ đăng ký - "Nếu chạy mà không có quyền thích hợp" và phương pháp kia (phương pháp ba) thêm một số rác vào tập lệnh. Không cần phải nói rằng nó có thể dễ dàng được ghi vào bất kỳ tệp tmp nào và bị xóa. Tôi chỉ cố gắng đưa ra một giải pháp thay thế.

Giới hạn: Mật khẩu chỉ có thể là chữ và số - không có các ký tự khác!

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

Cập nhật: Tôi thấy bài đăng của sachadee là hoàn hảo và tôi vừa thêm câu hỏi "cửa sổ bật lên" của mình vào đó.

@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

Tôi đã viết một chương trình mã nguồn mở có tên editenvthay thế các tiện ích editv32/ cũ hơn của tôi editv64:

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

Các --maskinput( -m) tùy chọn [*] cho phép bạn ẩn (mask) đầu vào đánh máy và có một nhân vật có thể cấu hình (nhân vật mặc định là *); ví dụ:

editenv -m -p "Password: " PWD

Các --prompt( -p) tùy chọn cho phép bạn chỉ định một dấu nhắc đầu vào. Ở trên sẽ hiển thị Password:lời nhắc và chờ bạn nhập nội dung nào đó. Các ký tự đã nhập sẽ xuất hiện dưới dạng *. Nhấn Ctrl+C sẽ kết thúc chương trình với mã thoát là 1223.

Tải xuống ở đây:

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

[*] Lưu ý rằng tùy chọn --maskinput( -m) không an toàn - chuỗi đã nhập được nhập dưới dạng văn bản thuần túy trong môi trường. Tính năng này chỉ dành cho sự thuận tiện.



-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

Bạn không giải thích mã và bạn chỉ sao chép mã đó. Đây không phải là cách tốt để làm điều đó, vì bạn cần làm mới màn hình và mật khẩu phải dài x ký tự.
Anic17

-1

Một lựa chọn khác, cùng dòng với Blorgbeard , là sử dụng một cái gì đó như:

SET /P pw=C:\^>

Các ^thoát >để lời nhắc mật khẩu sẽ giống như một lời nhắc bảng điều khiển cmd tiêu chuẩn.


1
Câu hỏi không phải là làm thế nào để ẩn / ngụy trang lời nhắc mật khẩu mà là để ngăn mật khẩu hiển thị trong khi nhập. Vì vậy, điều này không (cố gắng) trả lời câu hỏi.
Stephan

Câu trả lời tôi đã liên kết cũng không (mà tại thời điểm viết bài có 13 phiếu ủng hộ). Câu trả lời của tôi chỉ là mở rộng về điều đó, vì đây có thể là một sự thay thế hữu ích cho một số người (vì Blogbeard đã ra mắt dành cho tôi). (Tôi sẽ thêm vào dưới dạng một nhận xét, nhưng trang web sẽ không cho phép tôi.)
nimbell

Đó không phải là một câu trả lời hay. Bạn không che dấu cũng như không ẩn mật khẩu. Hãy bình luận khi bạn có một giải pháp hoặc câu trả lời hay.
Anic17

-3

Tôi đã đọc tất cả các giải pháp bí mật trên mạng về cách che mật khẩu trong một tệp hàng loạt, những giải pháp từ việc sử dụng giải pháp hide.com và thậm chí cả những giải pháp làm cho văn bản và nền có cùng màu. Giải pháp hide.com hoạt động tốt, không an toàn lắm và không hoạt động trong Windows 64 bit. Vì vậy, dù sao, sử dụng 100% các tiện ích của Microsoft, vẫn có một cách!

Đầu tiên, hãy để tôi giải thích cách sử dụng của tôi. Tôi có khoảng 20 máy trạm tự động đăng nhập vào Windows. Họ có một phím tắt trên màn hình của họ - đến một ứng dụng lâm sàng. Máy bị khóa, họ không thể nhấp chuột phải, họ không thể làm gì khác ngoài việc truy cập vào một phím tắt trên màn hình của họ. Đôi khi, kỹ thuật viên cần khởi động một số ứng dụng gỡ lỗi, duyệt windows explorer và xem các tệp nhật ký mà không cần đăng xuất tài khoản người dùng autolog.

Vì vậy, đây là những gì tôi đã làm.

Làm theo cách bạn muốn, nhưng tôi đã đặt hai tệp hàng loạt của mình trên một mạng chia sẻ mà máy tính bị khóa có quyền truy cập.

Giải pháp của tôi sử dụng 1 thành phần chính của Windows - runas. Đặt một phím tắt trên các ứng dụng khách tới runas.bat mà bạn sắp tạo. FYI, trên các khách hàng của tôi, tôi đã đổi tên phím tắt cho mục đích xem tốt hơn và thay đổi biểu tượng.

Bạn sẽ cần tạo hai tệp hàng loạt.

Tôi đã đặt tên cho các tệp hàng loạt runas.batDebug Support.bat

runas.bat chứa đoạn mã sau:

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

Bạn có thể thêm bao nhiêu nếu "% un%" và nếu không "% un%" cho tất cả người dùng bạn muốn cấp quyền truy cập. @Ping là cách hợp lý của tôi để tạo bộ đếm giây.

Vì vậy, điều đó sẽ xử lý tập tin hàng loạt đầu tiên - khá đơn giản phải không?

Đây là mã cho 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

Tôi không phải là một lập trình viên và thực sự chỉ mới bắt đầu làm quen với kịch bản hàng loạt khoảng một năm trước, và vòng này về cách tôi phát hiện ra việc che mật khẩu trong một tệp hàng loạt khá tuyệt vời!

Tôi hy vọng được biết rằng ai đó không phải tôi có thể sử dụng nó!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.