Как создать новый процесс в том же скрипте

Я понимаю, что вы не можете повысить права существующего процесса, но вы можете создать новый процесс с повышенными привилегиями.

В настоящее время у меня есть два сценария, где один сценарий создает повышенные привилегии и вызывает другой.

# script1.ps1

$abc = $args
$startInfo = $NULL
$process = $NULL
$standardOut = $NULL
$userId = $NULL

$password = get-content C:\cred.txt | convertto-securestring    

$startInfo = New-Object System.Diagnostics.ProcessStartInfo
$startInfo.FileName = "powershell.exe"
$startInfo.Arguments = "C:\script2.ps1 " + $abc

$startInfo.RedirectStandardOutput = $true
$startInfo.UseShellExecute = $false
$startInfo.CreateNoWindow = $false
$startInfo.Username = "username"
$startInfo.Domain = "DOMAIN"
$startInfo.Password = $password 

$process = New-Object System.Diagnostics.Process
$process.StartInfo = $startInfo
$process.Start() | Out-Null
$userId = $process.StandardOutput.ReadToEnd() 
$process.WaitForExit()

return $userId

Сначала думал создать функцию New_Function в script1.ps1 и запускать через $startInfo.Arguments, т.е. $startInfo.Arguments = New_Function

$abc = $args
$startInfo = $NULL
$process = $NULL
$standardOut = $NULL
$userId = $NULL

Function New_Function(){  
    $foo = "Hello World"
    return $foo
}


$password = get-content C:\cred.txt | convertto-securestring    

$startInfo = New-Object System.Diagnostics.ProcessStartInfo
$startInfo.FileName = "powershell.exe"
$startInfo.Arguments = New_Function

$startInfo.RedirectStandardOutput = $true
$startInfo.UseShellExecute = $false
$startInfo.CreateNoWindow = $false
$startInfo.Username = "username"
$startInfo.Domain = "DOMAIN"
$startInfo.Password = $password 

$process = New-Object System.Diagnostics.Process
$process.StartInfo = $startInfo
$process.Start() | Out-Null
$userId = $process.StandardOutput.ReadToEnd() 
$process.WaitForExit()    

return $userId

Вместо того, чтобы выводить на экран «Hello World», я получаю следующую ошибку:

The term 'Hello' is not recognized as the name of a cmdlet, function, script fi
le, or operable program. Check the spelling of the name, or if a path was inclu
ded, verify that the path is correct and try again.
At line:1 char:6
+ Hello <<<<  World
    + CategoryInfo          : ObjectNotFound: (Hello:String) [], CommandNotFou 
   ndException
    + FullyQualifiedErrorId : CommandNotFoundException

Есть идеи???


person Glowie    schedule 07.10.2013    source источник
comment
Я думаю, что $startInfo.Arguments = New_Function может установить $startInfo.Arguments в Hello World, поэтому результирующая командная строка будет powershell.exe hello world. Попробуйте установить точку останова в New_Function и посмотреть, когда она будет вызвана.   -  person JohnL    schedule 07.10.2013
comment
Кроме того, вы можете обнаружить, что новая функция недоступна в новом процессе Powershell, потому что она не является частью вашей текущей области действия powershell.   -  person JohnL    schedule 07.10.2013
comment
@JohnL Я установил точку останова, и New_Function вызывается после выполнения $startInfo.Arguments ...   -  person Glowie    schedule 07.10.2013


Ответы (1)


Эта строка:

 $startInfo.Arguments = New_Function

Вызывает New_Function, которая возвращает «Hello World» и присваивает его $startInfo.Arguments. Итак, когда вы запускаете процесс запуска, командная строка выглядит так:

C:\windows\system32\WindowsPowerShell\v1.0\powershell.exe hello world

Сообщение об ошибке сообщает вам, что PowerShell не может найти команду (или приложение) с именем hello. Мне не совсем понятно, что вы пытаетесь сделать. Как упоминалось в комментариях, функция New_Function не будет доступна в новом процессе Powershell.exe, если вы не поместите ее копию в сценарий и не вызовете ее оттуда, а затем не передадите путь этого сценария к Powershell.exe.

person Keith Hill    schedule 07.10.2013
comment
В настоящее время у меня есть два сценария, где один сценарий вызывает другой сценарий с повышенными привилегиями (stackoverflow.com/questions/18534500/). Я хотел бы сделать эти два скрипта одним скриптом, т.е. исходный второй скрипт становится порожденным процессом или функцией, которая запускается в повышенном режиме. - person Glowie; 08.10.2013
comment
Посмотрите, поможет ли это сообщение в блоге: rkeithhill .wordpress.com/2013/04/05/ - person Keith Hill; 08.10.2013