# Registro di sistema

Il registro di sistema, in informatica, indica la base di dati in cui sono custodite le opzioni e le impostazioni (setting) di un sistema operativo di tipo Microsoft Windows e di tutte le applicazioni installate. Il concetto di registro di sistema è strettamente legato alla logica dei sistemi operativi Microsoft, che conservano tutte le proprie impostazioni in un numero ristretto di file (in Unix esistono file di configurazione per ciascun pacchetto installato). Per accedervi bisogna digitare regedit nella casella esegui, invocabile con la pressione di ⊞ Win+R.

## Storia

Il registro di sistema risale a prima di Windows 95: la sua prima implementazione risale infatti a Windows 3.0, con un file nominato WIN.INI, dalla quale si è evoluto negli anni (e con le varie versioni di Windows) fino alla sua più recente incarnazione, quella di Windows 11.

### Windows 3.0

L'introduzione del registro di sistema in Windows 3.0 fu resa necessaria da due novità di quella versione di Windows:
* La piattaforma Object Linking and Embedding (OLE) di Microsoft, che per il suo funzionamento aveva bisogno di un deposito stabile dove memorizzare i componenti OLE installati nel sistema; requisito che fu soddisfatto con l'aggiunta nel file WIN.INI della sezione [Embedding].
* Il File Manager e il Program Manager, per i quali era necessaria una posizione dove conservare le associazioni tra i tipi di file e le applicazioni che li gestivano, che fu creata nel file WIN.INI come sezione [Extensions].
Il registro di sistema, nella sua primissima versione, risiedeva quindi interamente nel file WIN.INI.
Questo è un esempio della sezione [Extensions]:
Come si può vedere, ad ogni applicazione viene associata una o più estensioni di nome di file.
Una struttura differente veniva impiegata invece nella sezione [Embedding]:
Qui, a fianco dell'ID programmatico (eventualmente completo di numero di versione), compaiono il nome generico della classe, il nome specifico di questa versione della classe, il percorso del programma in grado di creare oggetti di questa classe (fabbrica di oggetti; in inglese impropriamente class factory, fabbrica di classi), e il tipo di oggetto.

### Windows 3.1

Il registro di Windows 3.0 era fortemente penalizzato dal risiedere in un file di testo; in Windows 3.1, questa limitazione fu aggirata spostando tutto il registro di sistema in un unico file non testuale, REG.DAT. Questo file era sicuramente un miglioramento rispetto al WIN.INI, ma aveva comunque un limite alla dimensione massima, di 64 kB; questo grave limite fece sì che gli sviluppatori di software continuassero a usare file esterni per memorizzare le impostazioni delle loro applicazioni.

### Windows 95/98

In Windows 95, la struttura del registro fu ridisegnata completamente: non solo fu separato in due file (USER.DAT e SYSTEM.DAT), ma furono tolti anche quasi tutti i vincoli precedentemente imposti (quello della dimensione massima in primis) e ne fu promosso l'utilizzo massiccio come sostitutivo dei file di configurazione esterni.

### Windows NT/2000/XP

Nell'obiettivo di un sistema operativo sicuro, Windows NT e i sistemi da esso derivati hanno adottato una strategia supplementare: ogni chiave (nodo) del registro dispone di una propria lista di controllo degli accessi (ACL), che permette quindi di specificare restrizioni in base all'utente che cerca di accedervi. Oltre a questa importante differenza, anche qui il registro è stato ripartito in più file, anche se in maniera differente, e ogni profilo utente include una versione privata della chiave relativa alle impostazioni dell'utente, HKEY_CURRENT_USER.

## Descrizione
### Il registro di sistema di Microsoft Windows

Nei sistemi Windows, il registro di sistema è stato introdotto a partire dalla versione Windows 3.0 e ha permesso l'eliminazione della gestione tramite file INI delle informazioni riguardanti:
* impostazioni dei driver
* profili hardware
* impostazioni del software installato
* profili utente
* associazioni dei tipi di file
* librerie di tipi, interfacce e classi di COM
* criteri di protezione dei sistemi e degli utenti

### Criteri di gruppo

