Como habilitar a execução de scripts do PowerShell?

260

Quando tento executar meu script do PowerShell, recebo este erro:

O arquivo C: \ Common \ Scripts \ hello.ps1 não pode ser carregado porque a execução de scripts está desativada neste sistema. Por favor, consulte "get-help about_signing" para mais detalhes.
Na linha: 1 char: 13
+. \ Hello.ps1 <<<<
+ CategoryInfo: NotSpecified: (:) [], PSSecurityException
+ FullyQualifiedErrorId: RuntimeException

Pavel Chuchuva
fonte

Respostas:

400
  1. Inicie o Windows PowerShell com a opção "Executar como administrador". Somente membros do grupo Administradores no computador podem alterar a política de execução.

  2. Ative a execução de scripts não assinados digitando:

    set-executionpolicy remotesigned
    

Isso permitirá a execução de scripts não assinados que você escreve no computador local e scripts assinados da Internet.

Consulte também Executando scripts na Microsoft TechNet Library.

Pavel Chuchuva
fonte
3
Isso mudará a diretiva permanentemente ou eu tenho que fazer isso toda vez que reiniciar o computador?
Ray
2
@Ray Isso mudará a política permanentemente.
Pavel Chuchuva
11
@Ray Consulte a documentação . Por padrão, ele define para o LocalMachine. Para definir para outros escopos ( CurrentUserou Process), passe -Scopeexplicitamente.
jpmc26
@PavelChuchuva devo adicionar esta linha em cima do meu roteiro que você quis dizer
FabioSpaghetti 16/07
@FabioSpaghetti Não há necessidade de adicionar nada aos seus scripts. Basta executar esse comando uma vez, seguindo as etapas.
Pavel Chuchuva 17/07
74

A Política de Execução Padrão está definida como restrita. Você pode vê-la digitando:

Get-ExecutionPolicy

Você deve digitar o seguinte para fazê-lo ir para o modo irrestrito:

Set-ExecutionPolicy unrestricted

Espero que isto ajude

William Hilsum
fonte
13
A assinatura exigida faz sentido se você espera que o usuário copie e cole scripts maliciosos da Internet. Se você presume que o usuário não é estúpido, "remotesigned" não adiciona nenhuma segurança e dificulta a vida.
Guss
@ Guss: Ao testar isso, descobri que o RemoteSigned não requer mais arquivos .ps1 gerados localmente para serem assinados, e trata o controle da fonte git como uma fonte local.
Joshua
@ Josué - sim, meu ponto exatamente. Se RemoteSignednão bloqueia copiar e colar, não bloqueia o git ou outros métodos de download que não sejam do IE, para que serve? Diga comigo: "absolutamente nada!". Acho que exigir que os scripts sejam assinados com um certificado de assinatura de código de US $ 100 é inútil, estúpido e nega tudo de bom que uma linguagem de script decente pode fazer pelo Windows. Dito isto, se o caminho a seguir for fazer com que os usuários entendam o que estão fazendo para usar os scripts PS, então talvez estejamos demais ... Nahhhh, isso nunca funcionará ;-)
Guss
@ Guss: Eu já tenho uma boa linguagem de script no Windows. Cygwin funciona muito bem no Windows 10; literalmente muito melhor do que em qualquer versão anterior do Windows. Eu só quero executar scripts que alguém já escreveu.
Joshua
61

Na minha máquina que eu uso para scripts de desenvolvimento, usarei -unrestricted como acima. Entretanto, ao implantar meus scripts em uma máquina de usuário final, chamarei apenas o powershell com a opção -executionpolicy:

powershell.exe -noprofile -executionpolicy bypass -file .\script.ps1
MDMoore313
fonte
2
Convém combinar esse truque com um truque poliglota em um arquivo .CMD. Veja stackoverflow.com/a/8597794/5314
Jay Bazuzi
Agradável! Estou implantando sfx's feitos pelo winrar rarlabs.com
MDMoore313 15/13/13
11
Esse truque me permitiu executar script powershell de Git Bash (Mingw32 bash)
Kamil Szot
16

Podemos obter o status atual da ExecutionPolicy pelo comando abaixo:

Get-ExecutionPolicy;

Por padrão, é restrito . Para permitir a execução de scripts do PowerShell, precisamos definir este ExecutionPolicy como Bypass ou Irrestrito .

Podemos definir a política do Usuário Atual como Bypassou Unrestrictedusando qualquer um dos comandos abaixo do PowerShell:

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

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

