Come abilitare l'esecuzione degli script di PowerShell?


260

Quando provo ad eseguire il mio script PowerShell ottengo questo errore:

Il file C: \ Common \ Scripts \ hello.ps1 non può essere caricato perché l'esecuzione degli script è disabilitata su questo sistema. Per ulteriori dettagli, consultare "get-help about_signing".
Alla riga: 1 carattere: 13
+. \ Hello.ps1 <<<<
+ CategoryInfo: NotSpecified: (:) [], PSSecurityException
+ FullyQualifiedErrorId : RuntimeException

Risposte:


400
  1. Avviare Windows PowerShell con l'opzione "Esegui come amministratore". Solo i membri del gruppo Administrators sul computer possono modificare il criterio di esecuzione.

  2. Abilita l'esecuzione di script non firmati inserendo:

    set-executionpolicy remotesigned
    

Ciò consentirà l'esecuzione di script non firmati scritti sul computer locale e script firmati da Internet.

Vedi anche Esecuzione di script nella libreria Microsoft TechNet.


3
Questo cambierà il criterio in modo permanente o devo farlo ogni volta che riavvio il mio computer?
Ray

2
@Ray Questo cambierà la politica in modo permanente.
Pavel Chuchuva,

1
@Ray Vedi la documentazione . Per impostazione predefinita, lo imposta per LocalMachine. Per impostare per altri ambiti ( CurrentUsero Process), passare -Scopeesplicitamente.
jpmc26,

@PavelChuchuva dovrei aggiungere questa riga sopra la mia sceneggiatura che intendevi
FabioSpaghetti

@FabioSpaghetti Non c'è bisogno di aggiungere nulla ai tuoi script. Basta eseguire quel comando una volta seguendo i passaggi.
Pavel Chuchuva,

74

Il criterio di esecuzione predefinito è impostato su limitato, puoi vederlo digitando:

Get-ExecutionPolicy

È necessario digitare quanto segue per passare alla modalità senza restrizioni:

Set-ExecutionPolicy unrestricted

Spero che sia di aiuto


13
La firma obbligatoria ha senso se si prevede che l'utente copi e incolli script dannosi da Internet. Se supponi che l'utente non sia stupido, allora "telecomandato" non aggiunge alcuna sicurezza e rende la vita difficile.
Guss,

@Guss: Durante i test ho scoperto che RemoteSigned non richiede più la firma dei file .ps1 generati localmente e considera il controllo del codice sorgente git come fonte locale.
Giosuè l'

@Joshua - sì, il mio punto esattamente. Se RemoteSignednon blocca copia e incolla, non blocca git o altri metodi di download non IE, a cosa serve? Dillo con me: "assolutamente niente!". Penso che richiedere che gli script siano firmati con un certificato di firma del codice di $ 100 è inutile, stupido e annulla tutto ciò che un linguaggio di scripting decente può fare per Windows. Detto questo, se la strada da percorrere è far capire agli utenti cosa stanno facendo per usare gli script PS, allora potremmo essere troppo sth ... Nahhhh, questo non funzionerà mai ;-)
Guss l'

@Guss: ho già un buon linguaggio di scripting su Windows. Cygwin funziona alla grande su Windows 10; come letteralmente molto meglio di quanto non fosse mai stato in qualsiasi versione precedente di Windows. Ho sempre e solo voglia di eseguire script che qualcun altro ha già scritto.
Joshua,

61

Sul mio computer che utilizzo per sviluppare script, userò -unrestricted come sopra. Quando distribuisco i miei script a una macchina dell'utente finale, chiamerò powershell con l'opzione -executionpolicy:

powershell.exe -noprofile -executionpolicy bypass -file .\script.ps1

2
Potresti voler combinare questo trucco con un trucco poliglotta in un file .CMD. Vedere stackoverflow.com/a/8597794/5314
Jay Bazuzi

Bello! Ho implementato sfx's creato da winrar rarlabs.com
MDMoore313,

1
Questo trucco mi ha permesso di eseguire lo script PowerShell da Git Bash (MINGW32 bash)
Kamil Szot,

16

Possiamo ottenere lo stato dell'attuale ExecutionPolicy con il comando seguente:

Get-ExecutionPolicy;

Per impostazione predefinita, è limitato . Per consentire l'esecuzione degli script di PowerShell è necessario impostare questo ExecutionPolicy come Bypass o Senza restrizioni .

È possibile impostare la politica per Utente corrente come Bypasso Unrestrictedusando uno dei comandi PowerShell seguenti:

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force;

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted -Force;

La politica senza restrizioni carica tutti i file di configurazione ed esegue tutti gli script. Se si esegue uno script non firmato che è stato scaricato da Internet, viene richiesta l'autorizzazione prima che venga eseguita.

Considerando che nella politica di bypass , nulla è bloccato e non ci sono avvisi o prompt durante l'esecuzione dello script. Esecuzione del bypass Policy è più rilassato di illimitato.


