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