21/06/2017 | por Igor Abade | Em Técnico | Tags PowerShell, Windows | Comentários

Solarized, PowerShell e prompt elevado

Inspirado pelo post do Scott Hanselman sobre o Solarized, resolvi fazer algumas alterações na minha configuração do PowerShell.

Se você não leu o post do Scott, faça isso agora. Eu espero. ?

Agora, eis o que eu queria fazer:

Já há muito tempo que havia configurado meu PowerShell para mostrar o prompt elevado (“modo Administrador”) com uma cor diferente, para ficar fácil de distinguir e evitar executar comandos perigosos no lugar errado.

Para isso, eu tinha o seguinte comando no meu perfil do PowerShell:

1
<code class="language-PowerShell">if (Test-IsAdmin) { $host.UI.RawUI.BackgroundColor = [System.ConsoleColor]::DarkRed Clear-Host } </code>

A função Test-Admin acima não existe no PowerShell. Ela serve para ver se o prompt está elevado ou não. O código dela (que coloquei também no meu perfil do PowerShell) é:

1
<code class="language-PowerShell">Function Test-IsAdmin { $identity = [Security.Principal.WindowsIdentity]::GetCurrent() $principal = New-Object Security.Principal.WindowsPrincipal $identity return $principal.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator) } </code>

O que essa função faz é verificar se o token do usuário atual contém o grupo Administrators. Isso só acontece num processo elevado (ou se o UAC estiver desligado). Nesse caso, mudo a cor de fundo da tela para vermelho e apago a tela para aplicar a alteração.

Mudando para Solarized

Com a inspiração do post do Scott, resolvi adotar o Solarized no meu PowerShell. A ideia era usar o tema escuro para o prompt normal, enquanto o tema claro substituiria meu prompt vermelho para o terminal elevado/administrativo.

O processo para isso tem três partes:

1) Mudar a configuração padrão do CMD

Primeira coisa a fazer. Configure o default do CMD - você pode precisar para as situações (raras) em que você roda o PowerShell a partir do CMD. Além disso, dá uma certa consistência aos meus terminais (CMD e PS ficam com a mesma cor).

Para isso, importe o arquivo solarized-dark.reg no seu Windows. Isso faz com que a cor-padrão do seu console seja a definida no Solarized Dark.

2) Alterar seu perfil do PowerShell

A segunda parte da configuração precisa ser feita no perfil do PowerShell. Com ela, cada vez que um prompt é aberto ele carrega as cores do Solarized. Baixe os arquivos Set-SolarizedDarkColorDefaults.ps1 e Set-SolarizedLightColorDefaults.ps1 na mesma pasta do seu perfil do PowerShell (tipicamente C:\Users\<usuário>\Documents\WindowsPowerShell).

Agora, acrescente o código abaixo ao início do seu arquivo de perfil (tipicamente C:\Users\<usuário>\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1):

1
<code class="language-PowerShell">Function Test-IsAdmin { $identity = [Security.Principal.WindowsIdentity]::GetCurrent() $principal = New-Object Security.Principal.WindowsPrincipal $identity return $principal.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator) } try { if (Test-IsAdmin) { . (Join-Path $PSScriptRoot "Set-SolarizedLightColorDefaults.ps1") $host.UI.RawUI.BackgroundColor = [System.ConsoleColor]::White } else { . (Join-Path $PSScriptRoot "Set-SolarizedDarkColorDefaults.ps1") $host.UI.RawUI.BackgroundColor = [System.ConsoleColor]::Black } } finally { Clear-Host } </code>

Agora, para o Solarized realmente “funcionar”, você precisa atualizar os links do PowerShell que estão na pasta %APPDATA%\Microsoft\Windows\Start Menu\Programs\Windows PowerShell, de modo que eles usem as cores do Solarized. Baixe os scripts Get-Link.ps1 e Update-Link.ps1, abra um prompt de PowerShell no diretório onde você salvou esses scripts e execute os comandos abaixo:

1
<code class="language-PowerShell">$links = Get-ChildItem (Join-Path $env:APPDATA 'Microsoft\Windows\Start Menu\Programs\Windows PowerShell') -Filter '*.lnk' $links | % {.\Update-Link.ps1 -Path $_.FullName -Theme Dark} </code>

Voilà! Prompts de PowerShell atualizados - Dark para os prompts normais, Light para os elevados!

Um abraço,
Igor