PowerShell afferma che "l'esecuzione di script è disabilitata su questo sistema".


1764

Sto cercando di eseguire un file che chiama a script da cmd.exee sto ottenendo l'errore di seguito:

Management_Install.ps1 non può essere caricato perché l'esecuzione di script è disabilitata su questo sistema.

Ho corso

Set-ExecutionPolicy -ExecutionPolicy Unrestricted

e quando corro Get-ExecutionPolicyda, UnrestrictedTorno.

PS C:\Users\Administrator\> Get-ExecutionPolicy
Unrestricted

C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts\> powershell .\Management_Install.ps1 1

WARNING: Running x86 PowerShell...

File C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts\Management_Install.ps1non può essere caricato perché l'esecuzione di script è disabilitata su questo sistema. Vedi " get-help about_signing" per maggiori dettagli.

Alla riga: 1 carattere: 25

  • .\Management_Install.ps1 <<<< 1

    • CategoryInfo: NotSpecified: (:) [], PSSecurityException

    • FullyQualifiedErrorId: RuntimeException

C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts\> PAUSE

Press any key to continue . . .

Il sistema è Windows Server 2008R2.

Che cosa sto facendo di sbagliato?


3
No, amico mio, ho effettuato l'accesso come amministratore e ho anche eseguito l'esecuzione come "amministratore" e ho ottenuto lo stesso risultato di cui sopra ...
Conor,

2
Arrivato in fondo, l'errore era fuorviante, il problema era nel mio script PowerShell, grazie!
Conor,

Vale la pena sottolineare che i criteri di esecuzione hanno diversi ambiti e l'esecuzione di PowerShell in modi diversi può farti ottenere criteri diversi. Per visualizzare l'elenco dei criteri, eseguire Get-ExecutionPolicy -List.
Pezzi di pancetta

Risposte:


2243

Se si utilizza Windows Server 2008 R2, esiste una versione x64 e x86 di PowerShell che devono avere entrambi i criteri di esecuzione impostati. Hai impostato la politica di esecuzione su entrambi gli host?

Come amministratore , puoi impostare il criterio di esecuzione digitandolo nella finestra di PowerShell:

Set-ExecutionPolicy RemoteSigned

Per ulteriori informazioni, consultare Utilizzo del cmdlet Set-ExecutionPolicy .

Al termine, è possibile ripristinare il criterio sul valore predefinito con:

Set-ExecutionPolicy Restricted

141
Set-ExecutionPolicy Restrictedsembra essere il modo di annullarlo se si desidera ripristinare le autorizzazioni come erano: technet.microsoft.com/en-us/library/ee176961.aspx . Il metodo di bypass temporaneo @Jack Edmondsmi sembra più sicuro:powershell -ExecutionPolicy ByPass -File script.ps1
SharpC,

33
Per una politica più sicura, applicarla all'utente reale: Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
Nuno Aniceto

Set-ExecutionPolicy RemoteSigned non può essere la prima riga dello script. In tal caso, evidenziarlo ed eseguire selezionato INIZIALMENTE prima di eseguire il resto dello script.
ozzy432836,

Mi sono imbattuto in una domanda simile sul sito SF, "Politica di esecuzione di Powershell all'interno di SQL Server", ha chiesto il 10 ottobre 14. Le risposte incluse Get-ExecutionPolicy -Listmi hanno aiutato a vedere i diversi ambiti. Il cmd Get-ExecutionPolicynon mostra tutti gli ambiti. Import-Module SQLPSOra funziona con politiche modificate come segue: {Undefined- Process,MachinePolicy,UserPolicy,}; {RemoteSigned- CurrentUser, LocalMachine}.
SherlockSpreadsheets

Se lo faccio, la modifica dura solo per la durata dell'attuale PowerShell? O è più grande di così?
William Jockusch,

709

È possibile ignorare questo criterio per un singolo file aggiungendolo -ExecutionPolicy Bypassdurante l'esecuzione di PowerShell

powershell -ExecutionPolicy Bypass -File script.ps1

3
Questo è anche molto utile se hai un account non amministratore. Ho creato un collegamento %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPasssulla barra delle applicazioni.
zek19,

3
Si noti che Microsoft Technet lo definisce come "Bypass", non "ByPass". Vedi: technet.microsoft.com/nl-nl/library/hh849812.aspx
Jelle Geerts