Dall'avvento di Windows 95, gli amministratori di sistema possono affiancare al registro degli speciali file, detti di criteri di gruppo, che permettono di ridurre o inibire l'accesso a specifiche chiavi del registro (per esempio, per rendere impossibile la modifica delle impostazioni grafiche della shell); l'estensione per questi file è .POL. I criteri di gruppo possono agire su un singolo utente, o su un gruppo di utenti; l'efficacia è garantita dall'applicazione indiretta al registro, che impedisce quindi agli utenti che subiscono le restrizioni di modificare i valori specificati nei criteri. I file di criteri vengono tipicamente distribuiti sui computer dall'amministratore attraverso la rete locale, ma possono anche essere piazzati direttamente sui computer interessati.
Per creare e modificare file di criteri di gruppo, Microsoft fornisce un programma per Windows 9x, POLEDIT.EXE; per i sistemi derivati da Windows NT, è disponibile invece un plugin MMC, che tuttavia è disabilitato in Windows XP Home. Il plugin MMC richiede di essere eseguito da un utente con privilegi amministrativi; può agire sul registro della macchina in locale come anche connettersi ad un registro di sistema remoto e operare su quello. Le impostazioni che il programma permette di modificare sono memorizzate in file .ADM; la shell di Windows, EXPLORER.EXE, include uno di questi file. I file .ADM sono semplici file di testo, con un supporto alla localizzazione dato dal raggruppamento di tutti i testi in un unico punto.

### Punti di forza

