До XP та Server 2003 ви можете використовувати інший доданий інструмент (VBScript) - наступні два сценарії виконують потрібну роботу.
По-перше getpwd.cmd
,:
@echo off
<nul: set /p passwd=Password:
for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i
echo.
Потім getpwd.vbs
:
Set oScriptPW = CreateObject("ScriptPW.Password")
strPassword = oScriptPW.GetPassword()
Wscript.StdOut.WriteLine strPassword
getpwd.vbs
Просто використовує об'єкт пароля для введення пароля від користувача , а потім роздрукувати його на стандартний висновок (в наступному параграфі буде пояснити , чому не з'являється в терміналі).
getpwd.cmd
Сценарій команди трохи складніше , але він в основному працює наступним чином .
Ефект "<nul: set /p passwd=Password: "
команди полягає у виведенні підказки без відключення символу нового рядка - це підлий спосіб емуляції "echo -n"
команди з bash
оболонки. Він встановлює passwd
порожню рядок як нерелевантний побічний ефект і не чекає введення, оскільки приймає свій вхід з nul:
пристрою.
"for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i"
Затвердження хитра біт. Він запускає VBScript без «реклами» Майкрософт, так що єдиний вихідний рядок - це пароль (з VBscript "Wscript.StdOut.WriteLine strPassword"
.
Якщо встановити роздільники нічого не потрібно, щоб захопити весь рядок вводу з пробілами, інакше ви просто отримаєте перше слово. У "for ... do set ..."
бітових наборах passwd
бути фактичним вихідним пароль від VBScript.
Тоді ми повторюємо порожній рядок (для припинення "Password: "
рядка), і пароль буде в passwd
змінній оточення після запуску коду.
Зараз, як було сказано, scriptpw.dll
доступний лише до XP / 2003. Щоб виправити це, ви можете просто скопіювати scriptpw.dll
файл із Windows\System32
папки системи XP / 2003 у Winnt\System32
або Windows\System32
папку у власній системі. Після того, як DLL буде скопійовано, вам потрібно буде зареєструвати його, запустивши:
regsvr32 scriptpw.dll
Щоб успішно зареєструвати DLL у Vista та пізніших версіях, вам знадобляться права адміністратора. Я не досліджував законність такого кроку, так печерний лектор.
Якщо ви не надто прагнете відслідковувати та реєструвати старі файли DLL (для зручності чи з юридичних причин), є інший спосіб. Більш пізні версії Windows (ті, у яких немає необхідної DLL) повинні мати вам Powershell.
І насправді вам слід подумати над оновленням своїх сценаріїв, щоб повною мірою ними користуватися, оскільки це набагато більш здатна мова сценаріїв, ніж cmd.exe
. Однак якщо ви хочете зберегти основну частину коду як cmd.exe
сценарії (наприклад, якщо у вас багато коду, який ви не хочете конвертувати), ви можете скористатися тим самим фокусом.
По-перше, змініть cmd
сценарій, щоб він викликав Powershell, а не CScript:
@echo off
for /f "delims=" %%i in ('powershell -file getpwd.ps1') do set passwd=%%i
Сценарій Powershell однаково простий:
$password = Read-Host "Enter password" -AsSecureString
$password = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)
$password = [Runtime.InteropServices.Marshal]::PtrToStringAuto($password)
echo $password
хоча з деяким маршалом, щоб отримати фактичний текст пароля.
Пам’ятайте, що для запуску локальних непідписаних сценаріїв Powershell на вашій машині вам може знадобитися змінити політику виконання з (драконівського, хоча і дуже безпечного) за замовчуванням, таким чином:
set-executionpolicy remotesigned
зсередини самого Powershell.