(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:

Virtualization1

Di lì comparirà in task manager la colonna virtualizzazione per ogni processo (clicca per ingrandire):

Virtualization2

È possibile quindi attivare/disattivare la virtualizzazione cliccando sul processo via tasto destro del mouse:

Virtualization3

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:

  1. aprire il command prompt
  2. digitare cd %SystemRoot%
  3. digitare echo hello > test.txt
  4. ci si beccherà l'errore "Access Denied"
  5. attivare la virtualizzazione per il processo CMD.EXE in questione via task manager
  6. digitare echo hello > test.txt
  7. questa volta nessun errore. Il file sembra essere davvero nella directory Windows, come si può notare lanciando il comando dir test.txt
  8. disattivare la virtualizzazione
  9. notare che il file - secondo il command prompt - è 'scomparso'. In realtà il file sarà comunque rintracciabile come %localappdata%\virtualstore\windows\test.txt

Virtualization4

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

Technorati Tags: ,