A política irrestrita carrega todos os arquivos de configuração e executa todos os scripts. Se você executar um script não assinado que foi baixado da Internet, será solicitada uma permissão antes da execução.

Enquanto na política de desvio , nada é bloqueado e não há avisos ou avisos durante a execução do script. Ignorar ExecutionPolicy é mais relaxado do que Irrestrito.

Pratik Patil
fonte
5

Dependendo da versão e configuração do Windows, você pode receber o seguinte aviso, mesmo no Unrestrictedmodo:

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")

A solução é usar a política "ignorar", habilitada com o seguinte comando:

Set-ExecutionPolicy Bypass

A partir da documentação :

Ignorar: nada está bloqueado e não há avisos ou avisos.

Isso é obviamente inseguro, por favor, entenda os riscos envolvidos.

Benoit Blanchon
fonte
essa foi a única maneira de conseguir que meu script fosse executado em um ambiente WINE com o powershell 2.0. Obrigado.
Wyatt8740
@ Wyatt8740: Porque o wine apresenta todas as unidades como unidades de rede.
Joshua
@ Josué eu não tinha idéia. você pode me dar uma fonte para essa afirmação? Eu tentei um google casual, mas obviamente estou parecendo errado.
Wyatt8740
@ Wyatt8740: Fonte: caixa de diálogo comum Wine OpenFileName. Veja os ícones da unidade.
Joshua
@ Josué, eu quis dizer uma fonte de código fonte; ícones são possivelmente arbitrários. Mas eu não tinha pensado nisso; Eu acho que é um bom lugar para começar: (edit não olha como eles estão aqui .)
Wyatt8740
2

Uma chave de registro com:
Windows Registry Editor Versão 5.00

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

e:

Windows Registry Editor Version 5.00

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

funciona de fato também.

Giesbert Schipper
fonte
1

Por alguma razão, o cmdlet do PowerShell não habilitou a execução local globalmente, apenas para o contexto do usuário local. Se eu tentasse iniciar um script do Powershell a partir do prompt bash do CygWin, por exemplo, que é executado em seu próprio contexto de usuário, ele não seria executado, fornecendo o erro "não está assinado digitalmente". A resposta foi acessar o Editor de Diretiva de Grupo Local -> Diretiva do Computador Local -> Modelos Administrativos -> Componentes do Windows -> Windows PowerShell e clicar duas vezes em 'Ativar Execução de Script'. Isso permite alterar para 'Ativado' e, em seguida, a política de execução de "Permitir scripts locais e scripts assinados remotamente" e fazer com que funcione globalmente, independentemente do contexto do usuário.

Eric Green
fonte
0

A resposta aceita está correta, mas a modificação de política está disponível apenas para a instância atualmente em execução do Powershell, ou seja, quando a instância do Powershell for encerrada. A política será redefinida. Se um usuário reabrir outra instância do Powershell, será aplicada a política padrão que éRestricted

Para mim, preciso usar o console do VisualStudio Code e o g ++ da cygwin para criar coisas. O console está usando o Powershell, com a política padrão, nada pode ser feito. Uma solução é alterar a política toda vez que o console é acionado no console do VisualStudio Code, talvez um script para alterar a política.

Sou preguiçoso, então outra solução é quando executo o Powershell no modo de administrador, semelhante ao que a resposta aceita faz. mas com um parâmetro extra que altera os valores na tabela Registro. Uma vez feito. Outras instâncias do Powershell usarão a RemoteSignedpolítica por padrão.

set-executionpolicy remotesigned -Scope CurrentUser

r0ng
fonte
0

Definir a política (corretamente) é a melhor opção, mas nos meus sistemas gerenciados não tenho a capacidade de alterar essa política.

Para mim, a solução mais simples para alterar a política é abrir o script no "PowerShell ISE" , destacar o código (ou parte do código) a ser executado e clicar no botão "Executar seleção" (ou usar o F8 atalho).

Essa não é a melhor solução e faz pouco para automatizar tarefas, mas me permite o uso e o utilitário do PowerShell enquanto não estou em conflito com meu departamento de SI.

DBADon
fonte
-2

A razão pela qual a chave reg funciona é porque está fazendo exatamente o que os comandos PS fazem. Os comandos escrevem as alterações nas chaves reg. Os comandos são muito mais rápidos e fáceis do que criar uma chave reg ou cavar no registro.

keith
fonte
11
Isso está errado: as chaves mencionadas em outras respostas alteram a política de execução do PowerShells, que permite a execução do script do PowerShell.
Patrick R.