1
Questo non funziona per me, mi viene negato lo stesso permesso di come l'avrei chiamato normalmente. type script.ps1 | powershell -Tuttavia, chiamare una ps1 da un .bat funziona.
Some_Guy

8
Lo scopo della Politica di esecuzione è impedire alle persone di fare doppio clic su .ps1e di eseguire accidentalmente qualcosa che non intendevano. Ciò accadrebbe con i .batfile
Kolob Canyon,

Mi salvi la giornata, grazie per la risposta.
Arpit Patel,

163

Ho avuto un problema simile e ho notato che l'impostazione predefinita cmdsu Windows Server 2012 era quella x64.

Per Windows 7 , Windows 8 , Windows 10 , Windows Server 2008 R2 o Windows Server 2012 , eseguire i seguenti comandi come amministratore :

x86 (32 bit)
Apri C:\Windows\SysWOW64\cmd.exe
Esegui il comandopowershell Set-ExecutionPolicy RemoteSigned

x64 (64 bit)
Apri C:\Windows\system32\cmd.exe
Esegui il comandopowershell Set-ExecutionPolicy RemoteSigned

Puoi controllare la modalità usando

  • In CMD: echo %PROCESSOR_ARCHITECTURE%
  • In Powershell: [Environment]::Is64BitProcess

Riferimenti:
MSDN - Criteri di esecuzione di Windows PowerShell
Windows - Spiegazione della directory a 32 bit contro 64 bit


133

La maggior parte delle risposte esistenti spiega il come , ma pochissimi spiegano il perché . E prima di andare in giro eseguendo codice da estranei su Internet, in particolare codice che disabilita le misure di sicurezza, dovresti capire esattamente cosa stai facendo. Quindi ecco un po 'più di dettagli su questo problema.

Dalla pagina Politiche di esecuzione di TechNet :

I criteri di esecuzione di Windows PowerShell consentono di determinare le condizioni in base alle quali Windows PowerShell carica i file di configurazione ed esegue gli script.

I vantaggi di cui sono elencati in PowerShell Basics - Execution Policy and Code Signing sono:

  • Controllo dell'esecuzione : controlla il livello di attendibilità per l'esecuzione degli script.
  • Comando Highjack - Impedisci l'iniezione di comandi nel mio percorso.
  • Identità : lo script è stato creato e firmato da uno sviluppatore di cui mi fido e / o è firmato con un certificato di un'autorità di certificazione di cui mi fido.
  • Integrità : gli script non possono essere modificati da malware o utenti malintenzionati.

Per verificare l'attuale politica di esecuzione, è possibile eseguire Get-ExecutionPolicy. Ma probabilmente sei qui perché vuoi cambiarlo.

Per fare ciò Set-ExecutionPolicyeseguirai il cmdlet.

Avrai due decisioni importanti da prendere quando aggiorni la politica di esecuzione.

Tipo di politica di esecuzione:

  • Restricted - Nessuno script locale, remoto o scaricato può essere eseguito sul sistema.
  • AllSigned - Tutti gli script eseguiti devono essere firmati digitalmente.
  • RemoteSigned - Tutti gli script remoti (UNC) o scaricati devono essere firmati.
  • Unrestricted - Non è richiesta alcuna firma per qualsiasi tipo di script.

Portata del nuovo cambiamento

  • LocalMachine - I criteri di esecuzione riguardano tutti gli utenti del computer.
  • CurrentUser - La politica di esecuzione riguarda solo l'utente corrente.
  • Process - I criteri di esecuzione riguardano solo il processo corrente di Windows PowerShell.

† = Predefinito

Ad esempio : se si desidera modificare il criterio in RemoteSigned solo per CurrentUser, è necessario eseguire il comando seguente:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Nota : per modificare i criteri di esecuzione, è necessario eseguire PowerShell come amministratore . Se si è in modalità normale e si tenta di modificare il criterio di esecuzione, verrà visualizzato il seguente errore:

L'accesso alla chiave di registro "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1 \ ShellIds \ Microsoft.PowerShell" è negato. Per modificare i criteri di esecuzione per l'ambito predefinito (LocalMachine), avviare Windows PowerShell con l'opzione "Esegui come amministratore".

Se si desidera rafforzare le restrizioni interne sui propri script che non sono stati scaricati da Internet (o almeno non contengono i metadati UNC), è possibile forzare il criterio per eseguire solo script firmati. Per firmare i tuoi script, puoi seguire le istruzioni sull'articolo di Scott Hanselman su Firma degli script PowerShell .

