Каким будет пакетный эквивалент Windows для типа ввода HTML = "пароль"?

Мне нужно получить учетные данные от пользователей в Windows script, но классический подход "первый результат Google":

SET /P USR=Username: 
SET /P PWD=Password: 

меньше, чем удовлетворительно, поэтому мне было интересно, можно ли сказать "эквивалент" для ввода HTML = "пароль" ?

Любые комментарии были бы очень оценены, спасибо заблаговременно!

Ответ 1

ознакомьтесь с этим

http://www.netikka.net/tsneti/info/tscmd052.htm

@echo off & setlocal enableextensions
    :: Build a Visual Basic Script
    set vbs_=%temp%\tmp$$$.vbs
    set skip=
    findstr "'%skip%VBS" "%~f0" > "%vbs_%"
    ::
    :: Prompting without linefeed as in Item #15
    echo.|set /p="Password: "

    :: Run the script with Microsoft Windows Script Host Version 5.6
    for /f "tokens=* delims=" %%a in ('cscript //nologo "%vbs_%"') do set MyPass1=%%a

    ::
    ::echo.
    echo.|set /p="Retype  : "

    for /f "tokens=* delims=" %%a in ('cscript //nologo "%vbs_%"') do set MyPass2=%%a
    ::

    :: Clean up
    for %%f in ("%vbs_%") do if exist %%f del %%f
    ::
    :: Demonstrate the result
    echo.
    if "%MyPass1%"=="%MyPass2%" (
      echo The entered password was %MyPass1%
      ) else (
      echo No match)
    endlocal & goto :EOF
    '
    'The Visual Basic Script
    Set WshPass = WScript.CreateObject("ScriptPW.Password") 'VBS
    Password=WshPass.GetPassWord() 'VBS
    WScript.Echo PassWord 'VBS

Ответ 2

Разумным использованием другого инструмента, доступного в Windows, следующие два сценария выполняют требуемое задание.

Сначала GetPwd.cmd:

@echo off
:: GetPwd.cmd - Get password with no echo.
<nul: set /p passwd=Password: 
for /f "delims=" %%i in ('cscript /nologo GetPwd.vbs') do set passwd=%%i
echo.
:: This bit just to prove we have the password.
echo %passwd%

Затем GetPwd.vbs:

' GetPwd.vbs - Get password with no echo then echo it. '
Set oScriptPW = CreateObject("ScriptPW.Password")
strPassword = oScriptPW.GetPassword()
Wscript.StdOut.WriteLine strPassword

Пояснение:

GetPwd.vbs просто использует объект пароля для ввода пароля от пользователя, а затем распечатывает его до стандартного вывода (следующий параграф объяснит, почему это не отображается в терминале).

GetPwd.cmd немного сложнее (но обычно скрипты команд).

Команда "<nul: set /p passwd=Password: " просто выводит приглашение без конечного CR/LF - это подлый способ эмулировать bash "echo -n". Он устанавливает passwd в пустую строку как побочный эффект и не ждет ввода, поскольку он принимает свой вход с устройства nul:.

