Por que meu script criado localmente não tem permissão para ser executado sob a política de execução RemoteSigned?

106

Como essa pergunta continua a atrair respostas que são refutadas pelo corpo da pergunta ou não abordam o problema real, leia este resumo simples do que você precisa saber:

  • Isso não é um "Por que minha instalação padrão do PowerShell não executa scripts?" questão.
  • Isso não é um "Por que minha instalação do PowerShell não executa scripts baixados da Internet?" questão.
  • A questão é por que a RemoteSignedpolítica de execução está impedindo a execução do script, quando não deveria.
  • RemoteSignedé a única política de execução que desejo usar. Estou ciente de que outras políticas menos restritivas estão disponíveis. Se essas políticas fossem substitutos aceitáveis, eu simplesmente os teria usado e esta pergunta não existiria.
  • A política de execução está definida para RemoteSigned. Mudar de RemoteSignedpara RemoteSignednão é uma solução.
  • O arquivo de script é criado e armazenado localmente.
  • O arquivo de script não está bloqueado. O arquivo de script nunca foi bloqueado (veja o ponto anterior).
  • O arquivo de script não pode ser desbloqueado porque não há nada para desbloquear (veja o ponto anterior).
  • O arquivo de script é (tentou-se) executado por um administrador.
  • Windows PowerShellé o único aplicativo envolvido. Nem, Windows PowerShell ISEnem Command Promptquaisquer outras ferramentas ou editores são relevantes.
  • A causa do problema foi identificada (ver resposta aceita). Depois de quase 8 anos, acho que todas as outras explicações óbvias, aplicáveis ​​ou não, também foram postadas. Se você pensa de outra forma , leia a pergunta e as respostas existentes na íntegra antes de adicionar as suas.

Estou usando o Windows PowerShell 2.0 no Windows 7 Professional de 64 bits. Tenho um script no meu Desktopque causa o seguinte erro quando tento executá-lo:

File C:\Users\UserName\Desktop\Script.ps1 cannot be loaded. The file C:\Users\UserName\Desktop\Script.ps1 is not digitally signed. The script will not execute on the system.  Please see "get-help about_signing" for more details..
At line:1 char:54
+ C:\Users\UserName\Desktop\TestGetWindowsUpdateLog.ps1 <<<<
    + CategoryInfo          : NotSpecified: (:) [], PSSecurityException
    + FullyQualifiedErrorId : RuntimeException

Sou administrador de domínio e administrador local e, se executar Get-ExecutionPolicy -List, posso ver que o Group Policy Objectque criei para configurar o PowerShell está aplicando corretamente a RemoteSignedpolítica de execução no nível da máquina:

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy    RemoteSigned
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine       Undefined

Eu criei o script me em Notepad, e usou os Sysinternals ' streamsutilidade e o arquivo Propertiesde diálogo para confirmar que o script não está sendo tratado como tendo chegado a partir da internet. Se eu copiar o script para um compartilhamento de rede em um servidor de domínio, ele terá permissão para ser executado. Se eu executar Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine, o script local ainda não MachinePolicyterá permissão para ser executado, o que faz sentido, pois a política de execução no escopo terá precedência.

Conforme documentado por about_Execution_Policies( atual ; no momento da questão ), a RemoteSignedpolítica significa:

  • Os scripts podem ser executados.

  • Requer uma assinatura digital de um editor confiável em scripts e arquivos de configuração baixados da Internet (incluindo programas de e-mail e mensagens instantâneas).

  • Não requer assinaturas digitais em scripts que você executou e que escreveu no computador local (não baixado da Internet).

  • Riscos de execução de scripts não assinados de fontes diferentes da Internet e scripts assinados, mas mal-intencionados.

Meu script não é assinado, mas como é criado e executado localmente, ele deve atender ao terceiro ponto acima. Portanto...

  • Por que meu script não está autorizado a ser executado?
  • Por que o PowerShell reclama que meu script "não está assinado digitalmente" quando esse requisito deveria se aplicar apenas a arquivos da Internet?
  • Por que o PowerShell não se preocupa mais com o fato de o script não ser assinado quando é executado em um compartilhamento de rede?
Lance U. Matthews
fonte
1
@Downvoter: dá um motivo para isso?
Lance U. Matthews

Respostas:

124

Algumas coisas para verificar:

Você pode mudar para irrestrito?

Set-ExecutionPolicy Unrestricted

A política de grupo está definida?

  • Computer Configuration\Administrative Templates\Windows Components\Windows PowerShell
  • User Configuration\Administrative Templates\Windows Components\Windows PowerShell

Além disso, como você está chamando Script.ps1?

Isso permite que ele seja executado?

