Set-ExecutionPolicy usando script de lote + script powershell

7

Eu estou trabalhando no meu dotfiles e estou querendo criar um script em lotes que vai fazer alguma configuração inicial para mim quando se muda para um novo computador, como usar psget para instalar módulos, etc ... Eu também gostaria que fosse em frente e mude a minha ExecutionPolicy para algo utilizável.

Eu criei um arquivo em lotes que simplesmente dispara um script PowerShell sob o Bypass ExecutionPolicy:

powershell -ExecutionPolicy ByPass 
           -NoLogo -NoProfile -NoExit 
           -File .\set-policy.ps1

set-policy.ps1 tenta executar o powershell como administrador para alterar a ExecutionPolicy:

Start-Process powershell -verb runas 
  -ArgumentList "-No Exit -Command { Set-ExecutionPolicy Restricted }"

Infelizmente, isso não parece fazer esse truque (saída abaixo). Não tenho certeza qual é o problema.

Set-ExecutionPolicy Restricted
PS C:\windows\system32> Get-ExecutionPolicy
RemoteSigned

Alguma dica sobre como usar um script de lote + script powershell para alterar a política de execução?

Jeff Bridgman
fonte
Parece que pode haver um problema com o uac. Você está executando isso a partir de um prompt de comando elevado?
Stephen Connolly
Sim, e é por isso que quando eu lanço o PowerShell para mudar a política de execução que uso -verb runas que irá abrir o prompt do uac e lançar o powershell como administrador.
Jeff Bridgman

Respostas:

11

O problema é como você está invocando o novo processo do PowerShell; parece estar executando comandos antes que o prompt do PowerShell esteja pronto, para que eles sejam impressos no console; Eu não tenho certeza porque. De qualquer forma, aqui está a correção.

É assim que o arquivo set-policy.ps1 deve aparecer:

Start-Process PowerShell -ArgumentList "Set-ExecutionPolicy Restricted -Force" -Verb RunAs

Ou você pode fazer a coisa toda a partir do arquivo de lote em uma linha como esta:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList 'Set-ExecutionPolicy Restricted -Force' -Verb RunAs}"

Eu forneço um pouco mais de informações sobre como chamar scripts do PowerShell a partir de arquivos em lote e por que você gostaria de fazer isso no meu post aqui .

deadlydog
fonte
1
+1 Esse post é puro ouro! Infelizmente, lidar com o PowerShell é dificultado. Alguém deve ter realmente planejado isso?
akauppi
3

A maneira mais fácil de fazer isso foi editar o registro. Então agora meu arquivo de lote simplesmente contém:

regedit.exe /S EnableScripts.reg

A execução que solicitará automaticamente ao usuário permissões / credenciais, conforme necessário. Minhas EnableScripts.reg arquivo contém apenas o seguinte:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell]
"Path"="C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe"
"ExecutionPolicy"="RemoteSigned"

A configuração do registro acima era suficiente, exceto para a execução do x86 PowerShell (na minha máquina de 64 bits). Isso exigiu definir adicionalmente as chaves de registro abaixo:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell]
"Path"="C:\\Windows\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell.exe"
"ExecutionPolicy"="RemoteSigned"
Jeff Bridgman
fonte