Могу ли я замаскировать вводимый текст в bat-файле

StackOverflow https://stackoverflow.com/questions/664957

  •  21-08-2019
  •  | 
  •  

Вопрос

Я пишу пакетный файл для выполнения некоторых других программ.В этом случае мне нужно запросить пароль.Есть ли у меня какой-нибудь способ замаскировать вводимый текст?Мне не нужно печатать символы ******* вместо входных символов.Поведения запроса пароля Linux (ничего не выводить во время ввода) достаточно.

@echo off
SET /P variable=Password : 
echo %variable%
Pause

Это позволит прочитать входные данные, но я не могу замаскировать текст, используя этот подход.

Это было полезно?

Решение

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

В 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".

Установка разделителей в значение nothing не требуется для захвата всей строки ввода пробелами, в противном случае вы получите просто первое слово.В "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.

Другие советы

Да, я опоздал на 4 года.

Но я нашел способ сделать это в одной строке без необходимости создавать внешний скрипт;вызывая команды powershell из пакетного файла.

Благодаря TessellatingHeckler - без вывода в текстовый файл (я задаю команду powershell в переменной, потому что это довольно запутанно в одной длинной строке внутри цикла for).

@echo off
set "psCommand=powershell -Command "$pword = read-host 'Enter Password' -AsSecureString ; ^
    $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^
        [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""
for /f "usebackq delims=" %%p in (`%psCommand%`) do set password=%%p
echo %password%

Первоначально я написал его для вывода в текстовый файл, затем прочитал из этого текстового файла.Но описанный выше метод лучше.В одной чрезвычайно длинной, почти непонятной строке:

@echo off
powershell -Command $pword = read-host "Enter password" -AsSecureString ; $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword) ; [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR) > .tmp.txt & set /p password=<.tmp.txt & del .tmp.txt
echo %password%

Я разберу это - вы можете разбить это на несколько строк, используя каретку ^, что намного приятнее...

@echo off
powershell -Command $pword = read-host "Enter password" -AsSecureString ; ^
    $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword) ; ^
        [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR) > .tmp.txt 
set /p password=<.tmp.txt & del .tmp.txt
echo %password%

Эта статья объясняет, что делают команды powershell;по сути, он получает входные данные с помощью Read-Host -AsSecureString - следующие две строки преобразуют эту защищенную строку обратно в обычный текст, выходные данные (текстовый пароль) затем отправляются в текстовый файл с помощью >.tmp.txt.Затем этот файл считывается в переменную и удаляется.

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 

1.2 Другой способ, основанный на команде replace

@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion

Set /P "=Enter a Password:" < Nul
Call :PasswordInput
Echo(Your input was:!Line!

Goto :Eof

:PasswordInput
::Author: Carlos Montiers Aguilera
::Last updated: 20150401. Created: 20150401.
::Set in variable Line a input password
For /F skip^=1^ delims^=^ eol^= %%# in (
'"Echo(|Replace.exe "%~f0" . /U /W"') Do Set "CR=%%#"
For /F %%# In (
'"Prompt $H &For %%_ In (_) Do Rem"') Do Set "BS=%%#"
Set "Line="
:_PasswordInput_Kbd
Set "CHR=" & For /F skip^=1^ delims^=^ eol^= %%# in (
'Replace.exe "%~f0" . /U /W') Do Set "CHR=%%#"
If !CHR!==!CR! Echo(&Goto :Eof
If !CHR!==!BS! (If Defined Line (Set /P "=!BS! !BS!" <Nul
Set "Line=!Line:~0,-1!"
)
) Else (Set /P "=*" <Nul
If !CHR!==! (Set "Line=!Line!^!"
) Else Set "Line=!Line!!CHR!"
)
Goto :_PasswordInput_Kbd

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

<!-- :
:: 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' >
        window.resizeTo(300,150);
        function entperPressed(e){
                if (e.keyCode == 13) {
                    pipePass();
                }
        }
        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' onkeypress="return entperPressed(event)" ></input>
    <hr>
    <button onclick='pipePass()'>Submit</button>

</body>
</html>

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

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

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("*");
           }

           if ( key.Key == ConsoleKey.Backspace && pwd.Length > 0 ) {
               pwd=pwd.Remove(pwd.Length-1);
               Console.Error.Write("\b \b");
           }


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