powershell.exe -executionpolicy bypass -file .\Script.ps1
Andy Arismendi
fonte
O valor padrão do Scopeparâmetro é LocalMachine, portanto, Set-ExecutionPolicy Unrestrictedé efetivamente o mesmo que Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachineeu já experimentei. Sim, a Turn on Script Executionpolítica está habilitada para Computer Configuration. PowerShellabre para C:\Users\UserName, então apenas executo .\Desktop\Script.ps1o prompt. Usar o caminho absoluto produz o mesmo erro, assim como chamar o script via powershell.exe.
Lance U. Matthews
Você já tentou desativar a configuração da política de grupo e atualizar com gpupdate /force? (Reinicie o PowerShell.exe depois)
Andy Arismendi
Bem, por um longo tempo eu estava executando como Unrestrictedno LocalMachineescopo, mas quando comecei a escrever scripts eu queria executar de outros computadores, LocalMachineretornei Undefinede adicionei a Política de Grupo atual para definir RemoteSignedno MachinePolicyescopo. Este é apenas um script de teste único e não é grande coisa executá-lo a partir da rede. Só quero saber por que ele não funciona localmente. Afinal, um script criado localmente deve ter permissão para ser executado RemoteSigned, certo? Só pensei que deve haver algo que estou perdendo ou não estou entendendo.
Lance U. Matthews
@BACON Você está correto sobre RemoteSignedsalvar Write-Host hicom o bloco de notas em sua área de trabalho. Sua configuração também parece boa ... Algo parece estar quebrado para mim ... por isso sugeri remover a política de grupo para ver se isso ajuda.
Andy Arismendi
1
Para o desenvolvimento, costumávamos -executionpolicy bypasssuperar temporariamente o problema remotamente atribuído ... e isso nos permitiu descobrir e depurar outros problemas (não relacionados, que exigiam que atualizássemos o PowerShell).
Doug_Ivison
124

O arquivo está sendo bloqueado? Eu tive o mesmo problema e consegui resolvê-lo clicando com o botão direito do mouse no arquivo .PS1, Propriedades e escolhendo Desbloquear.

O-Dogg
fonte
1
Como expliquei, o script está sendo criado diretamente no meu disco rígido (não baixado de nenhum lugar) e confirmei que não há fluxos alternativos que o identifiquem como originário de uma zona diferente (como o Internet Explorer e outros navegadores da Web criam). Se eu executar 'Write-Host ''Hello, World!'';' > .\Test.ps1; .\Test.ps1;, ainda recebo o erro de que o script não está assinado digitalmente e não foi executado. Se eu abrir a caixa de diálogo Propriedades do arquivo recém-criado, não há nada para desbloquear.
Lance U. Matthews
50
O que você quer dizer com ~ " Propriedades e escolher Desbloquear "?
IgorGanapolsky
1
@IgorGanapolsky eles querem dizer no Explorer, encontre o ps1arquivo, clique com o botão direito sobre ele para abrir o menu de contexto e escolha Properties, na primeira guia perto do final, ele dirá que o arquivo está bloqueado e permitirá que você marque uma caixa de seleção para desbloqueá-lo.
user692942
1
Observe que se você baixou um arquivo zip, deve desbloquear o arquivo zip antes de extraí-lo para evitar o desbloqueio em massa de todos os arquivos dentro dele.
Ohad Schneider
15
@Lankymart Windows 10, tentei fazer isso, não diz que está bloqueado.
Alan Baljeu
15

Finalmente rastreei isso até o .NET Code Access Security . Tenho alguns módulos binários desenvolvidos internamente que são armazenados e executados a partir de um compartilhamento de rede. Para que o .NET 2.0 / PowerShell 2.0 os carregue, eu adicionei uma regra de URL ao Intranetgrupo de código para confiar nesse diretório:

PS> & "$Env:SystemRoot\Microsoft.NET\Framework64\v2.0.50727\caspol.exe" -machine -listgroups
Microsoft (R) .NET Framework CasPol 2.0.50727.5420
Copyright (c) Microsoft Corporation.  All rights reserved.

Security is ON
Execution checking is ON
Policy change prompt is ON

Level = Machine

Code Groups:

1.  All code: Nothing
    1.1.  Zone - MyComputer: FullTrust
        1.1.1.  StrongName - ...: FullTrust
        1.1.2.  StrongName - ...: FullTrust
    1.2.  Zone - Intranet: LocalIntranet
        1.2.1.  All code: Same site Web
        1.2.2.  All code: Same directory FileIO - 'Read, PathDiscovery'
        1.2.3.  Url - file://Server/Share/Directory/WindowsPowerShell/Modules/*: FullTrust
    1.3.  Zone - Internet: Internet
        1.3.1.  All code: Same site Web
    1.4.  Zone - Untrusted: Nothing
    1.5.  Zone - Trusted: Internet
        1.5.1.  All code: Same site Web

