Как запустить скрипт PowerShell от имени администратора

58

На моем рабочем столе Windows 7 у меня есть script.ps1, которому нужны права администратора (он запускает службу). Я хочу нажать на этот скрипт и запустить его с правами администратора.

Какой самый простой способ сделать это?

Sajee
источник

Ответы:

49

Вот один из способов сделать это с помощью дополнительной иконки на вашем рабочем столе. Я думаю, вы могли бы переместить скрипт кому-то еще, если вы хотите, чтобы на рабочем столе была только одна иконка.

  1. Создайте ярлык для вашего скрипта Powershell на рабочем столе
  2. Щелкните правой кнопкой мыши ярлык и выберите Свойства
  3. Перейдите на вкладку « Ярлык »
  4. Нажмите Дополнительно
  5. Выберите « Запуск от имени администратора».

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

Кез
источник
37
Это сработало для меня, но « Запуск от имени администратора» стало доступно только после добавления powershell -f перед путем к сценарию, чтобы «завершить» команду…
mousio
2
@mousio - мне это тоже нужно было, спасибо за комментарий
m.edmondson
@mousio вы можете сказать мне, почему эта команда работает?
SShaheen
7
@SShaheen - чтобы « Запуск от имени администратора» стал доступным, ярлык должен указывать на некий исполняемый файл (например, powershell.exe), а не только на документ или скрипт, на который изначально указывал ярлык. Ярлык script.ps1работает, как и ярлык powershell.exe -f script.ps1, но последний может быть настроен на запуск от имени администратора (см. powershell.exe /?Объяснение переключателя -fили -File)
mousio
16

В системах с включенным контролем учетных записей, чтобы убедиться, что сценарий выполняется с полными привилегиями администратора, добавьте этот код в начале сценария:

param([switch]$Elevated)

function Test-Admin {
  $currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
  $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}

if ((Test-Admin) -eq $false)  {
    if ($elevated) 
    {
        # tried to elevate, did not work, aborting
    } 
    else {
        Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
}

exit
}

'running with full privileges'

при запуске вашего скрипта с ключом -elevated он попытается повысить привилегии перед запуском.

MDMoore313
источник
Если скрипт требует аргументов-параметров?
Kiquenet
что, если это говорит мне, что он работает с полными привилегиями, но мой код все еще говорит о недостаточных административных привилегиях?
mike.b93
@Kiquenet добавьте его param(...)сверху и перешлите их прямо перед этим -elevated, вам нужно быть умным в том, как вы строите ArgumentList, возможно, захотите использовать String[]форму.
TWiStErRob
довольно изящный - лучше, чем создание ярлыка
Майки
13

если вы находитесь в том же PowerShell, вы можете сделать это:

Start-Process powershell -verb runas -ArgumentList "-file fullpathofthescript"
mjsr
источник
Проблема в том, что он меняет рабочий каталог для вызываемого скрипта на C:\Windows\System32. Альтернатива, которая сохраняет текущий каталог: stackoverflow.com/a/57033941/2441655
Venryx
4

Поскольку он находится на вашем рабочем столе, я бы сказал, что самый простой способ сделать это - перетащить его на гаджет высот .

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

Или вы можете применить elevateтолько к биту запуска сервиса.

badp
источник
1

PowerShell ISE находится по адресу% windir% \ system32 \ WindowsPowerShell \ v1.0 \ PowerShell_ISE.exe. Вы можете щелкнуть по нему правой кнопкой мыши, выбрать «Запуск от имени администратора» и запустить скрипт там.

Вы также можете найти его под логотипом Windows> Все программы> Стандартные> Windows PowerShell и сделать то же самое с этими ярлыками.

vapcguy
источник
0

Если вы хотите запустить скрипт Powershell от имени администратора, прямо из контекстного меню Проводника, см. Раздел 2 моего ответа здесь: https://stackoverflow.com/a/57033941/2441655

Venryx
источник
-1

Добавьте это в начало сценария:

$currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
$testadmin = $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
if ($testadmin -eq $false) {
Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
exit $LASTEXITCODE
}
Энтони
источник
Похоже, это часть ответа MDMoore313 более четырех лет назад.
Скотт