Оператор "for /f "delims=" %%i in ('cscript /nologo GetPwd.vbs') do set passwd=%%i" - самый сложный бит. Он запускает vbscript без рекламы Microsoft (/nologo), поэтому единственным выходным сигналом является пароль (из vbscript "Wscript.StdOut.WriteLine strPassword".

Установка разделителей на ничто не требуется для захвата входных строк пробелами, иначе вы просто получите первое слово. "for ... do set ..." устанавливает passwd как фактический вывод пароля из vbscript.

Затем мы повторяем пустую строку (фактически завершаем строку "Password: ") и эхо-пароль, чтобы вы могли проверить, работает ли она:

C:\Pax> GetPwd
Password:
this is my password

C:\Pax> 

Сценарий scriptpw.dll доступен с XP и 2K3, но не обязательно с более поздними версиями.

Инструкции для Vista и предположительно Win7 приведены ниже, попробуйте:

Чтобы скрыть пароль, script использует объект ScriptPW COM. ScriptPW загружается по умолчанию в Windows XP и Windows 2003. Если вы используете Windows 2000 или Windows Vista, вам необходимо скопировать файл scriptpw.dll из папки Windows\System32 системы XP или системы Windows 2003 в Winnt\System32 или Windows\System32 в вашей системе Windows 2000 или Vista. Как только DLL будет скопирована, вам необходимо зарегистрировать его, выполнив команду:

regsvr32 scriptpw.dll

Чтобы успешно зарегистрировать DLL на компьютере Vista, вам нужно будет открыть командную строку как администратор. Для этого нажмите "Пуск" | Все программы | Аксессуары. Затем щелкните правой кнопкой мыши ярлык командной строки и выберите "Запуск от имени администратора". После того, как в командной строке в качестве администратора вы сможете успешно запустить команду regsvr32 scriptpw.dll, чтобы зарегистрировать DLL.

Ответ 3

пакетное решение 1.Pure, которое (ab) использует команду XCOPY, и ее переключатели /P /L найдены здесь:

:: Hidden.cmd
::Tom Lavedas, 02/05/2013, 02/20/2013
::Carlos, 02/22/2013
::https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/f7mb_f99lYI


@Echo Off
:HInput
SetLocal EnableExtensions EnableDelayedExpansion
Set "FILE=%Temp%.\T"
Set "FILE=.\T"
Keys List >"%File%"
Set /P "=Hidden text ending with Ctrl-C?: " <Nul
Echo.
Set "HInput="
:HInput_
For /F "tokens=1* delims=?" %%A In (
 '"Xcopy /P /L "%FILE%" "%FILE%" 2>Nul"'
) Do (
  Set "Text=%%B"
  If Defined Text (
    Set "Char=!Text:~1,1!"
    Set "Intro=1"
    For /F delims^=^ eol^= %%Z in ("!Char!") Do Set "Intro=0"
    Rem If press Intro
    If 1 Equ !Intro! Goto :HInput#
    Set "HInput=!HInput!!Char!"
  )
)
Goto :HInput_
:HInput#
Echo(!HInput!
Goto :Eof 

2.Password submitter, использующий всплывающее окно HTA , Это файл hybrit.bat/jscript/mshta и должен быть сохранен как .bat:

<!-- :
:: PasswordSubmitter.bat
@echo off
for /f "tokens=* delims=" %%p in ('mshta.exe "%~f0"') do (
    set "pass=%%p"
)

echo your password is %pass%
exit /b
-->

<html>
<head><title>Password submitter</title></head>
<body>

    <script language='javascript' >
        function pipePass() {
            var pass=document.getElementById('pass').value;
            var fso= new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1);
            close(fso.Write(pass));

        }
    </script>

    <input type='password' name='pass' size='15'></input>
    <hr>
    <button onclick='pipePass()'>Submit</button>

</body>
</html>

3. Самокомпилированный гибрид .net.Again следует сохранить как .bat. В разнице с другими решениями он создаст/скомпилирует небольшой .exe файл, который будет вызываться (если вы хотите удалить его). Также требуется установленная .NET-инфраструктура, но это не проблема:

@if (@X)==(@Y) @end /* JScript comment
@echo off
setlocal

for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\*jsc.exe"') do (
   set "jsc=%%v"
)

if not exist "%~n0.exe" (
    "%jsc%" /nologo /out:"%~n0.exe" "%~dpsfnx0"
)

for /f "tokens=* delims=" %%p in ('"%~n0.exe"') do (
    set "pass=%%p"
)

echo your password is %pass%

endlocal & exit /b %errorlevel%

*/



import System;



var pwd = "";
var key;

Console.Error.Write("Enter password: ");

        do {
           key = Console.ReadKey(true);
           if ( (key.KeyChar.ToString().charCodeAt(0)) >= 20 && (key.KeyChar.ToString().charCodeAt(0) <= 126) ) {
              pwd=pwd+(key.KeyChar.ToString());
              Console.Error.Write("*");
           }   

        } while (key.Key != ConsoleKey.Enter);
        Console.Error.WriteLine();
        Console.WriteLine(pwd);

Ответ 4

Я предполагаю, что вы не хотите эха пароля на экране.

Если всплывающее окно подходит для вас, вы можете использовать, например, VBScript, чтобы показать окно IE, отображающее поле пароля. Здесь пример.

В качестве альтернативы вы можете вызвать ваш script из файла HTA (HTML Application) (см. Введение в HTML-приложения (HTAs).

С уважением, диво

Ответ 5

Если вы можете установить Cygwin, вы получите оболочку bash по умолчанию, так что эта команда будет работать:

read -s -p "Пароль:" PASSWORD

Теперь проблема только в том, что значение PASSWORD установлено только в оболочке bash, а не как переменная среды, которую может видеть командный файл (не используйте PWD, поскольку это означает что-то еще в cygwin). Таким образом, вам придется переписать script как оболочку bash script (возможно, не слишком сложно с учетом ограничений командной строки!).

Или вы можете передать пароль в пакетный script из cygwin, но это означает запуск нового экземпляра командной строки:

cmd/cyourbatchfile.bat $PASSWORD

Все немного запутанно и вовсе не удовлетворяет;)

Ответ 6

Мы делаем все так же, как все это время, но вводим пароль в командной строке и передаем его переменной в пакетном файле.

Ответ 7

Другая альтернатива - это инструменты командной строки EditV32 (x86) или EditV64 (x64). Например:

editv32 -m -p "Password: " PWD

-m означает "замаскированный вход" и -p - это приглашение. Пользовательский ввод сохраняется в переменной среды PWD. Вы можете получить его здесь:

http://www.westmesatech.com/editv.html

Ответ 8

Другой подход - вызвать команды PowerShell из вашего Batch script. Вот пример, который настраивает учетную запись для входа в службу:

$password = Read-Host "Enter password" -AsSecureString;
$decodedpassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($password));
& "sc.exe" config THE_SERVICE_NAME obj= THE_ACCOUNT password= $decodedPassword;

