Cmd ввод звездочками

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

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

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

I need to map a drive without being prompted for the password. I am trying to use net use and putting the password inline within the command. I get an error.

 net use H: \\MYSERVER\MYFOLDERS\Backup /user:ABCCompany\JoeUser oasddkjkla 

asked May 14, 2018 at 14:44

Bill Greer's user avatar

Please try using:

 net use H: \\MYSERVER\MYFOLDERS\Backup oasddkjkla /user:ABCCompany\JoeUser  

mwfearnley's user avatar

5 gold badges
26 silver badges
37 bronze badges

answered May 16, 2018 at 19:31

David Rossi's user avatar

If you have a space in the password you need to put it in quotes, for example:

QuickishFM's user avatar

1 gold badge
7 silver badges
18 bronze badges

answered Jan 14, 2020 at 19:17

Donavon's user avatar

1 silver badge
2 bronze badges

Мне нужно использовать это внутри автоматически созданной командной строки.

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

Трудно избежать специальных символов в нем.

До сих пор я пытался экранировать все буквенно-цифровые символы с помощью ^
и экранировать символы %
и "
, удваивая их. Но пока не повезло 🙁

Список неудачных попыток таков.

Не могли бы вы помочь мне найти правильную экранированную строку, чтобы использовать ее в пакете или в CMD в качестве встроенной команды?

Прежде чем кто-либо отрицает этот вопрос, потому что я опубликовал пароль, я отредактировал многие его части перед публикацией. Просто говорю 🙂

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

(Я ввел пароль как есть, для этого вывода)

Wild(BoB)Cat
02 фев 2006

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

ErV
28 сен 2007

народ, не подскажете, как в bat-файле прописать ввод пароля? суть в чем: я хочу по сети отдать команду runas, а она требует ввода пароля, причем ей по барабану, даже если пароль пустой. я это дело приписал в батник, но все равно вываливается окошко с требованием ввода пароля. как этот воод пароля прописать в батнике?

Entry
02 фев 2006

а для чего используется виртуальная машина, если не секрет?

Joy
31 янв 2006

вот что я прописал в батнике:

Ответов

До XP и Server 2003 вы можете использовать другой включенный инструмент (VBScript) – следующие два скрипта выполняют ту работу, которую вы хотите.

 @echo off
<nul: set /p passwd=Password:
for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i
echo. 
 Set oScriptPW = CreateObject("ScriptPW.Password")
strPassword = oScriptPW.GetPassword()
Wscript.StdOut.WriteLine strPassword 

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

getpwd.cmd
Командный скрипт немного сложнее, но в основном работает следующим образом.

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

