PowerShell: prime configurazioni

Dopo aver installato la RTM di PowerShell in questi giorni stavo iniziando a configurarla.
Appena installata, per default, PowerShell impedisce l'esecuzione di tutti gli script, locali e remoti ed è quindi usabile solo per eseguire i comandi uno per volta da linea di comando.

Questo comportamento è governato dalla variabile ExecutionPolicy che può assumere 4 diversi valori:
- Restriceted:      è il default e impedisce l'esecuzione di
                           script
- AllSigned:         gli script devono essere firmati con
                           Authenticode per essere eseguiti e
                           l'utente deve confermare l'esecuzione
- RemoteSigned: gli script scaricati ed eseguiti da una
                           locazione remota devono essere firmati 
                           con Authenticode
- Unrestricted:    non ci sono restrizioni all'esecuzione di
                           script anche se per gli script scaricati 
                           da remoto viene chiesta conferma
                           prima dell'esecuzione

Per come uso io PowerShell la policy RemoteSigned va benissimo e quindi l'ho impostata con il comando

set-ExecutionPolicy RemoteSigned

Con get-ExecutionPolicy posso sapere la policy attiva.

Posso ora usare usare lo script di impostazione del profilo per configurare l'aspetto e le funzionalità shell.
Lo script di impostazione del profilo è un normale script eseguito all'avvio della shell; il suo nome è Microsoft.PowerShell_profile.ps1 e risiede nel profilo utente nel folder My Documents\WindowsPowerShell (Documents\WindowsPowerShell in Vista).

La prima cosa che ho fatto è stato modificare il prompt di default della shell con uno che mi mostrasse la directory corrente.
Per fare questo si deve definire la funzione prompt e far eseguire a questa il codice necessario a modificare l'aspetto del prompt secondo i propri desideri.
Nel mio caso il ho usato:

function prompt
{
"[" + (get-location).path + "] "
}

Io uso Windows Vista con User Account Control abilitato. Posso quindi lanciare delle shell sia come utente normale sia come utente amministratore.
Mi piace l'idea di impostare automaticamente alcuni aspetti della shell a seconda che sia lanciata da un account normale o da un amministratore.
I due aspetti che voglio cambiare sono il colore dello sfondo e il titolo della finestra. Niente di più semplice, in realtà, tenendo conto che Powershell consente di accedere direttamente a .NET e che mette a disposizione una serie di metodi per la manipolazione della shell attraverso l'oggetto $host.UI.RawUI
Ecco il codice che ho utilizzato:

# Prendo l'identità corrente
$winIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent()
# Creo un oggetto di tipo "Principal" e ne verifico il ruolo. In base al ruolo modifico colore e testo della finesta della shell
$winPrincipal = new-object 'System.Security.Principal.WindowsPrincipal' $winIdentity
if ($winPrincipal.IsInRole("Administrators") -eq 1)
{
$host.UI.RawUI.WindowTitle = $host.UI.RawUI.WindowTitle + “: AMMINISTRATORE“;
$host.UI.RawUI.set_BackgroundColor("darkred")
$host.UI.RawUI.set_ForegroundColor("white")
clear-host
}
else
{
$host.UI.RawUI.WindowTitle = $host.UI.RawUI.WindowTitle + “: Utente normale“;
$host.UI.RawUI.set_BackgroundColor("black")
$host.UI.RawUI.set_ForegroundColor("green")
clear-host
}

Per ultimo ho definito due funzioni (e due alias) per spostarmi velocemente nella mia directory personale e nella root del disco di sistema:

function go-root
{ Set-Location $env:homedrive"\"
}

function go-home
{ Set-Location $home
}

Per oggi ho lavorato abbastanza con PoweShell...

Sotto trovate l'ultima versione del mio profile e ricordate: se non sapete come fare qualcosa in PowerShell questi comandi sono i vostri amici:
man <comando>
man about_*
get-member

Ciao e buona esplorazione di PowerShell

Giorgio

# Giorgio Malusardi 30/11/2006 - 12/12/2006
#
# Profilo personale per PowerShell

#-----------------------------------------------------------------------
# miei alias
#-----------------------------------------------------------------------
set-alias close bye
set-alias getWMI get-WMIObject
set-alias root go-root
set-alias home go-home

#-----------------------------------------------------------------------
# mie funzioni
#-----------------------------------------------------------------------

function prompt { "[" + (get-location).path + "] " }

function go-root { Set-Location $env:homedrive"\" }

function go-home { Set-Location $home }

function bye { exit }

#-----------------------------------------------------------------------
# Codice di configurazione della shell
#-----------------------------------------------------------------------

# Prendo l'identità corrente
$winIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent()
# Creo un oggetto di tipo "Principal" e ne verifico il ruolo: in base al ruolo modifico colore e testo della finesta della shell
$winPrincipal = new-object 'System.Security.Principal.WindowsPrincipal' $winIdentity
if ($winPrincipal.IsInRole("Administrators") -eq 1)
{
$host.UI.RawUI.WindowTitle = $host.UI.RawUI.WindowTitle + “: AMMINISTRATORE“;
$host.UI.RawUI.set_BackgroundColor("darkred")
$host.UI.RawUI.set_ForegroundColor("white")
clear-host
}
else
{
$host.UI.RawUI.WindowTitle = $host.UI.RawUI.WindowTitle + “: Utente normale“;
$host.UI.RawUI.set_BackgroundColor("black")
$host.UI.RawUI.set_ForegroundColor("green")
clear-host
}

root