Каким будет пакетный эквивалент Windows для ввода HTML type type = "password"? - PullRequest
10 голосов
/ 13 ноября 2008

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

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

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

Любой комментарий будет очень признателен, большое спасибо заранее!

Ответы [ 11 ]

5 голосов
/ 21 марта 2009

проверить это

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
4 голосов
/ 29 марта 2009

Благодаря разумному использованию другого инструмента, свободно доступного в 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's 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: device.

Оператор "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 приведены ниже, попробуйте:

Чтобы замаскировать пароль, скрипт использует COM-объект ScriptPW. 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.

2 голосов
/ 31 января 2015

1.Чистое пакетное решение , которое (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. Отправитель пароля, использующий всплывающее окно HTA , Это гибридный файл .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 . Усиление должно быть сохранено как .bat. В отличие от других решений, оно создаст / скомпилирует небольшой файл .exe, который будет вызван (если вы хотите, вы можете удалить его). Также требуется установленный .net framework, но это скорее не проблема:

@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);
1 голос
/ 03 февраля 2009

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

1 голос
/ 25 ноября 2008

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

read -s -p "Пароль:" ПАРОЛЬ

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

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

cmd /cyourbatchfile.bat $ ПАРОЛЬ

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

1 голос
/ 25 ноября 2008

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

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

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

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

0 голосов
/ 31 января 2015

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

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

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

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

ConSet.exe /PH "PWD=Password: "

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

0 голосов
/ 17 июля 2014

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

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

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

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

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

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

0 голосов
/ 23 июня 2014

Другой альтернативой является 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
0 голосов
/ 03 июня 2013

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

$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 - учетная запись для входа.

Тогда мы можем использовать его из пакетного скрипта так:

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, поэтому не требуется никаких дополнительных программ или сценариев. Недостатком является то, что вам нужно будет либо использовать пароль внутри вызова PowerShell (как в моем примере), либо сохранить его в переменной окружения, а затем использовать его из своего пакетного сценария. Я предпочитаю первый, потому что он более безопасный и простой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...