як запустити скрипт повноважень як адміністратор


57

На своєму робочому столі Windows 7 у мене є script.ps1, який потребує привілеїв адміністратора (він запускає послугу). Я хочу натиснути на цей скрипт і запустити його з правами адміністратора.

Який найпростіший спосіб досягти цього?

Відповіді:


48

Ось один із способів зробити це за допомогою додаткової іконки на робочому столі. Я думаю, ви могли б перемістити сценарій ще когось, якби хотіли мати лише один значок на робочому столі.

  1. Створіть ярлик до сценарію Powershell на робочому столі
  2. Клацніть ярлик правою кнопкою миші та натисніть Властивості
  3. Перейдіть на вкладку Ярлик
  4. Клацніть Додатково
  5. Виберіть Запустити як адміністратор

Тепер ви можете запустити скрипт піднятим простим подвійним клацанням нової ярлика на робочому столі.


36
Це працювало для мене, але запустити як адміністратор стало доступно лише після додавання 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

У системах з підтримкою UAC, щоб переконатися, що сценарій працює з повними правами адміністратора, додайте цей код на початку вашого сценарію:

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'

при запуску вашого сценарію за допомогою перемикача -eleva, він спробує підвищити привілеї перед запуском.


Якщо скрипт вимагає аргументів-параметрів?
Кікенет

що робити, якщо це скаже мені, що він працює з повними привілеями, але мій код все ще говорить про недостатню адміністративні привілеї?
mike.b93

@Kiquenet додайте його param(...)вгорі та перешліть їх прямо раніше -elevated, вам потрібно буде бути розумним щодо того, як ви будуєте ArgumentList, ймовірно, захочете використовувати String[]форму.
TWiStErRob

досить витончений - краще, ніж створювати ярлик
Майкі

13

якщо ви перебуваєте в одній і тій же силі, ви можете це зробити:

Start-Process powershell -verb runas -ArgumentList "-file fullpathofthescript"

Проблема з цим полягає в тому, що він змінює робочий каталог для викликаного сценарію на C:\Windows\System32. Альтернатива , яка зберігає поточний каталог: stackoverflow.com/a/57033941/2441655
Venryx

4

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

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

Або ви можете застосувати elevateлише біт для запуску сервісу.


1

PowerShell ISE живе на% windir% \ system32 \ WindowsPowerShell \ v1.0 \ PowerShell_ISE.exe. Ви можете клацнути правою кнопкою миші та вибрати "Запустити як адміністратор" та запустити сценарій звідти.

Ви також можете знайти його в логотипі Windows> Усі програми> Аксесуари> Windows PowerShell і зробити те ж саме з цими ярликами.



-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 , починаючи з чотирьох років тому.
Скотт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.