Я бы, наверное, просто сделал:

..
echo Before you enter your password, make sure no-one is looking!
set /P password=Password:  
cls
echo Thanks, got that.
.. 

Таким образом, вы получаете приглашение, затем экран очищается после его ввода.

Обратите внимание, что введенный пароль будет сохранен в истории CMD, если пакетный файл будет выполнен из командной строки (спасибо @Марк К. Коуэн).

Если бы этого было недостаточно, я бы либо переключился на python, либо написал исполняемый файл вместо скрипта.

Я знаю, что ни один из этих супов не идеален, но, возможно, для вас достаточно одного :)

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

editv32 -m -p "Password: " PWD

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

https://westmesatech.com/?page_id=19

Если вас беспокоит отсутствие исходного кода, у меня есть другая альтернатива.

@echo off
for /f "delims=" %%p in ('ReadLine -h -p "Enter password: "') do set PWD=%%p
echo You entered: %PWD%

Вы можете получить это от https://westmesatech.com/?page_id=49.Исходный код прилагается.

Если у вас установлен Python, вы можете использовать:

for /f "delims=" %%A in ('python -c "import getpass; print(getpass.getpass('Enter the CVS password: '));"') do @set CVSPASS=%%A
echo PASS: %CVSPASS%

результат:

Enter the CVS password:
PASS: 123

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

call :ReadFormattedLine password="********" /M "Enter password (8 chars): "

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


РЕДАКТИРОВАТЬ 2018-08-18: Новый способ ввода "невидимого" пароля

Команда FINDSTR имеет странную ошибку, которая возникает, когда эта команда используется для отображения символов в цвете, И вывод такой команды перенаправляется на устройство CON.Подробнее о том, как использовать команду FINDSTR для отображения текста в цвете, см. эта тема.

Когда вывод этой формы команды FINDSTR перенаправляется в CON, что-то странное происходит после того, как текст выводится в желаемом цвете:весь текст после него выводится в виде "невидимых" символов, хотя более точное описание заключается в том, что текст выводится в виде черного текста на черном фоне.Исходный текст появится, если вы используете команду COLOR для сброса цветов переднего плана и фона всего экрана.Однако, когда текст "невидим", мы могли бы выполнить команду SET / P, поэтому все введенные символы не будут отображаться на экране.

@echo off
setlocal

set /P "=_" < NUL > "Enter password"
findstr /A:1E /V "^$" "Enter password" NUL > CON
del "Enter password"
set /P "password="
cls
color 07
echo The password read is: "%password%"

Я использовал приведенное выше решение Blorgbeard, которое, на мой взгляд, действительно здорово.Затем я улучшил его следующим образом:

  1. Погуглите для ансикон
  2. Загрузите zip-файл и образец текстового файла.
  3. Установить (это означает скопировать 2 файла в system32)

Используйте это следующим образом:

