Pull to refresh

Run as administrator из командной строки

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



Так, чтобы при запуске скрипта появлялся запрос от 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

Впрочем, может быть, я просто плохо искал, и нужная мне утилита все-таки существует?.. В таком случае я буду рад вашим комментариям!
Tags:
Hubs:
+28
Comments 78
Comments Comments 78

Articles