Observe que, dependendo de quais versões do .NET estão instaladas e se é Windows de 32 ou 64 bits, caspol.exepodem existir nos seguintes locais, cada um com sua própria configuração de segurança ( security.config):

  • $Env:SystemRoot\Microsoft.NET\Framework\v2.0.50727\
  • $Env:SystemRoot\Microsoft.NET\Framework64\v2.0.50727\
  • $Env:SystemRoot\Microsoft.NET\Framework\v4.0.30319\
  • $Env:SystemRoot\Microsoft.NET\Framework64\v4.0.30319\

Após excluir o grupo 1.2.3....

PS> & "$Env:SystemRoot\Microsoft.NET\Framework64\v2.0.50727\caspol.exe" -machine -remgroup 1.2.3.
Microsoft (R) .NET Framework CasPol 2.0.50727.9136
Copyright (c) Microsoft Corporation.  All rights reserved.

The operation you are performing will alter security policy.
Are you sure you want to perform this operation? (yes/no)
yes
Removed code group from the Machine level.
Success

... Fico com a configuração CAS padrão e os scripts locais agora funcionam novamente. Já faz um tempo que não mexi no CAS e não tenho certeza de por que minha regra parece interferir nas concessões FullTrustpara MyComputer, mas como o CAS está obsoleto a partir do .NET 4.0 (no qual o PowerShell 3.0 é baseado), eu acho que é um ponto discutível agora.

Lance U. Matthews
fonte
Como você adicionou uma regra de URL? Eu tive o mesmo problema e espero que isso possa me ajudar a resolvê-lo. Obrigado.
OptimusPrime
Já faz muito tempo que trabalho com caspol.exe, mas depois de correr caspol.exe -machine -addgroup 1.2 -url file://Server/Share/Directory/WindowsPowerShell/Modules/* FullTrustacabei com a mesma 1.2.3.regra vista nesta resposta. Eu estava usando um file://URL para fazer referência a um diretório em um compartilhamento SMB, embora eu veja na documentação que um dos -addgroup exemplos usa um caminho UNC.
Lance U. Matthews,
12

Descobri ao executar um arquivo PS1 para uma unidade mapeada para o Dropbox que sempre recebo esse erro. Ao abrir propriedades para o PS1 não há "Desbloquear".

A única coisa que funciona para mim é

powershell.exe -executionpolicy bypass -file. \ Script.ps1

GeekMustHave
fonte
1
Você está dizendo que seu script está armazenado em uma unidade mapeada para um compartilhamento de rede? Ou o script cria uma unidade mapeada? No primeiro caso, como consta no corpo e no título da pergunta, o script foi criado e armazenado localmente, de modo que a origem / zona do script não seria um fator. De qualquer forma, o uso da Bypasspolítica de execução já foi sugerido há mais de cinco anos e até cinco meses atrás . Leia a pergunta e as respostas existentes antes de responder.
Lance U. Matthews
6

Se o arquivo for copiado de um local de rede, ou seja, outro computador, o Windows pode ter bloqueado esse arquivo. Clique com o botão direito no arquivo e clique no botão desbloquear e veja se funciona.

tímido
fonte
2
Conforme expliquei na pergunta e no meu comentário sobre a resposta de @O-Dogg, o script estava sendo criado diretamente no meu disco rígido (não baixado de nenhum lugar) e confirmei que não havia fluxos alternativos identificando-o como originário de uma zona diferente (como o Internet Explorer e outros navegadores da web criam). Se eu executei 'Write-Host ''Hello, World!'';' > .\Test.ps1; .\Test.ps1;, ainda recebo o erro de que o script não foi assinado digitalmente e não foi executado. Se eu abrisse a caixa de diálogo Propriedades do arquivo recém-criado, não havia nada para desbloquear.
Lance U. Matthews
Vale a pena verificar se você não está criando e executando-o em uma unidade mapeada. Em nossos servidores, por exemplo, a pasta pessoal de cada usuário é uma unidade mapeada para sua pasta pessoal.
Caltor
0

Este é um problema do IDE. Altere a configuração na GUI do PowerShell. Vá para a guia Ferramentas e selecione Opções e, em seguida, Opções de depuração . Em seguida, marque a caixa Desativar requisito para scripts a serem assinados . Feito.

bdubb
fonte
O OP claramente não deseja que os scripts sejam executados sem assinatura e não faz referência ao IDE.
kfsone de
1
Não disponível no Powershell ISE
Josh Noe
0

O que funcionou para mim foi clicar com o botão direito no arquivo .ps1 e depois em Propriedades. Clique no botão "DESBLOQUEAR". Funciona muito bem para mim depois de passar horas tentando mudar as políticas.

