La virtualizzazione dei file e del registry di Vista
(post ad alto contenuto tecnico)
Uno dei grattacapi di appcompat da risolvere per il rilascio di Vista è legato all'implementazione di UAC e al fatto che le applicazioni scritte per Windows XP, essendo eseguite di solito con permessi di amministratore, si potevano permettere di scrivere un po' ovunque nel file system. Il classico esempio è quello delle applicazioni che memorizzano i dati dell'utente direttamente nella directory C:\program files\applicazione
Per risolvere questo annoso problema in Vista è stato introdotto il concetto di "virtualizzazione dei file" (da non confondersi con la virtualizzazione via Virtual PC e similari). La virtualizzazione dei file può essere attivata o meno per ogni singolo processo. È possibile controllare se la virtualizzazione è attiva via Task Manager, avendo l'accortezza di aggiungere la colonna virtualizzazione a quanto attivo: per fare ciò selezionare il menù View/Select Columns e spuntare la voce virtualizzazione:
Di lì comparirà in task manager la colonna virtualizzazione per ogni processo (clicca per ingrandire):
È possibile quindi attivare/disattivare la virtualizzazione cliccando sul processo via tasto destro del mouse:
Due parole su cosa vuol dire virtualizzazione dei file: quando la virtualizzazione dei file per un processo è abilitata, tutte le operazioni di scrittura presso folder "proibiti" (%ProgramFiles%, %ProgramData%, and %SystemRoot%) vengono redirezionate presso il folder %LocalAppData%\VirtualStore. Cioè una applicazione virtualizzata cerca di creare e scrivere il file C:\windows\readme.txt, il file verrà creato come %LocalAppData%\VirtualStore\readme.txt
Come per ogni ogni regola, ci sono le eccezioni: vengono escluse da questo tipo di redirezione alcune sottodirectory ed i file target di tipo .EXE, .BAT, .SCR ed altri. Il motivo è semplice: se un processo cerca di sovrascrivere un eseguibile o similare, ci sono alte probabilità che si tratti di un updater e cioé un processo che cerca di aggiornare una applicazione.
È possibile aggiungere altre estensioni delle esclusioni alla lista editando questa chiave di registry e riavviando poi il sistema:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Luafv\Parameters\ExcludedExtensionsAdd
Un esperimento interessante da fare per provare la virtualizzazione è il seguente:
- aprire il command prompt
- digitare cd %SystemRoot%
- digitare echo hello > test.txt
- ci si beccherà l'errore "Access Denied"
- attivare la virtualizzazione per il processo CMD.EXE in questione via task manager
- digitare echo hello > test.txt
- questa volta nessun errore. Il file sembra essere davvero nella directory Windows, come si può notare lanciando il comando dir test.txt
- disattivare la virtualizzazione
- notare che il file - secondo il command prompt - è 'scomparso'. In realtà il file sarà comunque rintracciabile come %localappdata%\virtualstore\windows\test.txt
L'esatto opposto avviene durante le operazioni di lettura.
Un'ultima nota sul criterio usato dal sistema per decidere se un processo va virtualizzato o meno: una applicazione viene considerata legacy (e quindi virtualizzata) se è 32-bit, non è stata lanciata con permessi di amministratore e non contiene il manifest che indica si tratti di una applicazione Vista. Per quanto riguarda il registry un meccanismo simile è in funzione. Le voci di registry virtualizzate vengono redirezionate verso:
HKEY_ CURRENT_USER\Software\Classes\VirtualStore
A differenza del file system però, per il quale i folder da virtualizzare sono un insieme noto a priori, per il registry il bit che segnala se la chiave del registry va virtualizzata o meno è memorizzato nella chiave per ogni singola chiave.
Per maggiori informazioni su UAC e la virtualizzazione, rimando all'articolo in inglese apparso su Technet Magazine a firma di Russinovich.
-Enjoy