Rispetto ai classici file INI, il registro offre i seguenti vantaggi:
* l'omogeneità del formato e dei vincoli permette di eseguire gli script senza bisogno di modificarli per ogni applicazione
* essendo costituito da un ristretto numero di file in posizioni note il backup è semplice
* il registro centralizzato e i criteri di gruppo favoriscono la gestione centralizzata da parte degli amministratori
* il danneggiamento del registry è un evento molto raro e sono previsti sistemi automatici di protezione, di backup e di ripristino
* gli utenti poco esperti raramente manipolano il registry facendo danni, mentre i file di testo separati sono più facilmente soggetti a modifiche accidentali, sia a seguito di editing sia di operazioni sul file system
* le impostazioni a livello di computer sono separate dalle impostazioni individuali degli utenti
Da quando anche Windows utilizza le convenzioni dei sistemi operativi stile Unix (cartelle distinte per utente contenenti i file di configurazione di tutti i programmi usati dall'utente) questa caratteristica può essere ottenute anche per altra via.
La gestione centralizzata da parte degli amministratori è ottenibile in maniera anche con un sistema a file per altre vie.

### Punti deboli

Il registro non è la panacea a tutti i problemi di configurazione del software. In particolare:
* Un registro danneggiato è in grado di rendere il sistema operativo inutilizzabile, a volte offrendo come unica via d'uscita la re-installazione completa del sistema.
* Per manipolare il registro, i programmi devono utilizzare le apposite funzioni dell'API di Windows, mentre un normale file testuale di configurazione può essere elaborato con le normali funzioni di manipolazione dei file. Questo obbligo riguarda anche gli utenti, che per accedere al registro devono utilizzare il programma REGEDIT.EXE, mentre per i comuni file di configurazione è sufficiente un qualsiasi applicativo di elaborazione testi. Questo può essere visto anche come un vantaggio, perché scoraggia la manipolazione da parte di utenti inesperti.
* Nei file INI spesso sono presenti dei commenti per spiegare in che maniera l'utente può agire per variare la configurazione delle applicazioni, mentre il registro non prevede commenti.
* A causa del fatto che i vari file che costituiscono il registro sono sempre mantenuti aperti (per motivi di prestazioni) dal sistema operativo, il loro backup è possibile solo mediante appositi strumenti, come NTBACKUP.EXE.
Inoltre il registry può subire un degrado di prestazioni nel caso in cui il pacchetto d'installazione sia mal costruito e non rimuova alcune voci in fase di disinstallazione. I generatori commerciali di pacchetti di installazione normalmente non sono soggetti a questi problemi. In ogni caso è buona pratica effettuare regolarmente la pulizia del registro.

### Problemi con i sistemi operativi Windows 9x e pulizia del registro

Nei computer con Windows 9x, un'installazione del sistema operativo troppo datata può essere soggetta a notevoli rallentamenti dovuti ad un'eccessiva dimensione del registro, che penalizza le prestazioni del sistema, in particolare all'avvio, e spesso è anche causa di instabilità del sistema stesso; la frequenza di questa circostanza ha portato all'associazione "registro → instabilità", che risulta tuttavia meno fondata per i sistemi operativi basati su Windows NT. Esistono comunque dei programmi in grado di pulire il registro.
Va anche considerato che diversa cache di Windows nonché altre impostazioni che non si riesce a eliminare (oppure a riportare nelle condizioni iniziali) con i comandi del sistema operativo risiedono sul registro e, per operare, non si può che agire sul registro. È opportuno quindi, prima di procedere a modifiche, effettuare un backup del registro per poterlo poi recuperare in caso di problemi.

### Alternative al registro in altri sistemi operativi

L'esigenza di mantenere i file di configurazione separati è sentita anche in altri sistemi operativi, ma l'approccio di solito consiste nel raggruppamento degli stessi in apposite cartelle del file system, come la cartella Preferences in Mac OS, o la cartella /etc e le cartelle nascoste (quelle cioè il cui nome inizia con un punto) all'interno della home nei sistemi tipo Unix. Con questo approccio, la protezione dei vari gruppi di impostazioni si appoggia direttamente ai permessi d'accesso del file system ospite; inoltre l'unico evento in grado di minare la stabilità di questo sistema è la corruzione del file system, che avrebbe comunque delle gravi ripercussioni sull'intero sistema. La suddivisione in più parti inoltre permette agli utenti di non dover manipolare file cruciali per il sistema operativo solo per modificare le preferenze di un programma; gli interventi su file di impostazioni importanti rimangono così un evento poco frequente.

## Posizione

A seconda della versione di Windows, il registro di sistema è memorizzato in uno o più file in posizioni note, ma sempre sullo stesso computer; l'unica eccezione, solo da Windows NT in poi, è data dal file del profilo privato di ogni utente che, per via della caratteristica dei profili remoti, può risiedere su una macchina (ospite del profilo) raggiungibile via rete.

### Windows 3.0

Il registro, in questa sua prima versione, è semplicemente un'astrazione delle sezioni [Extensions] ed [Embedding] del file WIN.INI.

### Windows 3.1x

In queste versioni di Windows, il registro risiede fisicamente nel file REG.DAT, ubicato nella cartella d'installazione di Windows (tipicamente C:\WINDOWS).

### Windows 9x

In Windows 95 e Windows 98 il registro è memorizzato nei file USER.DAT e SYSTEM.DAT, posizionati nella cartella d'installazione di Windows (tipicamente C:\WINDOWS).

### Windows Me

La collocazione del registro in Windows Me è identica ai suoi predecessori Windows 9x, con l'aggiunta del file CLASSES.DAT.

### Windows NT/2000/XP

In Windows NT e nei sistemi operativi da esso derivati (2000, XP e Server 2003, il registro è composto da alcuni file posizionati in %SystemRoot%\System32\Config (tutti senza estensione):
* SAM
* Security
* Software
* System
* Default
* UserDiff
Inoltre, nella cartella di ogni profilo utente, è memorizzata una versione personalizzata di questi file:
* NTUser.dat

## Struttura

Il registro è organizzato in una gerarchia originata da alcune sezioni principali; ogni nodo della gerarchia è detto chiave (key), e ogni nodo può contenere uno o più elementi di dati, detti valori (values), di cui uno anonimo (retaggio di compatibilità).
Le chiavi di primo livello (chiavi radice, root keys) hanno il nome interamente in maiuscolo con "HKEY" come prefisso, dall'abbreviazione di handle to a key (che ha origine dalla API di Windows), traducibile come riferimento alla chiave; i loro nomi sono solitamente abbreviati in una sigla di tre o quattro lettere, con prefisso "HK".
Il percorso di una chiave viene indicato con una sintassi simile ai percorsi di file in Windows, utilizzando quindi il carattere "\" (barra rovesciata) come separatore; per esempio, HKEY_CURRENT_USER\Software\Microsoft\Windows identifica la chiave Windows contenuta nella chiave Microsoft contenuta in Software, contenuta a sua volta nella chiave principale HKEY_CURRENT_USER.
Analogamente, un valore viene identificato dal percorso unito al nome del valore stesso, come in HKEY_CURRENT_USER\Software\Microsoft\Windows\Version, che identifica il valore Version contenuto nella chiave Windows ecc.
Un valore può consistere in:
* una stringa di caratteri (valore stringa, tecnicamente REG_SZ)
* una sequenza arbitraria di byte (valore binario, REG_BINARY)
* un numero a 32 bit (che ammette quindi valori da 0 a 4 294 967 295, cioè $2^{32}-1$) (valore dword, REG_DWORD)
* un gruppo di stringhe di caratteri (valore multi-stringa, REG_MULTI_SZ)
* una stringa con riferimenti a variabili d'ambiente (valore stringa a espansione, riferito alla sostituzione dinamica delle variabili d'ambiente (espansione) effettuata al momento della lettura del valore stesso; nome tecnico REG_EXPAND_SZ)
* un valore amorfo (cioè di nessun tipo già definito; indicato con REG_NONE)
Sono definiti anche alcuni altri tipi di valore, ma sono impiegati solo in contesti particolari, come per esempio per memorizzare la configurazione di un driver Plug and Play (vari nomi tecnici, fra cui REG_RESOURCE_REQUIREMENTS_LIST).

### Chiave HKEY_CLASSES_ROOT

In HKEY_CLASSES_ROOT (abbreviato in HKCR) sono memorizzate informazioni circa le applicazioni registrate, come le associazioni dei tipi di file e le classi OLE. A partire da Windows 2000, HKCR è una fusione (dinamica) di HKCU\Software\Classes e HKLM\Software\Classes. Se un dato valore esiste in tutte e due le strutture, quello presente in HKCU\Software\Classes ha la precedenza.

### Chiave HKEY_CURRENT_USER

In HKEY_CURRENT_USER (abbreviato in HKCU) sono memorizzate informazioni circa i dati relativi al profilo dell'utente attivo. HKCU è un collegamento simbolico alla chiave relativa all'utente contenuta in HKEY_USERS. "User"=hex(0):73,6c,74,61,6e,37,35,00

### Chiave HKEY_LOCAL_MACHINE

In HKEY_LOCAL_MACHINE (abbreviato HKLM) sono memorizzate informazioni circa le impostazioni comuni a tutti gli utenti del sistema. Nella sua sottochiave System è memorizzata la configurazione hardware del computer.

### Chiave HKEY_USERS

In HKEY_USERS (abbreviato HKU) sono memorizzate informazioni circa le chiavi HKEY_CURRENT_USER di tutti gli utenti connessi al sistema.

### Chiave HKEY_CURRENT_CONFIG

In HKEY_CURRENT_CONFIG (abbreviato HKCC) sono memorizzate informazioni volatili sulla sessione. Questa chiave radice è presente solo nel registro delle versioni di Windows derivate da Windows NT.

### Chiave HKEY_DYN_DATA

In HKEY_DYN_DATA (abbreviato HKDD) sono memorizzate informazioni circa le statistiche sulle prestazioni che possono essere visualizzate con il monitor di sistema (SYSMON.EXE). Questa chiave radice è presente solo nei sistemi operativi basati su Windows 95 (95, 98 e ME).

## Modifica
### Interfaccia grafica

Per modificare il registro manualmente, Microsoft fornisce con i suoi sistemi operativi Windows un'applicazione apposita, REGEDIT.EXE o REGEDT32.EXE (a seconda della versione del sistema). La disponibilità di un applicativo per modificare il registro, comunque, non implica che questa sia un'operazione per tutti: una disattenzione durante la modifica del registro può portare a rendere il sistema inutilizzabile; proprio a causa della delicatezza di questa operazione, molti produttori di software offrono applicazioni specializzate nella modifica del registro con un'interfaccia grafica più simile al Pannello di controllo, e quindi più familiare all'utente medio; alcune società producono anche programmi per la pulizia automatica del registro, operazione anch'essa potenzialmente pericolosa.
Anche Microsoft stessa mette a disposizione gratuitamente un piccolo programma di nome TweakUI, che permette di modificare molti parametri dell'interfaccia grafica di Windows e di apportarle alcune piccole ottimizzazioni.

#### Storia di REGEDIT (e REGEDT32)

Un primordiale strumento per la modifica del registro fece la sua comparsa con Windows 3.1, con il nome di Editor delle informazioni di registrazione (Registration info editor, nella versione in lingua inglese), REGEDIT.EXE; lo scopo principale di questo programma era di modificare le associazioni di file e le registrazioni dei componenti OLE.
Con l'introduzione di Windows NT, la neonata API Win32 introdusse il concetto di permessi d'accesso anche per le chiavi del registro; per gestirle correttamente assieme alle altre nuove funzionalità del registro, fu creato appositamente un nuovo programma, REGEDT32.EXE, decisamente più completo del suo predecessore a 16 bit REGEDIT.EXE.
Qualche anno più tardi, con l'avvento di Windows 95, REGEDIT.EXE fu ribattezzato come l'attuale Editor del Registro di sistema e fu portato a 32 bit. Questo tuttavia non implementava la sezione riguardante la sicurezza di Win32, così rimase un prodotto a sé stante, con un percorso produttivo disgiunto da quello di REGEDT32.EXE. Questa situazione rimase invariata anche con l'introduzione di Windows 98, dal momento che esso era solo una modesta evoluzione di Windows 95, almeno dal punto di vista della sicurezza. Il nuovo REGEDIT.EXE aveva un'interfaccia utente più funzionale e più accattivante del suo analogo per Windows NT; tuttavia era in grado di manipolare solo un sottoinsieme dei tipi di dato previsti da Win32 e, come detto sopra, non permetteva la modifica dei permessi d'accesso alle chiavi (che erano, di fatto, assenti).
Successivamente, prima con Windows NT 4.0 e poi con Windows 2000, furono distribuiti ambedue gli strumenti. Questo lasciava agli utenti la scelta fra un programma più rozzo, ma efficace, o un programma con un'interfaccia utente più familiare e pratica (simile in tutto e per tutto a Esplora risorse), ma che non permetteva di sfruttare tutte le possibilità del sistema operativo. In particolare, essendo REGEDIT.EXE incapace di gestire molti dei tipi di dato del potente registro di Windows NT e dei suoi discendenti, la modifica di un valore di un tipo di dato sconosciuto a REGEDIT.EXE poteva portare alla corruzione del valore, con pesanti implicazioni sulla stabilità del sistema.
Finalmente, con Windows XP, i due programmi sono stati fusi in un discendente unico, fondamentalmente applicando la comoda interfaccia utente di REGEDIT.EXE al più sofisticato REGEDT32.EXE. Il risultato è chiamato REGEDIT.EXE, ed è presente un mini-programma di nome REGEDT32.EXE che rimanda sempre a REGEDIT.EXE.

### Riga di comando

Per i sistemi basati su Windows NT esiste uno strumento che permette di operare sul registro di sistema da riga di comando. È incluso in Windows XP con il nome di REG.EXE, ed è disponibile separatamente per le versioni precedenti del sistema operativo di Microsoft. Il comando può essere invocato con questa sintassi:
Inoltre, anche l'applicazione ad interfaccia grafica REGEDIT.EXE permette di operare via riga di comando, limitatamente all'importazione di file.REG (porzioni di registro memorizzate in formato testuale):
L'opzione /s indica di operare in modalità silenziosa, senza interazione con l'utente; se omesso, il programma chiederà all'utente di confermare l'operazione. In Windows 95 e Windows 98 l'opzione /s veniva eseguita correttamente anche in presenza di un eventuale blocco amministrativo del programma. A differenza di REG.EXE, REGEDIT.EXE non restituisce un codice d'errore (ERRORLEVEL) appropriato quando usato per importare un file, il che complica la gestione degli errori negli script automatizzati; un modo per stabilire il successo di un'operazione di importazione è di controllare successivamente se è possibile esportare la chiave che si era provato ad importare:
L'operazione predefinita associata al tipo di file.REG, a partire da Windows 98, corrisponde all'importazione con richiesta di conferma da parte dell'utente; in Windows 95 l'associazione era la medesima, con la differenza che non veniva posta nessuna domanda, ed era quindi una potenziale causa d'errori.