Затем мы повторяем пустую строку (чтобы завершить "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 Другой способ, основанный на команде замены

 @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
. Это гибридный файл.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

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

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

:/>  Acronis disk Director копирует жесткий диск и перемещает систему на acronis ssd. Создание логических дисков в Acronis

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

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

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

Вы можете установить черный цвет переднего плана, например:

 :: see https://stackru.com/questions/33293220/what-is-the-fastest-color-function-in-batch
@echo off
for /F %%a in ('echo prompt $E ^| cmd') do set "ESC=%%a"
set color_white=%ESC%[37m
set color_black=%ESC%[30m
echo(
set /p user=Username:
set /p pass=password:%color_black%
echo %color_white%
echo blablablba 

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

 editv32 -m -p "Password: " PWD 

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

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

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

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

Вы можете получить его по http://www.westmesatech.com/misctools.html
. Исходный код включен.

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

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

Используйте это так:

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

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

Если вы не являетесь администратором машины, вы, вероятно, сможете установить файлы в несистемный каталог, затем вам нужно добавить каталог к ​​PATH в вашем скрипте перед вызовом программы и использованием 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 

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

Я написал программу с открытым исходным кодом под названием editenv
что заменяет мой старший editv32
/ editv64
коммунальные услуги:

 editenv -m -p "Password: " PWD 

В --prompt
( -p
) позволяет указать приглашение для ввода. Выше будет отображаться Password:
подскажите и подождите, пока вы что-то введете. Введенные символы будут отображаться как *
. Нажатие Ctrl
+ C
завершит программу с кодом выхода 1223.

:/>  Скачать бесплатно стандартные игры для Windows 10 на русском

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

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

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

фон == черный

надежда, таким образом, помогает вам!!!!!!!!

Хорошо, я только что нашел действительно достойное решение этой проблемы. C MDKEY работает в Windows 7+ и позволяет вводить данные в диспетчер кредитов Windows из командной строки, а если вы используете переключатель /pass, он предоставляет собственный ввод пароля без раскрытия пароля. Он не отображает ***** при вводе, но пароль скрыт.

  set /p username="Enter School Username: " CMDKEY /list:SERVERNAME | FIND "NONE" > nul 2>&1 IF %ERRORLEVEL% NEQ 0 GOTO MAPDRIVES CMDKEY /ADD:SERVERNAME /username:%username% /pass :MAPDRIVES NET USE Y: \\SERVERNAME\SHARE\%username% 


26 фев ’21 в 14:26

Но он направил меня на верный путь.

Итак, вот мой вариант:

Конфигурация в верхней части скрипта:

 @ECHO OFF
:: Don't leak variables to command shell
SETLOCAL REM service user for backend services - comment out to default to LOCALSYSTEM
SET WINDOWS_SVC_USERNAME=svcadmin 

Где-то внизу после проверки прав администратора и после создания службы:

 SETLOCAL ENABLEDELAYEDEXPANSION
:: Read password for service user
IF DEFINED WINDOWS_SVC_USERNAME ( SET PWR=powershell -Command "$secureString = Read-Host 'Enter password for service user \".\%WINDOWS_SVC_USERNAME%\"' -AsSecureString -ErrorAction Stop; $ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToGlobalAllocUnicode($secureString); $plain = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($ptr); [System.Runtime.InteropServices.Marshal]::ZeroFreeGlobalAllocUnicode($ptr); Write-Host $plain;" FOR /F "usebackq delims=" %%P IN (`!PWR!`) DO SET WINDOWS_SVC_PASSWORD=%%P IF DEFINED WINDOWS_SVC_PASSWORD ( IF ["!WINDOWS_SVC_PASSWORD!"] NEQ [""] ( IF ["!WINDOWS_SVC_PASSWORD!"] NEQ [" "] ( :: The password is now set correctly ECHO "Using ".\%WINDOWS_SVC_USERNAME%" as service user..." sc config prod!WINDOWS_SVC_INFIX!rest!INDEX! obj= ".\!WINDOWS_SVC_USERNAME!" password= "!WINDOWS_SVC_PASSWORD!" ) ELSE ( ECHO "ERROR -- Password possibly empty or PowerShell threw an exception." SET "WINDOWS_SVC_USERNAME=" ) ) ELSE ( ECHO "ERROR -- Could not retrieve password! Password is possibly empty." SET "WINDOWS_SVC_USERNAME=" ) ) ELSE ( ECHO "ERROR -- No password given or PowerShell is not available." SET "WINDOWS_SVC_USERNAME=" )
) ELSE ( ECHO "No service user specified - keeping default "LOCALSYSTEM" user..."
) 

Это еще не испытано в реальных условиях, поэтому обращайтесь с ним осторожно.


12 окт ’21 в 12:45

 for /f "usebackq tokens=*" %%p in (`powershell -Command "$pass = read-host 'Password' -AsSecureString ; $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass); [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)"`) do set jira_password=%%p 

Однако один момент еще не был четко решен: не забудьте очистить переменную пароля перед
ее получением и после
ее использования (если вы не используете команду «setlocal»), т.е. вызовите:

 set "password=" 

Предыстория: пока командная сессия не будет закрыта – переменная остается сохраненной и доступной также вне вашего скрипта. Например:

  • запустите свой пакетный скрипт (который извлекает пароль и затем показывает его для целей тестирования)
  • введите какой-нибудь текст в качестве пароля и посмотрите, как он отображается правильно
  • повторно запустить тот же пакетный скрипт, не закрывая текущий командный сеанс
  • ничего не вводите (т.е. просто нажмите Enter при запросе пароля)
  • вы увидите введенный ранее пароль.

Поскольку некоторые сценарии выполняются в цепочке, и вы не можете контролировать сценарии, выполняемые в том же сеансе после вашего сценария, вам следует позаботиться об очистке переменных пользователя/пароля.

Чтобы избежать проблем с непредвиденным выходом из батч-скрипта (т.е. когда команда очистки переменных не достигнута), лучше использовать

 setlocal
...
endlocal 

22 фев ’23 в 13:17

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

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

 @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 

Другой вариант, аналогичный тому, что отсутствует у Blorgbeard
, – это использовать что-то вроде:

 SET /P pw=C:\^> 

В ^
избегает >
так что запрос пароля будет выглядеть как стандартное приглашение консоли cmd.

:/>  Безопасном режим windows 10

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

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

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

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

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

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

Я назвал командные файлы 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 

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

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

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

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

Joy
30 янв 2006

народ, не подскажете, как в bat-файле прописать ввод пароля? суть в чем: я хочу по сети отдать команду runas, а она требует ввода пароля, причем ей по барабану, даже если пароль пустой. я это дело приписал в батник, но все равно вываливается окошко с требованием ввода пароля. как этот воод пароля прописать в батнике?

Joy
02 фев 2006

А если гасить не сервер на виртуальной машине, а саму прогу виртуальной машины?

Entry
01 фев 2006

зачем тебе для этой задачи использовать runas?

Joy
02 фев 2006

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

2 ответа

(поправьте меня, если я что-то упустил, это правильно для моего случая)

Результирующая строка, которая должна использоваться в переменной TFS (и я проверил ее, она работает!):

 ;d#se#&4~75EY(H[SM""%cznGB 

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

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

Спасибо всем, кто прокомментировал и оставил ответ в этой теме.

22 Июл 2020 в 19:40

 rem // enable delayed expansion to expand other poison characters safely
@Echo off & setlocal EnableExtensions EnableDelayedExpansion
rem // escape % character by doubling
Set "PW=;d#se#&4~75EY(H[SM"%%cznGB"
"C:\WINDOWS\system32\inetsrv\appcmd.exe" set vdir /vdir.name:"appfolder/Files" -physicalPath:"\\servername\virtualfolder" -userName:"sa_user@domain.com" -password:"!PW!"
Endlocal 

22 Июл 2020 в 16:02

-galakt-
28 сен 2007

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

Joy
02 фев 2006

именно!!! не поверишь, я тоже все это проделал! ))) вот только выставил на 40 минут. а если за это время не появляется питалово, то упс дает команду на гашение. а перед этим должен исполнить команду, в которую я хочу прописать гашение виртуальной машины, на которой тоже настроен сервер. все было бы просто, если бы виртуальный сервер был в общем домене. тогда с админскими правами даешь ему команду спать по айпишнику как обычному компу — и он вырубается. только вот плевать хотел на мои права админа на хостовой машине, он, видите ли, сам по себе, и в связи с этим на удаленную команду спать отзывается отказом в доступе. гад! ))) тогда я попробовал через runas, но что из этого вышло, вы уже поняли. а в команду упсника я просто прописал батник, в который и записал эту команду. вот и ищу варианты, как к этому добавить еще и пароль админа на виртуальной машине, когда он его затребует.

Joy
03 фев 2006

а для чего используется виртуальная машина, если не секрет?

а с батником есть решение! вот такое:

-galakt-
07 апр 2008

Entry
30 янв 2006

народ, не подскажете, как в bat-файле прописать ввод пароля? суть в чем: я хочу по сети отдать команду runas, а она требует ввода пароля, причем ей по барабану, даже если пароль пустой. я это дело приписал в батник, но все равно вываливается окошко с требованием ввода пароля. как этот воод пароля прописать в батнике?

joy, отправь содержимое БАТника

Takichi
07 апр 2008

V_user
02 фев 2006

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

А если гасить не сервер на виртуальной машине, а саму прогу виртуальной машины?