До 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 без «рекламы» Microsoft, поэтому единственной строкой вывода является пароль (из 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.