Вплоть до 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.