O PowerShell diz que "a execução de scripts está desabilitada neste sistema".

1763

Estou tentando executar um arquivo que chama um script de cmd.exee estou recebendo o erro abaixo:

Management_Install.ps1 não pode ser carregado porque a execução de scripts está desativada neste sistema.

eu corri

Set-ExecutionPolicy -ExecutionPolicy Unrestricted

e quando eu corro Get-ExecutionPolicydeEu Unrestrictedvolto.

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

O arquivo C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts\Management_Install.ps1nã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 caractere: 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 . . .

O sistema é o Windows Server 2008R2.

O que estou fazendo errado?

Conor
fonte
3
No look mate, estou logado como administrador e também executei como "administrador" e obtive o mesmo resultado acima ...
Conor
2
Cheguei ao fundo, o erro era enganoso, o problema estava no meu script do PowerShell, obrigado!
Conor
Vale ressaltar que a Política de Execução possui vários escopos, e a execução do PowerShell de maneiras diferentes pode gerar políticas diferentes. Para visualizar a lista de políticas, execute Get-ExecutionPolicy -List.
Bacon Bits

Respostas:

2242

Se você estiver usando o Windows Server 2008 R2, há as versões x64 e x86 do PowerShell, que precisam ter suas políticas de execução definidas. Você definiu a política de execução nos dois hosts?

Como administrador , você pode definir a política de execução digitando isso na janela do PowerShell:

Set-ExecutionPolicy RemoteSigned

Para obter mais informações, consulte Usando o cmdlet Set-ExecutionPolicy .

Quando terminar, você pode definir a política de volta ao seu valor padrão com:

Set-ExecutionPolicy Restricted
Chad Miller
fonte
141
Set-ExecutionPolicy Restrictedparece ser a maneira de desfazê-lo se você quiser recuperar as permissões como estavam: technet.microsoft.com/en-us/library/ee176961.aspx . O método temporário desvio pela @Jack Edmondsaparência mais seguro para mim:powershell -ExecutionPolicy ByPass -File script.ps1
SharpC
33
Para uma política mais seguro, o escopo para o usuário real: Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
Nuno Aniceto
Set-ExecutionPolicy RemoteSigned não pode ser a primeira linha do seu script. Se estiver, destaque-o e execute a seleção selecionada INICIALMENTE antes de executar o restante do seu script.
ozzy432836
Me deparei com uma pergunta semelhante no site SF, "A política de execução do Powershell no SQL Server" perguntou em 10 de outubro de 14. As respostas incluídas Get-ExecutionPolicy -Listajudaram-me a ver os diferentes escopos. O cmd Get-ExecutionPolicynão mostra todos os escopos. Import-Module SQLPSAgora está trabalhando com políticas alterados da seguinte forma: {Undefined- Process,MachinePolicy,UserPolicy,}; {RemoteSigned- CurrentUser, LocalMachine}.
SherlockSpreadsheets
Se eu fizer isso, a alteração durará apenas a duração do PowerShell atual? Ou é maior que isso?
William Jockusch
709

Você pode ignorar esta política para um único arquivo adicionando -ExecutionPolicy Bypassao executar o PowerShell

powershell -ExecutionPolicy Bypass -File script.ps1
Jack Edmonds
fonte
3
Isso também é realmente útil se você estiver em uma conta de não administrador. Eu fiz um atalho para %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPassna minha barra de tarefas.
Zek19
3
Observe que o Microsoft Technet o estiliza como "Ignorar", não "Ignorar". Consulte: technet.microsoft.com/nl-nl/library/hh849812.aspx
Jelle Geerts
1
Isso não funciona para mim, tenho a mesma permissão negada como se eu chamasse normalmente. Porém, chamar um ps1 de um .bat type script.ps1 | powershell -funciona.
Some_Guy
8
O objetivo da Política de Execução é impedir que as pessoas cliquem duas vezes .ps1e executem acidentalmente algo que não pretendiam. Isso aconteceria com .batarquivos
Kolob Canyon
Você salva meu dia, obrigado pela resposta.
Arpit Patel
163