5

A seconda della versione e della configurazione di Windows, è possibile che venga visualizzato il seguente avviso, anche in Unrestrictedmodalità:

Security warning
Run only scripts that you trust. While scripts from the internet can be useful, this
script can potentially harm your computer. If you trust this script, use the 
Unblock-File cmdlet to allow the script to run without this warning message. 
Do you want to run?
[D] Do not run  [R] Run once  [S] Suspend  [?] Help (default is "D")

La soluzione è utilizzare il criterio "bypass", abilitato con il seguente comando:

Set-ExecutionPolicy Bypass

Dalla documentazione :

Bypass: nulla è bloccato e non ci sono avvisi o prompt.

Questo è ovviamente insicuro, ti preghiamo di comprendere i rischi connessi.


questo è stato l'unico modo in cui sono riuscito a far funzionare il mio script in un ambiente WINE con powershell 2.0. Grazie.
Wyatt8740,

@ Wyatt8740: Perché wine presenta tutte le unità come unità di rete.
Joshua,

@Joshua non ne avevo idea. puoi darmi una fonte per quell'affermazione? ho provato un google casuale, ma ovviamente sto sbagliando.
Wyatt8740,

@ Wyatt8740: Fonte: finestra di dialogo comune Wine OpenFileName. Guarda le icone delle unità.
Giosuè, il

@Joshua intendevo una fonte di codice sorgente; le icone sono probabilmente arbitrarie. Ma non ci avevo pensato; Immagino sia un buon punto di partenza (modifica: non sembra che siano qui .)
Wyatt8740,

2

Una chiave reg con:
Editor del registro di Windows Versione 5.00

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Policies \ Microsoft \ Windows \ PowerShell] "EnableScripts" = dword: 00000001 "ExecutionPolicy" = "Bypass"

e:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell]
"EnableScripts"=dword:00000001 "ExecutionPolicy"="Unrestricted"

funziona davvero anche.


1

Per qualche motivo il cmdlet di PowerShell non ha consentito l'esecuzione locale a livello globale, solo per il contesto dell'utente locale. Se provassi ad avviare uno script Powershell dall'interno del prompt bash di CygWin, ad esempio, che viene eseguito nel proprio contesto utente, non verrà eseguito, dando l'errore "non è firmato digitalmente". La risposta è stata quella di accedere all'editor Criteri di gruppo locali -> Criteri del computer locale -> Modelli amministrativi -> Componenti di Windows -> Windows PowerShell e fare doppio clic su "Attiva esecuzione script". Questo quindi mi consente di cambiarlo in "Abilitato" e quindi di eseguire la politica di "Consenti script locali e script con firma remota" e farlo funzionare a livello globale indipendentemente dal contesto dell'utente.


0

La risposta accettata è corretta, ma la modifica della politica è disponibile solo per l'istanza attualmente in esecuzione di Powershell, il che significa che una volta chiusa l'istanza di Powershell. La politica verrà ripristinata. Se un utente riapre un'altra istanza di Powershell, verrà applicata la politica predefinita che èRestricted

Per me, ho bisogno di usare la console di VisualStudio Code e g ++ da Cygwin per costruire cose. La console sta usando Powershell, con la politica di default, nulla può essere fatto. Una soluzione sta cambiando la politica ogni volta che la console viene attivata nella console del codice di VisualStudio, forse uno script per modificare la politica.

Sono pigro, quindi un'altra soluzione è quando eseguo Powershell in modalità amministratore, simile a quello che fa la risposta accettata. ma con un parametro aggiuntivo che modifica i valori nella tabella Registry. Una volta fatto. Altre istanze di Powershell utilizzeranno la RemoteSignedpolitica per impostazione predefinita.

set-executionpolicy remotesigned -Scope CurrentUser


0

L'impostazione della politica (corretta) è la scelta migliore, ma sui miei sistemi gestiti non ho la possibilità di modificare tale politica.

Per me, la soluzione più semplice per modificare la politica è aprire lo script in "PowerShell ISE" , evidenziare il codice (o parte del codice) da eseguire e quindi fare clic sul pulsante "Esegui selezione" (o utilizzare F8 scorciatoia).

Questa non è la soluzione migliore e fa poco per automatizzare le attività, ma mi consente l'uso e l'utilità di PowerShell mentre non sono in conflitto con il mio dipartimento IS.


-2

Il motivo per cui il tasto reg funziona è perché sta facendo esattamente quello che fanno i comandi PS. I comandi scrivono le modifiche ai tasti reg. I comandi sono molto più veloci e più facili rispetto alla creazione di una chiave reg o alla ricerca nel registro.


1
Questo è semplicemente sbagliato: le chiavi menzionate in altre risposte cambiano la politica di esecuzione dei PowerShell, che consente quindi l'esecuzione dello script PowerShell.
Patrick R.,
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.