где THE_SERVICE_NAME - это имя службы для настройки, а THE_ACCOUNT - учетная запись входа.

Затем мы можем использовать его из пакета script следующим образом:

call powershell -Command "$password = Read-Host "Enter password" -AsSecureString; $decodedpassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)); & "sc.exe" config THE_SERVICE_NAME obj= THE_ACCOUNT password= $decodedPassword;"

который просто вызывает PowerShell.exe и передает три команды.

Преимущество такого подхода заключается в том, что большинство установок Windows сегодня включают PowerShell, поэтому дополнительная программа или script не нужны. Недостатком является то, что вам нужно будет использовать пароль внутри вызова PowerShell (например, в моем примере) или сохранить его в переменной среды, а затем использовать его из вашей партии script. Я предпочитаю первый, потому что он более безопасен и проще.

Ответ 9

Другой альтернативой является ReadLine.exe. Пример:

@echo off
setlocal enableextensions
set PASSWORD=
for /f "delims=" %%p in ('readline -h -p "Enter password: "') do set PASSWORD=%%p
echo You entered: %PASSWORD%
endlocal

Ответ 10

Вы можете использовать подпрограмму ReadFormattedLine для всех видов форматированного ввода. Например, приведенные ниже команды читают имя пользователя и пароль по 8 символов, отображают звездочки на экране и продолжают автоматически, без необходимости нажимать Enter:

call :ReadFormattedLine USR="********" /M "Username: "
call :ReadFormattedLine PWD="********" /M "Password: "

Или по-другому:

call :ReadFormattedLine nameAndPass="******** / ********" /M "Enter Username / Password: "

В предыдущем примере, когда пользователь выполнил имя пользователя, подпрограмма отобразит косую черту и прочитает пароль; если пользователь удаляет символы, косая черта также автоматически удаляется.

Эта подпрограмма написана в чистой папке, поэтому она не требует дополнительной программы и допускает несколько форматированных операций ввода, таких как чтение только чисел, преобразование букв в верхний регистр и т.д. Вы можете загрузить подпрограмму ReadFormattedLine из Прочитать строку с определенным форматом.

Ответ 11

ConSet - бесплатный инструмент, написанный Фрэнком П. Уэстлейком. Это расширенная версия стандартной команды Windows set.

ConSet.exe - отображает, устанавливает или удаляет переменные среды cmd.exe, изменяет параметры консоли и выполняет математику с плавающей запятой.

Поскольку это не стандартное консольное приложение Windows, для использования этого инструмента требуется либо распространение этого инструмента вместе с пакетным файлом, либо инструмент хранится на общем ресурсе сервера, а пакетный файл вызывает этот инструмент непосредственно с сервера доля.

ConSet позволяет легко ввести строку пароля со скрытым вводом, назначенным переменной среды:

ConSet.exe /PH "PWD=Password: "

Дополнительный параметр H приводит к скрытию пользовательского ввода.