[Security] Il registry

Fatta la premessa entriamo nel merito: il registry, anzi il Regedit.exe, non è consentito...

Il framework espone delle classi (namespace Microsoft.Win32) che permettono la gestione totale del registry, a differenza di quello che era possibile fare con VB6 tramite i metodi GetSetting e SaveSetting senza dover usare troppe API; le calssi in questione sono Registry e RegistryKey.

Registry è l'entry-point del registry: è la root del registry ed espone le sette chiavi che lo compongono (HK_CURRENT_USER, HK_LOCAL_MACHINE, HK_USERS, ecc.).

Tutte le entità che compongono l'insieme delle chiavi del registry sono di tipo RegistryKey, comprese le sette sopracitate.

Tralasciando l'addentrarsi nei meandri della struttura delle classi, vi spiego come mi sono "costruito" un Regedit che mi consente anche di effettuare delle personalizzazioni nel comportamento.

L'interfaccia grafica, con molto fantasia l'ho copiata dall'originale (treeview + listview in modalità "details") con in più l'aggiunta di una sezione di dettaglio per editare i valori selezionati nella listview.

Utilizzando la funzione SubKeysCount (che ritorna il numero di sottochiavi appartenenti alla RegistryKey in questione) verifico se devo espandere la treeview (e caricare dinamicamente i rami da visualizzare solo se richiesti per ottimizzare i tempi), poi ciclo sull'array di stringhe contenenti i nomi delle sottochiavi restituito dalla funzione GetSubKeyNames e per ciascuna nome ottengo la RegistryKey relativa tramite OpenSubKey(nomedellastringa string, editabile bool). Per comodità tutte le RegistryKey che ottenevo le inserivo nel Tag della treeview in modo da averle sempre a disposizione.

Per ognuna delle RegistyKey utilizzavo le funzioni GetValueNames e GetValue(nomedelvalore string) per caricare la ListView e le TextBox del dettaglio. Qui iniziano i problemi, o meglio, i limiti del framework 1.1: a differenza del 2.0, non c'è una gestione dei tipi di valore: il valore restituito è un Object e dedurre se si tratta di un REG_DWORD, REG_SZ, REG_BINARY è affar tuo; ti viene in aiuto il GetType: per intenderci, se il valore restituito è di tipo "System.String" siamo di fronte a un REG_SZ, "System.Bite[]" a un REG_BINARY, "System.Int32" a un REG_DWORD. Nel caso in cui si deve scrivere un valore in una chiave il problema è un po' più articolato: il tipo di default che viene usato è REG_SZ e quindi potreste trovarvi a sospresa un DWORD (Int32) trasformato in REG_SZ (String): la soluzione è effettuare il casting esplicito del valore nel tipo di cui sopra e scriverlo tramite la funzione SetValue(nomevalore string, valore object).

Fortunamente il FX 2.0 ha implementato tale funzione in SetValue(nomevalore string, valore object, tipovalore RegistryValueKind) aggiungendo l'enum RegistryValueKind che semplifica non poco le cose.

Fatto sta, che adesso ho il mio RegeditXT, anche se non era previsto... :-)

   

Print | posted @ Friday, April 28, 2006 4:06 PM

Comments have been closed on this topic.