Я пишу командный файл для выполнения некоторых других программ. В этом случае мне нужно запросить пароль. У меня есть какой-нибудь способ замаскировать вводимый текст. Мне не нужно печатать символы ******* вместо вводимых символов. Поведения запроса пароля в 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
Please try using:
net use H: \\MYSERVER\MYFOLDERS\Backup oasddkjkla /user:ABCCompany\JoeUser
5 gold badges
26 silver badges
37 bronze badges
answered May 16, 2018 at 19:31
If you have a space in the password you need to put it in quotes, for example:

1 gold badge
7 silver badges
18 bronze badges
answered Jan 14, 2020 at 19:17
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.
.. Таким образом, вы получаете запрос, затем экран очищается после ввода.
Если бы этого было недостаточно, я бы либо переключился на 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, которое, на мой взгляд, действительно здорово. Затем я улучшил его следующим образом:
- Google для ansicon
- Загрузите zip-файл и образец текстового файла.
- Установить (это означает, что скопировать 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.
Создайте пакетный файл, который вызывает тот, который нужен для невидимых символов, затем создайте ярлык для вызываемого пакетного файла.
щелкните правой кнопкой мыши
текст == черный
фон == черный
надежда, таким образом, помогает вам!!!!!!!!
Хорошо, я только что нашел действительно достойное решение этой проблемы. 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.
Я прочитал все неуклюжие решения в сети о том, как маскировать пароли в командном файле, о том, как использовать решение 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
а что ты предлагаешь? я просто больше придумать не могу ничего для того, чтобы второй сервер на виртуальной машине, не принадлежащий к домену (то есть права админа домена на него не распространяются), корректно завершился в мое отсутствие запуском команды в случае выключения света (то есть, не по расписанию). я искал другой путь: отдать команду программе виртуальной машины для этого дела. но так и не понял, как это можно сделать, кроме как ручками, для чего, естественно, требуется личное присутствие. поэтому и хочу разобраться в командной строке. )))
А если гасить не сервер на виртуальной машине, а саму прогу виртуальной машины?