Nota : è probabile che molte persone ottengano questo errore ogni volta che aprono Powershell perché la prima cosa che PS tenta di fare all'avvio è eseguire lo script del profilo utente che configura l'ambiente come preferisci.

Il file si trova in genere in:

%UserProfile%\My Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1

È possibile trovare la posizione esatta eseguendo la variabile PowerShell

$profile

Se non c'è nulla di cui ti preoccupi nel profilo e non vuoi agitarti con le tue impostazioni di sicurezza, puoi semplicemente cancellarlo e PowerShell non troverà nulla che non possa eseguire.


8
Sento che è importante notare che mentre la politica di esecuzione è una misura di sicurezza, non è pensata per impedire agli utenti di eseguire il codice PowerShell. La politica di esecuzione è qualcosa che ha lo scopo di proteggere i tuoi script e determinare chi li ha scritti, modificati o approvati e tutto qui. È banale aggirare la politica di esecuzione con qualcosa di semplice come Get-Content .\MyFile.ps1 | powershell.exe -NoProfile -.
Pezzi di pancetta

1
Data l'esistenza di -ExecutionPolicy ByPassperò, qual è lo scopo di questa politica? È solo per impedire agli utenti di aprire accidentalmente una console PowerShell ed eseguire uno script dannoso? L'attaccante non potrebbe semplicemente usare un eseguibile o uno script batch se volesse aggirare questo? Anche dopo aver letto il commento di @BaconBits non sono del tutto sicuro di quale scenario questa politica dovrebbe impedire ...
Ajedi32

2
@ Ajedi32 Dire che ho un'attività che esegue uno script su una condivisione di rete. Quando invoco il mio script, desidero che il mio processo verifichi che lo script sia firmato. Voglio che il mio codice ricontrolli che lo script che eseguirò sia il codice di cui mi fido. Non mi importa se puoi eseguire il mio codice. Interruzione che è lavoro dei diritti di accesso. Voglio solo impedirti di farmi eseguire codice che non ho scritto. Diritti di accesso indicano che il sistema operativo ti impedisce di modificare il mio codice quando sei connesso. La politica di firma e di esecuzione del codice significa che il mio script non è stato modificato quando lo eseguo.
Bacon Bits

40

In Windows 7:

Vai al menu Start e cerca "Windows PowerShell ISE".

Fare clic con il tasto destro sulla versione x86 e selezionare "Esegui come amministratore".

Nella parte superiore, incolla Set-ExecutionPolicy RemoteSigned; eseguire lo script. Scegli "Sì".

Ripetere questi passaggi anche per la versione a 64 bit di Powershell ISE (la versione non x86).

Sto solo chiarendo i passaggi a cui ha accennato @Chad Miller. Grazie Chad!


39

Anche eseguendo questo comando prima che lo script risolva anche il problema:

set-executionpolicy unrestricted

27
-1 - Seguire il principio del minimo permesso. Almeno impostare la politica su RemoteSignedprima di rimuovere tutte le restrizioni sulla politica di sicurezza. Se non funziona, rivaluta quali sono i tuoi punti di dolore e perché non funziona. Puoi impostare unrestrictedcome ultima risorsa, ma non dovrebbe essere il punto di partenza.
KyleMit,

3
Grazie per aver sottolineato anche questa opzione. Con tutto il dovuto rispetto per le esigenze di sicurezza ai fini della produzione, nei tempi in cui la domanda di capacità di prototipazione rapida è così elevata, tutte le politiche e la sicurezza ostacolano davvero le attività.
tishma,

1
Per quanto riguarda il commento sulla prototipazione, temo che questo sia il motivo per cui il codice scadente entra in produzione. Naturalmente questo è solo un esempio banale, ma se non riesci a risolvere qualcosa di così banale durante lo sviluppo, è una preoccupazione per il rilascio. Inoltre, per il codice su misura, e se puoi, conosci l'ambiente di destinazione - impostiamo la maggior parte dei nostri sistemi interni come Remotesigned.
Trix,

33

Se ti trovi in ​​un ambiente in cui non sei un amministratore, puoi impostare la Politica di esecuzione solo per te e non richiederà l'amministratore.

Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "RemoteSigned"

o

Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "Unrestricted"

Puoi leggere tutto al riguardo nella voce di aiuto.