Eu tive um problema semelhante e observei que o padrão cmdno Windows Server 2012 estava executando o x64.

No Windows 7 , Windows 8 , Windows 10 , Windows Server 2008 R2 ou Windows Server 2012 , execute os seguintes comandos como Administrador :

x86 (32 bits)
Abrir C:\Windows\SysWOW64\cmd.exe
Execute o comandopowershell Set-ExecutionPolicy RemoteSigned

x64 (64 bits)
Abrir C:\Windows\system32\cmd.exe
Execute o comandopowershell Set-ExecutionPolicy RemoteSigned

Você pode verificar o modo usando

  • No CMD: echo %PROCESSOR_ARCHITECTURE%
  • Em Powershell: [Environment]::Is64BitProcess

Referências:
MSDN - Políticas de execução do Windows PowerShell
Windows - explicação de diretório de 32 bits vs 64 bits

Ralph Willgoss
fonte
133

A maioria das respostas existentes explica o Como , mas muito poucas explicam o Por que . E antes de executar o código de estranhos na Internet, especialmente o código que desativa as medidas de segurança, você deve entender exatamente o que está fazendo. Então, aqui está um pouco mais de detalhes sobre esse problema.

Na página TechNet Sobre políticas de execução :

As políticas de execução do Windows PowerShell permitem determinar as condições sob as quais o Windows PowerShell carrega arquivos de configuração e executa scripts.

Os benefícios, conforme enumerados no PowerShell Basics - Política de Execução e Assinatura de Código , são:

  • Controle de execução - controle o nível de confiança para a execução de scripts.
  • Comando Highjack - Impede a injeção de comandos no meu caminho.
  • Identidade - o script é criado e assinado por um desenvolvedor em que confio e / ou assinado com um certificado de uma Autoridade de Certificação em que confio.
  • Integridade - Os scripts não podem ser modificados por malware ou usuário mal-intencionado.

Para verificar sua política de execução atual, você pode executar Get-ExecutionPolicy. Mas você provavelmente está aqui porque deseja mudar isso.

Para fazer isso, você executará o Set-ExecutionPolicycmdlet.

Você terá duas decisões importantes a tomar ao atualizar a política de execução.

Tipo de Política de Execução:

  • Restricted - Nenhum script local, remoto ou baixado pode ser executado no sistema.
  • AllSigned - Todos os scripts executados precisam ser assinados digitalmente.
  • RemoteSigned - Todos os scripts remotos (UNC) ou baixados precisam ser assinados.
  • Unrestricted - Nenhuma assinatura para qualquer tipo de script é necessária.

Escopo da nova mudança

  • LocalMachine - A política de execução afeta todos os usuários do computador.
  • CurrentUser - A política de execução afeta apenas o usuário atual.
  • Process - A política de execução afeta apenas o processo atual do Windows PowerShell.

† = Padrão

Por exemplo : se você deseja alterar a política para RemoteSigned apenas para o CurrentUser, execute o seguinte comando:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Nota : Para alterar a política de execução, você deve estar executando o PowerShell como administrador . Se você estiver no modo regular e tentar alterar a política de execução, receberá o seguinte erro:

O acesso à chave do Registro 'HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1 \ ShellIds \ Microsoft.PowerShell' foi negado. Para alterar a política de execução para o escopo padrão (LocalMachine), inicie o Windows PowerShell com a opção "Executar como administrador".

Se você deseja reforçar as restrições internas dos seus próprios scripts que não foram baixados da Internet (ou pelo menos não contêm os metadados UNC), você pode forçar a política a executar apenas sripts assinados. Para assinar seus próprios scripts, siga as instruções no artigo de Scott Hanselman em Assinando scripts do PowerShell .

Nota : É provável que a maioria das pessoas receba esse erro sempre que abrir o Powershell, porque a primeira coisa que o PS tenta fazer ao iniciar é executar o script de perfil do usuário que configura seu ambiente da maneira que você preferir.

O arquivo normalmente está localizado em:

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

Você pode encontrar o local exato executando a variável powershell

$profile

Se não houver nada com que você se importe no perfil e não queira mexer com suas configurações de segurança, basta excluí-lo e o PowerShell não encontrará nada que ele não possa executar.

