Вчера я некоторое время потратил на то, чтобы запустить скрипт из командной строки от имени администратора. Мне нужен был эквивалент right-click > «Run as administrator»:

Так, чтобы при запуске скрипта появлялся запрос от UAC

Утилита runas.exe меня не устроила, т.к. она требует явного указания имени пользователя, ввода пароля или использования saved credentials. «Сторонние» утилиты я даже не рассматривал – ошибки в коде я и сам сделаю, зачем мне еще чужие? :)
Перепробовав несколько вариантов я остановился на собственноручно написанном скрипте для PowerShell:
Фактически, это вызов ShellExecuteEx() с параметром lpVerb = «RunAs».
Использовать комманлет Start-Process у меня не получилось, т.к. при одновременном указании параметров -Verb RunAs и -Wait он завершается с ошибкой:
Впрочем, может быть, я просто плохо искал, и нужная мне утилита все-таки существует?.. В таком случае я буду рад вашим комментариям!

Так, чтобы при запуске скрипта появлялся запрос от UAC

Утилита runas.exe меня не устроила, т.к. она требует явного указания имени пользователя, ввода пароля или использования saved credentials. «Сторонние» утилиты я даже не рассматривал – ошибки в коде я и сам сделаю, зачем мне еще чужие? :)
Перепробовав несколько вариантов я остановился на собственноручно написанном скрипте для PowerShell:
$ErrorActionPreference = 'Stop'
$si = New-Object System.Diagnostics.ProcessStartInfo
$si.FileName = $args[0]
$si.Arguments = [String]::Join(' ', $args[1..($args.Count - 1)])
$si.Verb = 'RunAs'
$si.UseShellExecute = $true
$process = [System.Diagnostics.Process]::Start($si)
# Very strange code...
# But I spy it in MSBuild...
# I hope these guys know what they are doing! :)
$process.WaitForExit()
do
{
[System.Threading.Thread]::Sleep(0)
}
while (!$process.HasExited)
Exit $process.ExitCode
Фактически, это вызов ShellExecuteEx() с параметром lpVerb = «RunAs».
Использовать комманлет Start-Process у меня не получилось, т.к. при одновременном указании параметров -Verb RunAs и -Wait он завершается с ошибкой:
PS C:\Users\psg> Start-Process 'cmd.exe' -Verb RunAs -Wait Start-Process : Access is denied At line:1 char:14 + Start-Process <<<< 'cmd.exe' -Verb RunAs -Wait + CategoryInfo : NotSpecified: (:) [Start-Process], Win32Exception + FullyQualifiedErrorId : System.ComponentModel.Win32Exception,Microsoft.PowerShell.Commands.StartProcessCommand
Впрочем, может быть, я просто плохо искал, и нужная мне утилита все-таки существует?.. В таком случае я буду рад вашим комментариям!