Help Get-ExecutionPolicy -Full
Help Set-ExecutionPolicy -Full

Ha funzionato benissimo per me in Windows 8, anche quando Set-ExecutionPolicy Unrestrictedcome amministratore non sembrava "limitare" abbastanza per aiutare davvero.
Patridge,

1
Ritengo che ciò che potresti riscontrare sia un oggetto Criteri di gruppo o qualcos'altro che sovrascrive la tua impostazione del livello "LocalMachine" di ExecutionPolicy. Non è possibile sovrascrivere ciò che è in atto un criterio di dominio con il comando Set-ExecutionPolicy. Tuttavia, ma impostando il livello di accesso "CurrentUser", tu e solo tu avrai la Politica di esecuzione specificata. Questo perché il computer esamina CurrentUser per i criteri di esecuzione prima di esaminare l'impostazione LocalMachine.
Micah 'Powershell Ninja',

1
Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "Unrestricted" è l'unica soluzione che ha funzionato per me. Grazie
Paulj,

32

RemoteSigned: verranno eseguiti tutti gli script creati dall'utente e tutti gli script scaricati da Internet dovranno essere firmati da un editore di fiducia.

OK, cambia la politica semplicemente digitando:

Set-ExecutionPolicy RemoteSigned

Come raccomandato in altri post: è consigliabile includere "-Scope CurrentUser" per una politica più sicura, quando ciò ha senso.
clusterdude

32

Siamo in grado di ottenere lo stato di corrente ExecutionPolicycon 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. Il bypass ExecutionPolicyè più rilassato di Unrestricted.


4
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force; Un modo rapido e sporco per dire a VS2015 di smettere di lamentarsi ed eseguire la mia sanguinosa sceneggiatura. Grazie. salvavita.
Eon,

1
I punti e virgola finali alle estremità dei comandi sono superflui.
Bill_Stewart,

23

Sto usando Windows 10 e non sono stato in grado di eseguire alcun comando. L'unico comando che mi ha dato alcuni indizi è stato questo:

[64]

  1. Apri C: \ Windows \ SysWOW64 \ cmd.exe [come amministratore]
  2. Esegui il comando> powershell Set-ExecutionPolicy Unrestricted

Ma questo non ha funzionato. Era limitato. Probabilmente nuove politiche di sicurezza per Windows10. Ho avuto questo errore:

Set-ExecutionPolicy: Windows PowerShell ha aggiornato correttamente il criterio di esecuzione, ma l'impostazione è sovrascritta da un criterio definito in un ambito più specifico. A causa dell'override, la shell manterrà la sua attuale politica di esecuzione effettiva di ...

Quindi ho trovato un altro modo ( soluzione ):

  1. Apri Esegui comando / console ( Win+ R)
  2. Tipo: gpedit.msc ( Editor criteri di gruppo )
  3. Passare a Criteri del computer locale -> Configurazione del computer -> Modelli amministrativi -> Componenti di Windows -> Windows Powershell .
  4. Abilita " Attiva esecuzione script "
  5. Imposta la politica come necessario. Ho impostato il mio su " Consenti tutti gli script ".

Ora apri PowerShell e divertiti;)


Si tratta di un'installazione autonoma o sei connesso a un gruppo di lavoro o dominio?
MEMark

Perché aprire cmd per farlo? Basta aprire ISE (come admin) e digitareSet-ExecutionPolicy RemoteSigned
Kolob Canyon,

OMG questo ha finalmente risolto la mia finestra di win10, @kolob set-esecuzionepolicy non è abbastanza
xer0x

Non dovresti usare Unrestricted. È meglio usare la praticaRemoteSigned
Kolob Canyon

@ xer0x dovrebbe essere tutto il tempo che esegui powershell come amministratore
Kolob Canyon

10

L'impostazione della politica di esecuzione è specifica per l'ambiente. Se si sta tentando di eseguire uno script dall'ISE x86 in esecuzione, è necessario utilizzare PowerShell x86 per impostare il criterio di esecuzione. Allo stesso modo, se si esegue ISE a 64 bit, è necessario impostare il criterio con PowerShell a 64 bit.


10

Win+ Re digita il comando copia incolla e premi OK:

powershell Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "RemoteSigned"

Ed esegui la tua sceneggiatura.

Quindi ripristinare le modifiche come:

powershell Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "AllSigned"