KyleMit
fonte
8
Sinto que é importante observar que, embora a política de execução seja uma medida de segurança, ela não visa impedir que os usuários executem o código do PowerShell. A política de execução é algo que visa proteger seus scripts e determinar quem os escreveu, modificou ou aprovou e é tudo. É trivial contornar a política de execução com algo tão simples quanto Get-Content .\MyFile.ps1 | powershell.exe -NoProfile -.
Bacon Bits
1
Dada a existência de -ExecutionPolicy ByPass, no entanto, qual é o objetivo dessa política? É apenas para impedir que os usuários abram acidentalmente um console do PowerShell e executem um script malicioso? O invasor não poderia simplesmente usar um script executável ou em lote se quisesse contornar isso? Mesmo depois de ler @BaconBits comentar eu não tenho certeza do que cenário esta política destina-se a evitar ...
Ajedi32
2
@ Ajedi32 Digamos que tenho uma tarefa que executa um script em um compartilhamento de rede. Quando invoco meu script, desejo que meu processo verifique se o script está assinado. Quero que meu código verifique novamente se o script que eu vou executar é o código que eu confio para executar. Não me importo se você pode executar meu código. Parar esse é o trabalho dos direitos de acesso. Eu só quero impedir que você me faça executar um código que não escrevi. Direitos de acesso significa que o sistema operacional impede que você modifique meu código quando estiver conectado. Assinatura de código e política de execução significa que o meu script não foi modificado quando eu ir para executá-lo.
Bacon Bits
40

No Windows 7:

Vá para o menu Iniciar e procure por "Windows PowerShell ISE".

Clique com o botão direito na versão x86 e escolha "Executar como administrador".

Na parte superior, cole Set-ExecutionPolicy RemoteSigned; execute o script. Escolha "Sim".

Repita estas etapas também para a versão de 64 bits do Powershell ISE (a versão não x86).

Estou apenas esclarecendo as etapas que @Chad Miller deu a entender. Obrigado Chad!

Ryan
fonte
39

A execução desse comando antes do script também resolve o problema:

set-executionpolicy unrestricted
manik sikka
fonte
27
-1 - Siga o princípio da menor permissão. Pelo menos, defina a política como RemoteSignedantes de remover todas as restrições à sua política de segurança. Se isso não funcionar, reavalie quais são seus pontos negativos e por que não está funcionando. Você pode definir unrestrictedcomo último recurso, mas não deve ser o seu ponto de partida.
KyleMit
3
Obrigado por apontar esta opção também. Com todo o respeito às necessidades de segurança para fins de produção, nos momentos em que a demanda por capacidade de prototipagem rápida é tão alta, todas as políticas e segurança realmente atrapalham a execução das tarefas.
Tishma #
1
Quanto ao comentário sobre prototipagem, receio que seja por isso que o código de baixa qualidade entra em produção. Claro que este é apenas um exemplo trivial, mas se você não pode resolver algo tão trivial durante o desenvolvimento, é uma preocupação para o lançamento. Além disso, para código sob medida e, se puder, conheça o ambiente de destino - definimos a maioria de nossos sistemas internos como Remotesigned.
trix
33

Se você estiver em um ambiente em que não seja administrador, poderá definir a Política de Execução apenas para você, e ela não exigirá administrador.

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

ou

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

Você pode ler tudo sobre isso na entrada de ajuda.

Help Get-ExecutionPolicy -Full
Help Set-ExecutionPolicy -Full
Micah 'Ninja Poderoso'
fonte
Funcionou muito bem para mim no Windows 8, mesmo quando Set-ExecutionPolicy Unrestrictedcomo administrador não parecia "irrestrito" o suficiente para realmente ajudar.
patridge
1
Acredito que o que você esteja enfrentando seja um GPO ou outra coisa que substitua sua configuração do nível "LocalMachine" de ExecutionPolicy. Você não pode substituir o que uma diretiva de domínio possui no comando Set-ExecutionPolicy. No entanto, mas definindo o nível de acesso "CurrentUser", você e somente você terá a Política de Execução especificada. Isso ocorre porque o computador verifica a diretiva de execução do CurrentUser antes de verificar a configuração LocalMachine.
Micah 'Powershell Ninja'
1
Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "Unrestricted" é a única solução que funcionou para mim. Obrigado
Paulj
32

