PDA

Показать полную графическую версию : Запуск ps скрипта из bat скрита


pogo
11-04-2016, 15:07
Доброго времени суток.
Подскажите пожалуйста, как можно из bat файла, вызвать ps скрпит с повышенными привилегиями?
Вариант приведенный ниже, через runas не работает(
Если подскажите, как можно спрятать пароль, будет вообще замечательно.
@echo off
set message=%~2

set posh=%SystemRoot%\System32\WindowsPowerShell\v1.0\PowerShell.exe -command ". 'C:\Scripts\test.ps1'"
set pass=p@$$w0rd

if "%message%"=="test" (
echo %pass% | runas /user:domain\user %posh%
)

Foreigner
11-04-2016, 15:20
pogo, Пароль можно вводить только в интерактивном режиме. runas не принимает параметров в виде пароля, в том числе через пайп.

pogo
11-04-2016, 15:23
Foreigner,
Тогда это не подходит(( Интерактивный режим не подходит.
Есть ещё какие-то варианты?

Iska
11-04-2016, 15:41
Есть ещё какие-то варианты? »
Что мешает запускать пакетный файл с административными привилегиями (по ПКМ)?

pogo
11-04-2016, 15:54
Iska,
То что скрипт будет запускаться gsm модемом по смс.

Kazun
11-04-2016, 15:56
Несколько вариантов:

1) Использовать psexec , где можно указать пароль и логин.

-u Specifies optional user name for login to remote
computer.
-p Specifies optional password for user name. If you omit this
you will be prompted to enter a hidden password.
-h If the target system is Vista or higher, has the process
run with the account's elevated token, if available.

2) Создать задачу в task scheduler и выполнить скрипт, лучший вариант
3) Пароль можно указать, но пользователю явно придеться нажать Да/Yes ,т.к. UAC не даст запустить, только отключение. Сохраняем скрипт и выполняем его, а из него будет уже вызваться основной:

$pass = ConvertTo-SecureString 'P@$$w0rd1' -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential ("domain\user", $pass)
$ScriptName = 'C:\Scripts\test.ps1'
$arg = "Start-Process powershell -Verb RunAs -ArgumentList '-ExecutionPolicy ByPass -File $ScriptName'"
Start-Process powershell -Credential $creds -ArgumentList $arg

pogo
11-04-2016, 16:01
Kazun,
Большое спасибо!
Тоже думал по поводу таска в планировщике, но почему то показалось что решение костыль, и есть лучше. Но что-то погуглив прихожу к мнению что это самый меньший костыль из имеющихся.

Дабы не разводить ещё тем, подскажите, в bat-скриптах, можно как-то скрыть пароль, аналогично posh? Когда пасс конвертируется в SecureString выгружается в файл и оттуда уже берется?
Вариант конечно тоже так себе по надежности, но хоть бы не в plaintext

Iska
11-04-2016, 16:09
pogo, никак. А зачем Вам там пароль? Вы же его введёте один раз «ручками» в Диспетчере задач.

pogo
11-04-2016, 16:28
Iska,
Там всё намного костыльнее получается( в батнике запускается ещё один exe с указание login\pass для другого доступа.

greg zakharov
11-04-2016, 18:34
Подскажите пожалуйста, как можно из bat файла, вызвать ps скрпит с повышенными привилегиями?
Эх, MVP'эшники, вечно все усложняют... pogo, сохраните код ниже как бат-файл и запустите.
<# :
@echo off
setlocal
set "self=%~f0" % rem : полный путь до командного сценария
2>nul powershell /noprofile /executionpolicy bypass^
"&{[ScriptBlock]::Create((gc '%self%') -join [Char]10).Invoke(@(&{$args}'%self%'))}"||(
echo:PowerShell has not been found.
)
endlocal
exit /b
#>

if (!(New-Object Security.Principal.WindowsPrincipal(
[Security.Principal.WindowsIdentity]::GetCurrent()
)).IsInRole(
[Security.Principal.WindowsBuiltInRole]::Administrator
)) {
$proc = New-Object Diagnostics.Process
$proc.StartInfo.FileName = $args[0]
$proc.StartInfo.LoadUserProfile = $false
$proc.StartInfo.Domain = [Environment]::UserDomainName
$proc.StartInfo.UserName = $(Read-Host 'Имя пользователя')
$proc.StartInfo.Password = $(Read-Host 'Пароль' -as)
$proc.StartInfo.UseShellExecute = $false
$proc.Start()
}
else {
Write-Host Здесь мог бы быть Ваш код -for green
Write-Host Нажмите любую клавишу для продолжения... -NoNewline
$host.UI.RawUI.ReadKey('NoEcho, IncludeKeyDown') | Out-Null
''
}

pogo
12-04-2016, 15:36
greg zakharov,
Спасибо! Но не могли бы вы чуток прокомментировать скрипт, увы познания bat у меня не велики... Что в итоге будет на выходе по выполнению скрипта?

greg zakharov
12-04-2016, 23:33
pogo, суть примера выше в следующем: обычный командный файл, запускающий себя как PowerShell сценарий; после того как управление будет передано PowerShell, проверяется наличие прав администратора, если таковых нет, предлагается ввести имя администратора и пароль, после чего командный файл снова перезапустит себя, но уже с правами администратора и исполнит блок кода else, то есть выведет надпись "здесь мог бы быть ваш код" и будет ожидать нажатия некоторой клавиши для завершения, - в сущности убивается два зайца разом: не нужно отдельно создавать сценарий PowerShell, а можно его сразу запиливать в бат, ну и решается проблема с повышением прав для запуска. Есть, конечно, некоторые нюансы, но они станут для Вас очевидны по мере работы с командными шеллами.

emlen
10-10-2018, 12:24
код ниже как бат-файл и запустите »
почему-то не отрабатывет, в чем может быть причина?

роверяется наличие прав администратора, если таковых нет, предлагается ввести имя администратора и пароль, после чего командный файл снова перезапустит себя, но уже с правами администратора и исполнит блок кода else, то есть выведет надпись "здесь мог бы быть ваш код" и будет ожидать нажатия некоторой клавиши для завершения »
ничего подобного не происходит((

alpap
10-10-2018, 16:18
emlen,
set "self=%~f0" % rem : полный путь до командного сценария
иногда в этом, если имя, файла, например: "10.10.2018 15'56'20.bat"
если так, попробуйте поменять имя на что-то понятное: "name.bat"
если не в этом причина, укажите точно что не отрабатывает - запуск bat не происходит или код внутри не так работает, как и где запускаете.




© OSzone.net 2001-2012