@echo off
ansicon -p
set /p pwd=Password:ESC[0;37;47m
echo ESC[0m

При этом консоль переключается в серый цвет на серый для ввода вашего пароля и переключается обратно, когда вы закончите.ESC на самом деле должен быть непечатаемым символом, который вы можете скопировать из загруженного образца текстового файла (отображается в виде стрелки влево в Блокноте) в свой пакетный файл.Вы можете использовать образец текстового файла, чтобы найти коды для всех цветовых комбинаций.

Если вы не являетесь администратором компьютера, вы, вероятно, сможете установить файлы во внесистемный каталог, тогда вам придется добавить каталог к ПУТИ в вашем скрипте перед вызовом программы и использованием escape-последовательностей.Вероятно, это может быть даже текущий каталог, если вам нужен распространяемый без участия администратора пакет всего из нескольких файлов.

создайте пакетный файл, который вызывает тот, который необходим для невидимых символов, затем создайте ярлык для вызываемого пакетного файла.

щелкните правой кнопкой мыши

свойства

Цвет

текст==черный

фон == черный

применять

ОК

надеюсь, это поможет вам!!!!!!!!

Обновить:
Я добавил два новых метода, которые вместо использования cls для скрытия входных данных создают новое всплывающее окно только с одной строкой.

Недостатки заключаются в том, что один метод (метод 2) оставляет мусор в реестре - "При запуске без надлежащих прав", а другой (метод три) добавляет некоторый мусор в скрипт.Излишне говорить, что его можно легко записать в любой tmp-файл и удалить, я просто попытался придумать альтернативу.

Ограничение: Пароль может быть только буквенно-цифровым - никаких других символов!

@echo off
if "%1"=="method%choice%" goto :method%choice%
::::::::::::::::::
::Your code here::
::::::::::::::::::
cls
echo :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
echo ::::                   Batch script to prompt for password!                 :::
echo :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:choice
echo.
echo 1. First method
echo.
echo 2. Second method
echo.
echo 3. Third method
echo.
set/p choice=Choose a method: 
if "%choice%" gtr "3" echo. & echo invalid option & echo. & pause & goto choice

call :vars
    set options= %num%%smAlph%%cpAlph%
    set pwdLen=6

if "%choice%" == "1" (
    set /p=Password: <nul 
    for /l %%i in (1,1,%pwdLen%) do call :password
) else (
    start /wait cmd /c call "%~f0" method%choice%
    )

call :result%choice%


::just to see if it worked!
echo.
echo The Password you entered is: "%pwd%"&pause>nul

::::::::::::::::::
::More code here::
::::::::::::::::::
exit /b





:vars
set num=1234567890
set smAlph=abcdefghijklmnopqrstuvwxyz
set cpAlph=ABCDEFGHIJKLMNOPQRSTUVWXYZ
    set pwd=
goto :EOF


:method2
call :popUp
setx result %pwd% >nul
goto :EOF

:method3
call :popUp
    >> "%~f0" echo.
    >> "%~f0" echo :result%choice%
    >> "%~f0" echo set pwd=%pwd%
goto :EOF

:popUp
title Password
mode con lines=1 cols=30
color 5a
set /p=Password: <nul
for /l %%i in (1,1,%pwdLen%) do call :password
goto :EOF

:password
:: If you don't want case sensative remove "/cs" but remember to remove %cpAlph% from the %options%
choice /c %options% /n /cs >nul
    call SET pwd=%pwd%%%options:~%errorlevel%,1%%
    set /p =*<nul
GOTO :EOF


:result2
for /f "tokens=3" %%a in ('reg query hkcu\environment /v result') do set pwd=%%a
    setx result "" >nul
    reg delete hkcu\environment /v result /f >nul 2>&1
:result1
goto :EOF   
::You can delete from here whenever you want.

Обновить: Я нашел пост сачади должен быть идеальным и я просто добавил к этому свою "всплывающую" особенность.

@Echo Off  
  SetLocal EnableDelayedExpansion
  if "%1"==":HInput" goto :HInput
  set r=r%random%
  start /wait cmd /c call "%~f0" :HInput

For /f "tokens=2,13 delims=, " %%a in (
    'tasklist /v /fo csv /fi "imagename eq cmd.exe"
    ^|findstr /v "Windows\\system32\\cmd.exe"
    ^|findstr "set /p=%r%"'
     ) do (
        set pid=%%a
        set Line=%%b
        set Line=!Line:%r%=!
        set Line=!Line:~,-2!
        )       
taskkill /pid %pid:"=%>nul
  goto :HIEnd


  :HInput
  SetLocal DisableDelayedExpansion
  title Password
  mode con lines=2 cols=30

Echo Enter your Code :
   Set "Line="
   For /F %%# In (
   '"Prompt;$H&For %%# in (1) Do Rem"'
   ) Do Set "BS=%%#"

  :HILoop
   Set "Key="
   For /F "delims=" %%# In (
   'Xcopy /W "%~f0" "%~f0" 2^>Nul'
   ) Do If Not Defined Key Set "Key=%%#"
   Set "Key=%Key:~-1%"
   SetLocal EnableDelayedExpansion
   If Not Defined Key start /min cmd /k mode con lines=1 cols=14 ^&set/p %r%!Line!=&exit
  If %BS%==^%Key% (Set /P "=%BS% %BS%" <Nul
   Set "Key="
   If Defined Line Set "Line=!Line:~0,-1!"
   ) Else Set /P "=*" <Nul
   If Not Defined Line (EndLocal &Set "Line=%Key%"
   ) Else For /F delims^=^ eol^= %%# In (
   "!Line!") Do EndLocal &Set "Line=%%#%Key%"
  Goto :HILoop

  :HIEnd
   Echo(
Echo Your code is :  "!Line!"
   Pause
   Goto :Eof

Возможно, это более старая тема, но если вы используете Windows Vista или 7, у меня есть решение, которое будет работать очень хорошо.Я снял это на видео здесь: http://www.youtube.com/watch?v=mk8uAa6PIFM

Вставка для пакетного файла находится здесь

@echo off
color 0f
MODE CON COLS=132 LINES=50
:start
cls
choice /C ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!?.# /N /CS /M Please enter your password to continue. (Valid characters include all letters, numbers, and ! ? .) Press # to submit: 
SET ecode=%ERRORLEVEL%
IF %ecode% EQU 66 goto submit
IF %ecode% EQU 1 SET out=A
IF %ecode% EQU 2 SET out=B
IF %ecode% EQU 3 SET out=C
IF %ecode% EQU 4 SET out=D
IF %ecode% EQU 5 SET out=E
IF %ecode% EQU 6 SET out=F
IF %ecode% EQU 7 SET out=G
IF %ecode% EQU 8 SET out=H
IF %ecode% EQU 9 SET out=I
IF %ecode% EQU 10 SET out=J
IF %ecode% EQU 11 SET out=K
IF %ecode% EQU 12 SET out=L
IF %ecode% EQU 13 SET out=M
IF %ecode% EQU 14 SET out=N
IF %ecode% EQU 15 SET out=O
IF %ecode% EQU 16 SET out=P
IF %ecode% EQU 17 SET out=Q
IF %ecode% EQU 18 SET out=R
IF %ecode% EQU 19 SET out=S
IF %ecode% EQU 20 SET out=T
IF %ecode% EQU 21 SET out=U
IF %ecode% EQU 22 SET out=V
IF %ecode% EQU 23 SET out=W
IF %ecode% EQU 24 SET out=X
IF %ecode% EQU 25 SET out=Y
IF %ecode% EQU 26 SET out=Z
IF %ecode% EQU 27 SET out=a
IF %ecode% EQU 28 SET out=b
IF %ecode% EQU 29 SET out=c
IF %ecode% EQU 30 SET out=d
IF %ecode% EQU 31 SET out=e
IF %ecode% EQU 32 SET out=f
IF %ecode% EQU 33 SET out=g
IF %ecode% EQU 34 SET out=h
IF %ecode% EQU 35 SET out=i
IF %ecode% EQU 36 SET out=j
IF %ecode% EQU 37 SET out=k
IF %ecode% EQU 38 SET out=l
IF %ecode% EQU 39 SET out=m
IF %ecode% EQU 40 SET out=n
IF %ecode% EQU 41 SET out=o
IF %ecode% EQU 42 SET out=p
IF %ecode% EQU 43 SET out=q
IF %ecode% EQU 44 SET out=r
IF %ecode% EQU 45 SET out=s
IF %ecode% EQU 46 SET out=t
IF %ecode% EQU 47 SET out=u
IF %ecode% EQU 48 SET out=v
IF %ecode% EQU 49 SET out=w
IF %ecode% EQU 50 SET out=x
IF %ecode% EQU 51 SET out=y
IF %ecode% EQU 52 SET out=z
IF %ecode% EQU 53 SET out=0
IF %ecode% EQU 54 SET out=1
IF %ecode% EQU 55 SET out=2
IF %ecode% EQU 56 SET out=3
IF %ecode% EQU 57 SET out=4
IF %ecode% EQU 58 SET out=5
IF %ecode% EQU 59 SET out=6
IF %ecode% EQU 60 SET out=7
IF %ecode% EQU 61 SET out=8
IF %ecode% EQU 62 SET out=9
IF %ecode% EQU 63 SET out=!
IF %ecode% EQU 64 SET out=?
IF %ecode% EQU 65 SET out=.
SET code=%out%
SET show=*
:loop
cls
choice /C ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!?.# /N /CS /M Please enter your password to continue. (Valid characters include all letters, numbers, and ! ? .) Press # to submit: %code%
SET ecode=%ERRORLEVEL%
IF %ecode% EQU 66 goto submit
IF %ecode% EQU 1 SET out=A
IF %ecode% EQU 2 SET out=B
IF %ecode% EQU 3 SET out=C
IF %ecode% EQU 4 SET out=D
IF %ecode% EQU 5 SET out=E
IF %ecode% EQU 6 SET out=F
IF %ecode% EQU 7 SET out=G
IF %ecode% EQU 8 SET out=H
IF %ecode% EQU 9 SET out=I
IF %ecode% EQU 10 SET out=J
IF %ecode% EQU 11 SET out=K
IF %ecode% EQU 12 SET out=L
IF %ecode% EQU 13 SET out=M
IF %ecode% EQU 14 SET out=N
IF %ecode% EQU 15 SET out=O
IF %ecode% EQU 16 SET out=P
IF %ecode% EQU 17 SET out=Q
IF %ecode% EQU 18 SET out=R
IF %ecode% EQU 19 SET out=S
IF %ecode% EQU 20 SET out=T
IF %ecode% EQU 21 SET out=U
IF %ecode% EQU 22 SET out=V
IF %ecode% EQU 23 SET out=W
IF %ecode% EQU 24 SET out=X
IF %ecode% EQU 25 SET out=Y
IF %ecode% EQU 26 SET out=Z
IF %ecode% EQU 27 SET out=a
IF %ecode% EQU 28 SET out=b
IF %ecode% EQU 29 SET out=c
IF %ecode% EQU 30 SET out=d
IF %ecode% EQU 31 SET out=e
IF %ecode% EQU 32 SET out=f
IF %ecode% EQU 33 SET out=g
IF %ecode% EQU 34 SET out=h
IF %ecode% EQU 35 SET out=i
IF %ecode% EQU 36 SET out=j
IF %ecode% EQU 37 SET out=k
IF %ecode% EQU 38 SET out=l
IF %ecode% EQU 39 SET out=m
IF %ecode% EQU 40 SET out=n
IF %ecode% EQU 41 SET out=o
IF %ecode% EQU 42 SET out=p
IF %ecode% EQU 43 SET out=q
IF %ecode% EQU 44 SET out=r
IF %ecode% EQU 45 SET out=s
IF %ecode% EQU 46 SET out=t
IF %ecode% EQU 47 SET out=u
IF %ecode% EQU 48 SET out=v
IF %ecode% EQU 49 SET out=w
IF %ecode% EQU 50 SET out=x
IF %ecode% EQU 51 SET out=y
IF %ecode% EQU 52 SET out=z
IF %ecode% EQU 53 SET out=0
IF %ecode% EQU 54 SET out=1
IF %ecode% EQU 55 SET out=2
IF %ecode% EQU 56 SET out=3
IF %ecode% EQU 57 SET out=4
IF %ecode% EQU 58 SET out=5
IF %ecode% EQU 59 SET out=6
IF %ecode% EQU 60 SET out=7
IF %ecode% EQU 61 SET out=8
IF %ecode% EQU 62 SET out=9
IF %ecode% EQU 63 SET out=!
IF %ecode% EQU 64 SET out=?
IF %ecode% EQU 65 SET out=.
SET code=%code%%out%
SET show=%show%*
goto loop
:submit
cls
SET password=%code%
IF %password% EQU 0cZrocks! SET result=1
IF ELSE SET result=2
IF %result% EQU 1 echo password correct
IF %result% EQU 2 echo password incorrect
timeout /T 2 /NOBREAK >nul
cls
IF %result% EQU 1 goto end
IF ELSE goto start
:end

Я прочитал все неуклюжие решения в сети о том, как замаскировать пароли в пакетном файле, те, которые были получены с помощью hide.com решения и даже те, которые делают текст и фон одного цвета.Решение hide.com работает прилично, оно не очень безопасно и не работает в 64-разрядной версии Windows.Так что в любом случае, используя 100% утилиты Microsoft, есть способ!

Во-первых, позвольте мне объяснить мое использование.У меня есть около 20 рабочих станций, которые автоматически входят в Windows.У них есть один ярлык на рабочем столе - для клинического приложения.Машины заблокированы, они не могут щелкнуть правой кнопкой мыши, они не могут ничего сделать, кроме доступа к единственному ярлыку на своем рабочем столе.Иногда техническому специалисту необходимо запустить некоторые приложения для отладки, просмотреть проводник Windows и файлы журналов, не отключая учетную запись пользователя autolog.

Итак, вот что я сделал.

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

Мое решение использует 1 основной компонент Windows - runas.Установите на клиентах ярлык для рун.bat, который вы собираетесь создать.К вашему сведению, на своих клиентах я переименовал ярлык для лучшего просмотра и изменил значок.

Вам нужно будет создать два пакетных файла.

Я назвал пакетные файлы руны.летучая мышь и Поддержка отладки.bat

runas.bat содержит следующий код:

cls
@echo off
TITLE CHECK CREDENTIALS 
goto menu

:menu
cls
echo.
echo           ....................................
echo            ~Written by Cajun Wonder 4/1/2010~
echo           ....................................
echo.
@set /p un=What is your domain username? 
if "%un%"=="PUT-YOUR-DOMAIN-USERNAME-HERE" goto debugsupport
if not "%un%"=="PUT-YOUR-DOMAIN-USERNAME-HERE" goto noaccess
echo.
:debugsupport
"%SYSTEMROOT%\system32\runas" /netonly /user:PUT-YOUR-DOMAIN-NAME-HERE\%un% "\\PUT-YOUR-NETWORK-SHARE-PATH-HERE\Debug Support.bat"
@echo ACCESS GRANTED! LAUNCHING THE DEBUG UTILITIES....
@ping -n 4 127.0.0.1 > NUL
goto quit
:noaccess
cls
@echo.
@echo.
@echo.
@echo.
@echo   \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
@echo   \\                                   \\
@echo   \\    Insufficient privileges         \\  
@echo   \\                                    \\
@echo   \\      Call Cajun Wonder             \\
@echo   \\                                    \\
@echo   \\              At                    \\
@echo   \\                                    \\
@echo   \\        555-555-5555                \\
@echo   \\                                    \\
@echo   \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
@ping -n 4 127.0.0.1 > NUL
goto quit
@pause
:quit
@exit

Вы можете добавить столько, сколько если "%un%" и если не "%un%" для всех пользователей, которым вы хотите предоставить доступ.@ping - это мой простой способ создания секундного таймера.

Итак, это заботится о первом пакетном файле - довольно просто, да?

Вот код для поддержки отладки.bat:

cls
@echo off
TITLE SUPPORT UTILITIES
goto menu

:menu
cls
@echo %username%
echo.
echo           .....................................
echo            ~Written by Cajun Wonder 4/1/2010~
echo           .....................................
echo.
echo What do you want to do? 
echo.
echo [1]  Launch notepad
echo.

:choice
set /P C=[Option]? 
if "%C%"=="1" goto notepad
goto choice

:notepad
echo.
@echo starting notepad....
@ping -n 3 127.0.0.1 > NUL
start notepad
cls
goto menu

Я не программист и на самом деле только начал разбираться в пакетных сценариях около года назад, и этот обходной способ маскировки пароля в пакетном файле, который я обнаружил, довольно потрясающий!

Я надеюсь услышать, что кто-то, кроме меня, способен извлечь из этого какую-то пользу!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top