Oppure

Loading

Il registro di sistema è un po' il totum continens delle informazioni: navigando fra le sue chiavi e i suoi valori, ci si può trovare qualunque cosa, ed è infatti uno dei bersagli più agognati dagli spyware. Il sistema operativo lo usa per immagazzinare qualsiasi dato utile al suo funzionamento, dai programmi associati ai tipi di file, agli assembly installati, alle estensioni del pannello di controllo, fino ai tempi che l'interfaccia impiega per aggiornarsi. Con un paragone un pò iperbolico, si potrebbe paragonare il registro di sistema all'insieme delle variabili di Windows stesso. Saperlo modificare opportunamente porta grandi vantaggi alle applicazioni che si scrivono. Di contro, un'azione azzardata potrebbe causare molti danni. Se non avete una minima conoscenza di come agire in questo contesto, saltate il capitolo (oppure andate a documentarvi e tornate più tardi), altrimenti, proseguite senza indugio.

Microsoft.Win32.RegistryKey

Per iniziare a utilizzare le classi che agiscono sul registro, bisogna prima importare il namespace Microsoft.Win32. Una volta fatto ciò diventa disponibile il tipo RegistryKey, i cui membri permettono di eseguire ogni azione possibile e immaginabile. Una variabile di questo tipo contiene le informazioni relative alla chiave su cui è impostata, e i metodi che aprono altre chiavi si riferiscono solo alle sottochiavi di quella considerata. In virtù di ciò, esistono due modi per aprire una chiave partendo da una root. Il primo consiste nell'utilizzare i campi pubblici già impostati della classe Registry:

'Da notare che il tipo non espone costruttori
Dim RegKey As RegistryKey
'Apre la chiave HKEY_CLASSES_ROOT
RegKey = Registry.ClassesRoot
'Apre la sottochiave .zip
RegKey = RegKey.OpenSubKey(".zip") 

Il secondo consiste nell'usare la funzione OpenRemoteBaseKey. Dopo aver aperto una chiave, si possono usare i suoi metodi. Eccone un elenco:

  • Close : chiude la chiave e attua le modifiche apportate
  • CreateSubKey(S) : crea una sottochiave di nome S. S può anche essere un percorso, come ad esempio "Provacommandshell": in questo caso verranno create tutte le chiavi non ancora esistenti
  • DeleteSubKey(S) : rimuove la sottochiave di nome S
  • DeleteValue(V) : elimina un valore di nome V all'interno della chiave
  • Flush : attua tutte le modifiche
  • GetSubKeyNames : restituisce un array di stringhe contenente il nome di tutte le sottochiavi. Molto utile per le enumerazioni
  • GetValue(V, D) : ottiene i dati contenuti nel valore di nome V. Opzionalmente si può specificare un secondo parametro che costituisce il risultato dell'operazione nel caso non esista alcun valore V nella chiave
  • GetValueKind(V) : restituisce il tipo di dati contenuto nel valore V
  • GetValueNames : ottiene un array di stringhe contenente il nome di tutti i valori della chiave
  • Name : il nome della chiave
  • OpenRemoteBaseKey(Base, M) : apre la chiave root specificata dall'enumeratore Base sulla macchina M
  • OpenSubKey(S, W) : apre la sottochiave S. W è un valore booleano che specifica se si possano eseguire modifiche sulla sottochiave aperta. Molte volte è causa di errori a runtime l'essersi dimenticati di impostare il secondo parametro a True. La funzione restituisce Nothing nel caso non sia stata trovata la data sottochiave
  • SetValue(V, A) : imposta ad A il contenuto della chiave V
  • SubKeyCount : il numero delle sottochiavi
  • SubValueCount : il numero dei valori

Con il codice proposto nel prossimo esempio è possibile risalire all'applicazione usata per aprire un certo formato di file:

Imports Microsoft.Win32

Module Module1

    Sub Main()
        Dim RegKey As RegistryKey
        Dim Extension As String

        Console.Write("Inserire un'estesione valida: ")
        Extension = Console.ReadLine()

        RegKey = Registry.ClassesRoot.OpenSubKey(Extension)
        If RegKey Is Nothing Then
            Console.WriteLine("Questa estensione non è associata a nessuna applicazione!")
            Console.ReadKey()
            Exit Sub
        End If

        Dim AppKey As String = RegKey.GetValue("")

        RegKey = Registry.ClassesRoot.OpenSubKey(AppKey)

        If RegKey Is Nothing Then
            Console.WriteLine("Non ? possibile risalire all'applicazione. Dati mancanti.")
            Console.ReadKey()
            Exit Sub
        End If

        RegKey = RegKey.OpenSubKey("shellopencommand")

        If RegKey Is Nothing Then
            Console.WriteLine("Non ? possibile aprire il file direttamente con un'applicazione.")
            Console.ReadKey()
            Exit Sub
        End If

        Console.WriteLine("Applicazione usata:")
        Console.WriteLine(RegKey.GetValue(""))

        Console.ReadKey()
    End Sub

End Module
A cura di: Il Totem