Пакетный скрипт вылетает, когда в пароле используется специальный символ PIPE - PullRequest
0 голосов
/ 17 мая 2018

Мой test.bat падает, когда пользователь вводит PIPE ('|') в качестве одного из символов в пароле

Код:

Set vAppPoolUser=
Set /p vAppPoolUser= Enter MicroStrategyWebPool user name (domain\username): 

Echo.
setlocal enabledelayedexpansion
set vAppPoolUserPswd=
 set "psCommand=powershell -Command "$pword = read-host 'MicroStrategyWebPool password' -AsSecureString ; ^
    $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^
        [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""

for /f "usebackq delims=" %%p in (`%psCommand%`) do set "vAppPoolUserPswd=%%p"
Echo !vAppPoolUserPswd!
Echo.

------------------ Еще один блок, который проверяет ---------------------

REM verify user credentials
setlocal enabledelayedexpansion
set vCredenvalid=
Set "vpsCommand=Powershell -Command "(new-object directoryservices.directoryentry '','%vAppPoolUser%','%vAppPoolUserPswd%').psbase.name -ne $nul"" 
for /f "usebackq delims=" %%p in (`%vpsCommand%`) do set vCredenvalid=%%p
Echo !vCredenvalid!
if %vCredenvalid%==False ( 
            call :ColorTextMain 0C "Incorrect username or password"
            Echo.


REM verify user credentials
setlocal enabledelayedexpansion
set vCredenvalid=
Set "vpsCommand=Powershell -Command "(new-object directoryservices.directoryentry '','%vAppPoolUser%','!vAppPoolUserPswd!').psbase.name -ne $nul"" 
for /f "usebackq delims=" %%p in (`%vpsCommand%`) do set vCredenvalid=%%p
Echo !vCredenvalid!
if !vCredenvalid!==False ( 
            call :ColorTextMain 0C "Incorrect username or password"
            Echo.
goto :readIISUser
) 
echo.
echo Credentials Validated......
echo.
echo Applicaiton message.......Credentials Validated >>%vLog_FileLocation%


REM set apppool user
Echo Application Message.....Setting MicroStrategyWebPool user >>%vLog_FileLocation%
Echo Setting MicroStrategyWebPool user
"%vAppcmdpath%\appcmd.exe" set config /section:applicationPools /[name='MicroStrategyWebPool'].processModel.identityType:SpecificUser /[name='MicroStrategyWebPool'].processModel.userName:%vAppPoolUser% /[name='MicroStrategyWebPool'].processModel.password:!vAppPoolUserPswd!  >>%vLog_FileLocation%
REM restart appoool
"%vAppcmdpath%\appcmd.exe" recycle apppool /apppool.name:MicroStrategyWebPool

Вывод:

Введите имя пользователя WebPool (домен \ имя пользователя): testUser

Пароль WebPool: {} |

Сбои при нажатии Enterпосле пароля

1 Ответ

0 голосов
/ 17 мая 2018

Вам нужно экранировать специальные символы, используя ^ для одних и % для других.

Для этого, однако, вам нужна только магия setlocal enabledelayedexpansion

@echo off
setlocal enabledelayedexpansion
set /p "pass=password: "
!pass!

В этом случае я ввожу пароль pass|word, и он будет отображаться passw|word

Я не могу проверить ваш реальный пример, но ваш код должен выглядеть примерно так:

@echo off
setlocal enabledalayedexpansion
Set vAppPoolUser=
Set /p "vAppPoolUser=Enter WebPool user name (domain\username): "

Echo.
set vAppPoolUserPswd=
 set "psCommand=powershell -Command "$pword = read-host 'WebPool password' -AsSecureString ; ^
    $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^
        [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""

for /f "usebackq delims=" %%p in (`%psCommand%`) do set "vAppPoolUserPswd=%%p"
Echo !vAppPoolUserPswd!

EDIT Что касается побега других персонажей, вопрос в комментариях. Как правило, большинство других специальных символов являются дескрипторами enabledelayedexpansion, но обычно вам необходимо экранировать и !, а иногда ^, поэтому после установки переменной:

for /f "usebackq delims=" %%p in (`%psCommand%`) do set "vAppPoolUserPswd=%%p"
set "vAppPoolUserPswd=!vAppPoolUserPswd:^^=^^!"
set "vAppPoolUserPswd=!vAppPoolUserPswd:^^!=^^!!"
echo !vAppPoolUserPswd!

оттуда вам нужно заменить любые %vAppPoolUserPswd% переменные на !vAppPoolUserPswd! для delayedexpansion, чтобы сделать свое дело.

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