Могу ли я маскировать входной текст в файле bat?

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

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

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

Ответ 1

До 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 script немного сложнее, но в основном работает следующим образом.

Эффект команды "<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 script, чтобы он вызывал PowerShell, а не CScript:

@echo off
for /f "delims=" %%i in ('powershell -file getpwd.ps1') do set passwd=%%i

The Powershell script также прост:

$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.

Ответ 2

Да, я опоздал на 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. Этот файл затем читается в переменную и удаляется.

Ответ 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 

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

@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.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' >
        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.Again следует сохранить как .bat. В отличие от других решений, он создаст/скомпилирует небольшой .exe файл, который будет вызываться (если вы хотите удалить его). Также требуется установленная .NET-инфраструктура, но это не проблема:

@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);

Ответ 4

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

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

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

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

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

Я знаю, что ни одна из них не идеальна, но, возможно, один из них достаточно хорош для вас:)

Ответ 5

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

editv32 -m -p "Password: " PWD

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

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

Ответ 6

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

@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. Исходный код включен.

Ответ 7

Вы можете использовать подпрограмму 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%"

Ответ 8

Если у вас установлен 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

Ответ 9

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

  • Google для ansicon
  • Загрузите zip файл и образец текстового файла.
  • Установить (то есть копировать 2 файла в system32)

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

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

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

Если вы не являетесь администратором машины, вы, вероятно, сможете установить файлы в несистемный каталог, то перед тем, как вызывать программу, вам необходимо добавить каталог в PATH в script и использовать escape-последовательностей. Возможно, это даже может быть текущий каталог, если вам нужен пакет, который не распространяется на admin, всего несколько файлов.

Ответ 10

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

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

свойства

цвета

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

background == черный

применить

ОК

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

Ответ 11

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

Недостатки заключаются в том, что один метод (метод 2) оставляет нежелательный файл в реестре - "Если он запущен без прав", а другой (метод три) добавляет некоторый барахл в script. Излишне говорить, что его можно легко записать в любой файл 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.

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

@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

Ответ 12

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

Pastebin для командного файла здесь

Ответ 13

@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

Ответ 14

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

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

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

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

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

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

Я назвал пакетные файлы runas.bat и Debug Support.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 - это мой способ использовать таймер в секундах.

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

Вот код для Debug Support.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

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

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