RemoteSigned: todos os scripts criados por você serão executados e todos os scripts baixados da Internet precisarão ser assinados por um editor confiável.

OK, altere a política digitando:

Set-ExecutionPolicy RemoteSigned
Jaime
fonte
Conforme recomendado em outras postagens: é aconselhável incluir "-Scope CurrentUser" para uma política mais segura, quando isso fizer sentido.
clusterdude
32

Podemos obter o status atual ExecutionPolicypelo comando abaixo:

Get-ExecutionPolicy;

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

Podemos definir a política para o 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. O desvio ExecutionPolicyé mais descontraído do que Unrestricted.

Pratik Patil
fonte
4
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force; AKA maneira rápida e suja de dizer ao VS2015 para parar de reclamar e executar meu maldito script. obrigado. salva-vidas.
Eon
1
Os pontos e vírgulas à direita nas extremidades de seus comandos são supérfluos.
Bill_Stewart
23

Estou usando o Windows 10 e não consegui executar nenhum comando. O único comando que me deu algumas pistas foi:

[x64]

  1. Abra C: \ Windows \ SysWOW64 \ cmd.exe [como administrador]
  2. Execute o comando> PowerShell Set-ExecutionPolicy Unrestricted

Mas isso não funcionou. Foi limitado. Provavelmente novas políticas de segurança para o Windows10. Eu tive este erro:

Set-ExecutionPolicy: o Windows PowerShell atualizou sua política de execução com êxito, mas a configuração é substituída por uma política definida em um escopo mais específico. Devido à substituição, seu shell manterá sua atual política de execução efetiva de ...

Então eu encontrei outra maneira ( solução ):

  1. Abrir Comando / Console de Execução ( Win+ R)
  2. Tipo: gpedit.msc ( Editor de Diretiva de Grupo )
  3. Vá para Política do Computador Local -> Configuração do Computador -> Modelos Administrativos -> Componentes do Windows -> Windows Powershell .
  4. Ativar " Ativar execução de script "
  5. Defina a política conforme necessário. Defino o meu como " Permitir todos os scripts ".

Agora abra o PowerShell e aproveite;)

hugocabral
fonte
Esta é uma instalação autônoma ou você está conectado a um grupo de trabalho ou domínio?
MEMark
Por que abrir o cmd para fazer isso? Basta abrir o ISE (como administrador) e digitar #Set-ExecutionPolicy RemoteSigned
Kolob Canyon
OMG este, finalmente, fixa minha caixa win10, @kolob set-executionpolicy não é suficiente
xer0x
Você não deveria estar usando Unrestricted. É melhor usarRemoteSigned
Kolob Canyon
@ xer0x deve ser tão longo como você correr PowerShell como um administrador
Kolob Canyon
10

A definição da política de execução é específica do ambiente. Se você estiver tentando executar um script a partir do x86 ISE em execução, precisará usar o x86 PowerShell para definir a política de execução. Da mesma forma, se você estiver executando o ISE de 64 bits, precisará definir a política com o PowerShell de 64 bits.

ScriptAholic
fonte
10

Win+ Re digite o comando copy paste e pressione OK:

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

E execute seu script.

Em seguida, reverta alterações como:

powershell Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "AllSigned"
Qamar
fonte
10

Você também pode ignorar isso usando o seguinte comando:

PS > powershell Get-Content .\test.ps1 | Invoke-Expression

Você também pode ler este artigo de Scott Sutherland, que explica 15 maneiras diferentes de ignorar o PowerShell Set-ExecutionPolicyse você não tiver privilégios de administrador:

15 maneiras de ignorar a política de execução do PowerShell