5
  1. Apri PowerShell come amministratore ed esegui Set-ExecutionPolicy -Scope CurrentUser
  2. Fornisci RemoteSigned e premi Invio
  3. Esegui Set-ExecutionPolicy -Scope CurrentUser
  4. Fornisci Senza restrizioni e premi Invio

5

puoi provare questo e selezionare l'opzione "Tutto"

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned

3

Nell'editor ISE di PowerShell ho scoperto che l'esecuzione della riga seguente consentiva innanzitutto gli script.

Set-ExecutionPolicy RemoteSigned -Scope Process

2

In PowerShell 2.0, la politica di esecuzione era disabilitata per impostazione predefinita.

Da quel momento in poi, il team di PowerShell ha apportato molti miglioramenti e sono certi che gli utenti non romperanno molto le cose durante l'esecuzione degli script. Quindi, da PowerShell 4.0 in poi, è abilitato per impostazione predefinita.

Nel tuo caso, digita Set-ExecutionPolicy RemoteSigneddalla console di PowerShell e dì si.


2

Ho avuto lo stesso problema oggi. La politica di esecuzione a 64 bit era illimitata, mentre a 32 bit era limitata.

Ecco come modificare solo i criteri a 32 bit in remoto:

Invoke-Command -ComputerName $servername -ConfigurationName Microsoft.PowerShell32 -scriptblock {Set-ExecutionPolicy unrestricted}

2

Vai al percorso del registro HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShelle imposta ExecutionPolicysu RemoteSigned.


1
1. Apri PowerShell come amministratore ed esegui Set-ExecutionPolicy -Scope CurrentUser 2. Fornisci RemoteSigned e premi Invio 3. Esegui Set-ExecutionPolicy -Scope CurrentUser 4. Fornisci senza restrizioni e premi Invio
Ramanujam Allam

2

Ricevo un altro avviso quando provo a correre Set-ExecutionPolicy RemoteSigned

Ho risolto con questi comandi

Set-ExecutionPolicy "RemoteSigned" -Scope Process -Confirm:$false

Set-ExecutionPolicy "RemoteSigned" -Scope CurrentUser -Confirm:$false

1

Se sei qui per eseguirlo con Ruby o Chef e utilizzare `` esecuzione del sistema, esegui come segue:

`powershell.exe -ExecutionPolicy Unrestricted -command [Environment]::GetFolderPath(\'mydocuments\')`

Questo comando serve per ottenere la cartella "MyDocuments".

-ExecutionPolicy Unrestricted fa il trucco.

Spero sia utile per qualcun altro.


Il recinto dovrebbe essere davvero lì?
Peter Mortensen,

1

Diverse risposte indicano una politica di esecuzione. Tuttavia alcune cose richiedono anche "runas administrator". Questo è il più sicuro in quanto non vi è alcuna modifica permanente alla politica di esecuzione e può superare le restrizioni dell'amministratore. Utilizzare con schedtask per avviare un batch con:

    runas.exe /savecred /user:administrator powershell -ExecutionPolicy ByPass -File script.ps1

sia da Jack Edmonds sopra, sia da Peter Mortensen / Dhana di post Come eseguire un'applicazione come "esegui come amministratore" dal prompt dei comandi?


1

Ho trovato che questa linea funzionava meglio per uno dei miei server Windows Server 2008 R2. Un paio di altri non hanno avuto problemi senza questa riga nei miei script PowerShell:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force -Scope Process

1

Aprire la console Powershell come amministratore, quindi impostare il criterio di esecuzione

Set-ExecutionPolicy -ExecutionPolicy Remotesigned 

0

Puoi usare un modo speciale per bypassarlo:

Get-Content "PS1scriptfullpath.ps1" | Powershell-NoProfile -

Inoltra il contenuto dello script PowerShell a PowerShell.exe ed esegue ignorando il criterio di esecuzione.


0

Questo ha risolto il mio problema

Apri il PowerShellcomando di Windows ed esegui la query seguente per modificareExecutionPolicy

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

se chiede confermare le modifiche premere 'Y' e premere invio.


0

Esegui Set-ExecutionPolicy RemoteSignedcomando


0
  1. Apri PowerShell come amministrazione
Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "RemoteSigned"

usa questo comando



-2

Apri la finestra di PowerShell come amministratore . Funzionerà.


Non ha funzionato Tuttavia, l'esecuzione di PowerShell Set-ExecutionPolicy RemoteSigned ha funzionato.
Thronk,
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.