Mo Zaatar
fonte
1
Já existem duas respostas que ignoram o que é dito na pergunta e sugerem esta mesma solução inaplicável. Eu escrevi muito claramente "Eu ... usei o utilitário streams do Sysinternals e a caixa de diálogo Propriedades do arquivo para confirmar que o script não está sendo tratado como vindo da Internet" e então "ele é criado e executado localmente". Diz mesmo no título que o script é "criado localmente". Não há nada para desbloquear. Se o desbloqueio do seu script resolveu o seu problema, então você não teve o mesmo problema que eu tive porque, conforme dito, meu script não foi bloqueado. -1.
Lance U. Matthews de
1
@BACON para ser justo, eu tive os mesmos sintomas que você e para mim o desbloqueio funcionou. Ainda pensei que o meu script foi criado localmente, eu tive que desbloqueá-lo cada vez que após salvá-lo.
SQB
Esta é talvez uma solução alternativa, mas não a solução totalmente correta
Mo Zaatar,
@SQB Só por curiosidade, você tinha um perfil de roaming?
Robert Talada
0

Faça um backup do arquivo script.bs1

O que funcionou para mim foi excluir o arquivo script.bs1 e executar o comando de execução.

Abstração Simples
fonte
1
Qual é a mensagem de erro que você estava recebendo que foi resolvida ao fazer isso?
Lance U. Matthews
Já passei por esse erro 2 vezes diferentes e corrijo-o da mesma maneira. Parece que a execução do comando de execução do CMD será executada imediatamente no outro arquivo com o mesmo nome, mas com a extensão (.cmd).
Simple Abstraction
O arquivo C: \ Users \ UserName \ Desktop \ Script.ps1 não pode ser carregado. O arquivo C: \ Users \ UserName \ Desktop \ Script.ps1 não está assinado digitalmente. O script não será executado no sistema. ((Erro de script.ps1 não assinado digitalmente))
Abstração simples de
Eu vejo. E o que é retornado quando você corre Get-ExecutionPolicy -List?
Lance U. Matthews
MachinePolicy AllSigned, UserPolicy Undefined, Process Undefined, CurrentUser RemoteSigned, LocalMachine Bypass
Abstração simples
0

Ao executar um script .ps1 PowerShell, você pode receber a mensagem “.ps1 não está assinado digitalmente. O script não será executado no sistema. ” Para corrigir, você deve executar o comando abaixo para executar Set-ExecutionPolicy e alterar a configuração da Política de Execução.

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
Gautam Sharma
fonte
Outra resposta já sugere o uso da Bypasspolítica de execução. Usar uma política diferente não é útil, de qualquer forma, e não resolve o problema real se RemoteSignedrealmente for o que é necessário. Por fim, a mensagem de erro a que você se refere não é a mesma da pergunta.
Lance U. Matthews
-1

Selecione o prompt de comando do terminal em vez do Power shell. Isso deve funcionar.

pranav aggarwal
fonte
2
O que isso significa? Selecione onde? O objetivo era executar um script do PowerShell no PowerShell, portanto, usar qualquer coisa diferente do PowerShell não funcionaria.
Lance U. Matthews
Eu tive o mesmo erro ao tentar executar o AWS Amplify CLI. Executar o comando amplify do Terminal WIndows em vez do PowerShell parecia fazê-lo funcionar.
symbiotech
-2

Eu estava tendo o mesmo problema e corrigi-lo alterando o programa padrão para abrir arquivos .ps1 para PowerShell. Foi definido como Bloco de notas .

Cara novo
fonte
Você teve esse mesmo problema? Ou quando você clica duas vezes em um .ps1arquivo, ele o abre no Bloco de notas em vez de executar o script no PowerShell?
Lance U. Matthews
-2

Tente executar a interface do Powershell como administrador

Pauline
fonte
3
Conforme declarado na pergunta I am both a domain administrator and a local administrator,. Executar o PowerShell elevado não faria diferença, pois o script podia ser executado sem elevação quando armazenado em um compartilhamento de rede.
Lance U. Matthews
-5

Execute abaixo de 2 comandos na janela do PowerShell

  1. Set-ExecutionPolicy irrestrito

  2. Unblock-File -Path D: \ PowerShell \ Script.ps1

Rakesh Dongarwar
fonte
2
É claro que você não leu a pergunta ou as outras respostas de anos atrás que propõem variações desta mesma solução inaplicável ou meus comentários afirmando repetidamente que esta não é a resposta. Eu faria -10 isso se pudesse, mas, em vez disso, terei que me contentar com -1.
Lance U. Matthews
@BACON Agreed.lol
Robert Talada