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.