До 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.