come eseguire uno script PowerShell come amministratore


58

Sul mio desktop di Windows 7 ho script.ps1, che necessita dei privilegi di amministratore (avvia un servizio). Voglio fare clic su questo script ed eseguirlo con i privilegi di amministratore.

Qual è il modo più semplice per raggiungere questo obiettivo?

Risposte:


49

Ecco un modo per farlo, con l'aiuto di un'icona aggiuntiva sul desktop. Immagino che potresti spostare lo script qualcun altro se volessi avere solo una singola icona sul desktop.

  1. Crea un collegamento al tuo script Powershell sul desktop
  2. Fare clic con il tasto destro del collegamento e fare clic su Proprietà
  3. Fai clic sulla scheda Collegamento
  4. Fai clic su Avanzate
  5. Seleziona Esegui come amministratore

Ora puoi eseguire lo script elevato semplicemente facendo doppio clic sul nuovo collegamento sul desktop.


37
Questo ha funzionato per me, ma Esegui come amministratore è diventato disponibile solo dopo aver aggiunto powershell -f davanti al percorso dello script, in modo da "completare" il comando ...
mousio

2
@mousio - Ne avevo bisogno anche io, grazie per il commento
m.edmondson,

@mousio puoi dirmi perché quel comando funziona?
SShaheen,

7
@SShaheen: per rendere disponibile Esegui come amministratore , il collegamento deve puntare a una sorta di eseguibile (ad esempio powershell.exe) anziché solo al documento o allo script a cui il collegamento originariamente indicava. Una scorciatoia per script.ps1funzionare, così come una scorciatoia per powershell.exe -f script.ps1, ma quest'ultima può essere impostata per essere eseguita come amministratore (vedere powershell.exe /?per la spiegazione -f-File
dell'opzione

16

Sui sistemi abilitati UAC, per assicurarsi che uno script sia in esecuzione con privilegi di amministratore completi, aggiungere questo codice all'inizio dello script:

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'

quando si esegue lo script con l'opzione -elevated, tenterà di elevare i privilegi prima di eseguirlo.


Se lo script richiede argomenti-parametri?
Kiquenet,

cosa succede se questo mi dice che è in esecuzione con privilegi completi, ma il mio codice dice ancora privilegi amministrativi insufficienti?
mike.b93,

@Kiquenet aggiungilo in param(...)alto e inoltralo prima -elevated, dovrai essere intelligente su come costruisci il ArgumentList, probabilmente vorrai usare il String[]modulo.
TWiStErRob

piuttosto elegante - meglio che creare una scorciatoia
Mikey

13

se ti trovi nella stessa powerhell puoi farlo:

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

Il problema è che cambia la directory di lavoro per lo script chiamato C:\Windows\System32. Un'alternativa che conserva la directory corrente: stackoverflow.com/a/57033941/2441655
Venryx

4

Dal momento che è seduto sul desktop, direi che il modo più semplice per farlo è trascinarlo sul gadget di elevazione .

Altrimenti potresti creare uno script separato usando il elevatecomando sul tuo script ps1.

In alternativa, è possibile applicare elevatesolo al bit di avvio del servizio.


1

PowerShell ISE è attivo su% windir% \ system32 \ WindowsPowerShell \ v1.0 \ PowerShell_ISE.exe. Puoi fare clic con il tasto destro del mouse e selezionare "Esegui come amministratore" ed eseguire lo script da lì.

Puoi anche trovarlo sotto il Logo di Windows> Tutti i programmi> Accessori> Windows PowerShell e fare la stessa cosa con quelle scorciatoie.



-1

Aggiungi questo all'inizio dello script:

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

Questo sembra essere un sottoinsieme della risposta di MDMoore313 , di oltre quattro anni fa.
Scott,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.