jak uruchomić skrypt PowerShell jako administrator

56

Na pulpicie systemu Windows 7 mam skrypt.ps1, który wymaga uprawnień administratora (uruchamia usługę). Chcę kliknąć ten skrypt i uruchomić go z uprawnieniami administratora.

Jak najłatwiej to osiągnąć?

Sajee
źródło

Odpowiedzi:

48

Oto jeden ze sposobów na zrobienie tego za pomocą dodatkowej ikony na pulpicie. Sądzę, że możesz przenieść skrypt komuś innemu, jeśli chcesz mieć tylko jedną ikonę na pulpicie.

  1. Utwórz skrót do skryptu Powershell na pulpicie
  2. Kliknij skrót prawym przyciskiem myszy i wybierz Właściwości
  3. Kliknij kartę Skrót
  4. Kliknij Zaawansowane
  5. Wybierz Uruchom jako administrator

Teraz możesz uruchomić skrypt z podwyższonym poziomem uprawnień, klikając dwukrotnie nowy skrót na pulpicie.

Kez
źródło
35
Działa to dla mnie, ale Uruchom jako administrator stał się dostępny dopiero po dodaniu powershell -f przed ścieżką skryptu, aby „ukończyć” polecenie…
mousio
2
@mousio - Też tego potrzebowałem, dziękuję za komentarz
m.edmondson,
@mousio, czy możesz mi powiedzieć, dlaczego to polecenie działa?
SShaheen
7
@SShaheen - aby Uruchom jako Administrator, aby był dostępny, skrót musi wskazywać na jakiś plik wykonywalny (np. Powershell.exe) zamiast tylko dokumentu lub skryptu, na który skrót początkowo wskazywał. Skrót do script.ps1działa, podobnie jak skrót do powershell.exe -f script.ps1, ale ten ostatni można ustawić tak, aby działał jako administrator (zobacz powershell.exe /?wyjaśnienie dotyczące przełącznika -flub -Fileprzełącznika)
mousio
16

W systemach obsługujących UAC, aby upewnić się, że skrypt działa z pełnymi uprawnieniami administratora, dodaj ten kod na początku skryptu:

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'

podczas uruchamiania skryptu z przełącznikiem -elevated, spróbuje on podnieść uprawnienia przed uruchomieniem.

MDMoore313
źródło
Jeśli skrypt wymaga parametrów-argumentów?
Kiquenet
co jeśli to powie mi, że działa z pełnymi uprawnieniami, ale mój kod wciąż mówi o niewystarczających uprawnieniach administracyjnych?
mike.b93
@Kiquenet dodaj go do param(...)góry i prześlij dalej -elevated, musisz być sprytny, jak zbudować ArgumentList, prawdopodobnie będziesz chciał użyć String[]formularza.
TWiStErRob
całkiem fajne - lepsze niż tworzenie skrótu
Mikey
13

jeśli jesteś w tej samej PowerShell, możesz to zrobić:

Start-Process powershell -verb runas -ArgumentList "-file fullpathofthescript"
mjsr
źródło
Problem polega na tym, że zmienia katalog roboczy dla wywoływanego skryptu na C:\Windows\System32. Alternatywa, która zachowuje bieżący katalog: stackoverflow.com/a/57033941/2441655
Venryx
4

Ponieważ siedzi na pulpicie, powiedziałbym, że najłatwiejszym sposobem na zrobienie tego jest przeciągnięcie go na gadżet elewacji .

W przeciwnym razie możesz utworzyć osobny skrypt za pomocą elevatepolecenia skryptu ps1.

Lub możesz zastosować elevatetylko do bitu początkowego usługi.

badp
źródło
1

PowerShell ISE mieszka w% windir% \ system32 \ WindowsPowerShell \ v1.0 \ PowerShell_ISE.exe. Możesz kliknąć to prawym przyciskiem myszy, wybrać „Uruchom jako administrator” i uruchomić skrypt.

Można go również znaleźć pod logo Windows> Wszystkie programy> Akcesoria> Windows PowerShell i zrobić to samo z tymi skrótami.

vapcguy
źródło
0

Jeśli chcesz uruchomić skrypt Powershell jako administrator, bezpośrednio z menu kontekstowego Eksploratora, zobacz sekcję 2 mojej odpowiedzi tutaj: https://stackoverflow.com/a/57033941/2441655

Venryx
źródło
-1

Dodaj to na początku skryptu:

$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
}
Anthony
źródło
To wydaje się być podzbiorem odpowiedzi MDMoore313 sprzed ponad czterech lat.
Scott