Alexander Sinno
fonte
Este é provavelmente um dos guias mais interessantes para solucionar problemas e entender essa restrição.
Osvaldo Mercado
5
  1. Abra o PowerShell como administrador e execute Set-ExecutionPolicy -Scope CurrentUser
  2. Forneça RemoteSigned e pressione Enter
  3. Execute Set-ExecutionPolicy -Scope CurrentUser
  4. Forneça sem restrições e pressione Enter
Ramanujam Allam
fonte
5

você pode tentar isso e selecionar a opção "Todos"

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
Taqi Raza Khan
fonte
3

No editor do PowerShell ISE , encontrei a execução da seguinte linha, primeiro dos scripts permitidos.

Set-ExecutionPolicy RemoteSigned -Scope Process
David Douglas
fonte
2

No PowerShell 2.0, a política de execução foi definida como desativada por padrão.

A partir de então, a equipe do PowerShell fez muitas melhorias e está confiante de que os usuários não quebrarão muito as coisas ao executar scripts. Portanto, a partir do PowerShell 4.0, ele é ativado por padrão.

No seu caso, digite Set-ExecutionPolicy RemoteSignedno console do PowerShell e diga sim.

Adil Arif
fonte
2

Eu tive o mesmo problema hoje. A política de execução de 64 bits era irrestrita, enquanto a de 32 bits era restrita.

Veja como alterar remotamente apenas a política de 32 bits:

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

Vá para o caminho do registro HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShelle defina ExecutionPolicycomo RemoteSigned.

sunish surendran.k
fonte
1
1. Abra o PowerShell como administrador e executar Set-ExecutionPolicy -Scope CurrentUser 2. Fornecer RemoteSigned e pressione Enter 3. Execute Set-ExecutionPolicy -Scope CurrentUser 4. Fornecer irrestrito e pressione Enter
Ramanujam Allam
2

Recebo outro aviso quando tento executar Set-ExecutionPolicy RemoteSigned

Eu resolvi com esses comandos

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

Set-ExecutionPolicy "RemoteSigned" -Scope CurrentUser -Confirm:$false
George C.
fonte
1

Se você está aqui por executá-lo com Ruby ou Chef e usar `` a execução do sistema, execute o seguinte:

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

Esse comando é para obter a pasta "MyDocuments".

-ExecutionPolicy Unrestricted faz o truque.

Espero que seja útil para outra pessoa.

JGutierrezC
fonte
O anexo `` realmente deve estar lá?
Peter Mortensen
1

Várias respostas apontam para a política de execução. No entanto, algumas coisas também exigem "administrador de runas". Isso é mais seguro, pois não há alteração permanente na política de execução e pode passar pelas restrições do administrador. Use com o schedtask para iniciar um lote com:

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

de Jack Edmonds acima e Peter Mortensen / Dhana da postagem Como executar um aplicativo como "executar como administrador" no prompt de comando?

Kirt Carson
fonte
1

Eu achei que essa linha funcionava melhor para um dos meus servidores Windows Server 2008 R2. Alguns outros não tiveram problemas sem essa linha nos meus scripts do PowerShell:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force -Scope Process
WIlliamT
fonte
1

Abra o console do Powershell como administrador e defina a política de execução

Set-ExecutionPolicy -ExecutionPolicy Remotesigned 
lokeshbandharapu
fonte
0

Você pode usar uma maneira especial de ignorá-lo:

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

Ele canaliza o conteúdo do script powershell para powershell.exe e o executa ignorando a política de execução.

Wasif Hasan
fonte
0

Isso resolveu meu problema

Abra o PowerShellComando do Windows e execute a consulta abaixo para alterarExecutionPolicy

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

se solicitar alterações, pressione 'Y' e pressione enter.

Arvind Chourasiya
fonte
0

Executar Set-ExecutionPolicy RemoteSignedcomando

maxxi
fonte
0
  1. PowerShell aberto como administração
Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "RemoteSigned"

use este comando

MD SHAYON
fonte
-1

Abra o cmd em vez do PowerShell. Isso me ajudou ...

Jelmer Jellema
fonte
-2

Abra a janela do PowerShell como administrador . Vai funcionar.

Suganthan Raj
fonte
Não deu certo. No entanto, a execução do PowerShell Set-ExecutionPolicy RemoteSigned funcionou.
Thronk