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ąć?

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.


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.


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"

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.


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.



-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
}

To wydaje się być podzbiorem odpowiedzi MDMoore313 sprzed ponad czterech lat.
Scott
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.