http://digilander.libero.it/Cenati

Registry

home | e-mail e contatti | Introduzione al sito | Cosa e' e come imparare VbScript

 

 

 

 

 

In questa pagina:

Introduzione
Enumera le subkeys
Lista valori di una chiave
Crea una chiave/valore
Legge un valore
Cancella una chiave/valore
Esporta una chiave di registro


Tutti gli esempi possono essere scaricati con il file registry.zip.

Introduzione

E' doveroso dire che può essere pericoloso armeggiare con il registro di sistema di Windows. Il sistema operativo stesso e molti programmi sono influenzati dalle informazioni salvate nel registry. Modificare dei valori può significare attivare nuove funzioni o migliorare la performance. Ma anche compromettere il corretto funzionamento di un programma.

Gli esempi di questa pagina sono innocui.

Tutti gli esempi leggono, scrivono o cancellano chiavi di registro che sono state create appositamente per l'esempio.

Nella sezione “Software” della sezione HKEY_LOCAL_MACHINE sono registrati dati necessari al funzionamento di alcuni programmi. Ad esempio gli ultimi documenti aperti, la posizione sullo schermo della finestra, i colori scelti dall'utente, ecc. Gli esempi che ho scritto creano una nuova subkey che ipoteticamente potrebbe accogliere i dati dei miei programmi. Quindi, lo ripeto, modificare o cancellare questi dati non influisce sul funzionamento di Windows.

Gli esempi che seguono utilizzano due metodi diversi per accedere al registry. Uno, più classico, utilizza l'oggetto “Wscript.Shell”. L'altro utilizza WMI (Windows Management Instrumentation), che permette interrogazioni più elaborate.

Per valutare cosa fanno questi script è opportuno aprire con regedit la chiave che si sta modificando ed avviare i vbs. Con il comando “aggiorna” di regedit apparirano le nuove chiavi create, i nuovi valori delle voci del registry, spariranno le chiavi ed i valori cancellati.

Per scoprire cosa altro si può fare con WMI consglio di scaricare il programma “Scriptomatic” dal sito Microsoft. E' una applicazione HTM (una pagina html salvata con estensione hta, che non ha limitazioni di sicurezza). Questo programma può generare script di interrogazione su moltissime variabili dell'ambiente Windows, sui programmi installati, ecc. Per sapere sommariamente cosa è WMI, cercare il file WMIC.HLP nella cartella Windows\help.

Più in generale, per scrivere altrove nel registry è necessario essere certi di quello che si sta facendo. Magari tenendo nota delle modifiche effettuate in modo da poter ripristinare la situazione precedente. Cercando sul web “registry hacks” si trovano alcuni siti con spunti per migliorare le prestazioni dei programmi.

Per concludere questa introduzione, devo dire che a me non piacciono molto i programmi che scrivono nel registry i propri dati. Preferisco il vecchio metodo del file ".INI". Insomma, se il mio programma deve salvare qualche informazione sulle impostazioni dell'utente, preferisco creare un file nella stessa cartella con tutto quello che serve. In questo modo non appesantisco il registro con i miei dati e non lo lascio sporco se il programma viene rimosso.

Enumera le subkeys

Per avere un elenco delle chiavi sotto, ad esempio, HKEY_CURRENT_USER fino a qualche anno fa era necessario usare tools di terze parti. Ora con WMI si può interrogare Windows ed ottenere un array delle chiavi disponibili.

 
'****************************************************************
' File: REG Enumera subkeys.vbs
' Autore: (c) Giovanni Cenati http://digilander.libero.it/Cenati
' Usa WMI per enumerare le subkeys del registry
' Uses WMI to enumerate all the registry subkeys
'****************************************************************
Const HKEY_CLASSES_ROOT = &H80000000
Const HKEY_CURRENT_USER = &H80000001
Const HKEY_LOCAL_MACHINE = &H80000002
Const HKEY_USERS = &H80000003
Const HKEY_CURRENT_CONFIG = &H80000005
Const HKEY_DYN_DATA = &H80000006

strComputer = "." 'Questo computer.
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")
'strKeyPath = "SYSTEM\Setup"
strKeyPath = ""
oReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys

For Each subkey In arrSubKeys
List= List & subkey & VbTab
Next
MsgBox List

Otterrete “hardware”, “security”, “software” e altre voci. Il metodo EnumKey popola un vettore arrSubkeys con i nomi delle chiavi sottostanti a HKEY_LOCAL_MACHINE. Specificando un percorso, come il primo strKeyPath bloccato da un commento nell'esempio, si mostrano le voci al di sotto di quella determinata chiave.

Provate anche strKeyPath = "SOFTWARE\Microsoft”

Con questo metodo si ottengono le subkeys, ma non i valori delle voci eventualmente contenuti. Per questo bisogna andare oltre nella lettura di questa pagina.

Lista valori di una chiave

Nel paragrafo precedente abbiamo visto come elencare le sottochiavi. Una volta individuata una sottochiave, è possibile leggerne le voci ed i relativi valori.

L'esempio elenca le voci della sottochiave "outlook express". I risultati comprendono, nel mio caso, cinque voci diverse. La prima è "MediaVer", che contiene la versione di Outlook Express installata sulla mia macchina.

'****************************************************************
' File: REG Lista valori di una subkey.vbs
' Autore: (c) Giovanni Cenati http://digilander.libero.it/Cenati
' Usa WMI per elencare le voci e i valori contenuti in una subkey.
'****************************************************************
Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")
strKeyPath = "SOFTWARE\Microsoft\outlook express"
oReg.EnumValues HKEY_LOCAL_MACHINE, strKeyPath,_
arrValueNames, arrValueTypes
For i=0 To UBound(arrValueNames)
oReg.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath, _
arrValueNames(i),strValue
list= list & arrValueNames(i) & " = " & strValue & _
" (" & arrValueTypes(i) & ")" & vbCrlf
Next

MsgBox List
'**********REG Lista valori di una subkey*************************

Crea una chiave/valore

Fino ad ora abbiamo imparato a scorrere l'albero del registry per cercare voci e valori esistenti. Ora vediamo come creare una propria subkey e scriverci una voce con i relativi valori. Questi metodi permettono anche di sovrascrivere un valore esistente.

Questo primo esempio usa il metodo regwrite dell'oggetto wscript.shell.

Se il parametro termina con un "\" sarà creata una subkey. Se il parametro non termina con la "\" sarà creata una voce, nel qual caso è necessario indicarne anche il valore ed il tipo. I tipi permessi sono "REG_SZ" (stringa), REG_EXPAND_SZ (stringa), REG_DWORD (intero), REG_BINARY (intero).

'****************************************************************
' File: REG Scrive una chiave nel registry.vbs
' Autore: (c) Giovanni Cenati http://digilander.libero.it/Cenati
' Scrive una chiave o una subkey nel registro di sistema.
' Usa wscript.shell per accedere al registry.
'****************************************************************
Set oShell = WScript.CreateObject("WScript.Shell")

oShell.RegWrite "HKLM\SOFTWARE\Cenati\", ""
'Questa è una nuova subkey (finisce con \)

'Queste invece sono delle nuove voci.
'Non finiscono con \ e sono seguite dal valore e dal tipo.
oShell.RegWrite "HKLM\SOFTWARE\Cenati\Paola", "2000", "REG_SZ"
oShell.RegWrite "HKLM\SOFTWARE\Cenati\Daniela", "1998", "REG_SZ"
oShell.RegWrite "HKLM\SOFTWARE\Cenati\Andrea", "2005", "REG_SZ"

' Tipi consentiti:
' REG_SZ, REG_EXPAND_SZ, REG_DWORD, REG_BINARY.
' Windows 95 e 98 supportano solo REG_SZ, REG_DWORD e REG_BINARY.

'**********REG Scrive una chiave nel registry.vbs*****************

E' possibile creare una chiave anche usando WMI. In questo esempio vediamo come.

'****************************************************************
' File: REG Crea subkey.vbs
' Autore: (c) Giovanni Cenati http://digilander.libero.it/Cenati
' Usa WMI per Creare una subkey nel registry
' Uses WMI to create a registry subkey
'****************************************************************
Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")
strKeyPath = "SOFTWARE\Cenati"
oReg.CreateKey HKEY_LOCAL_MACHINE,strKeyPath
'*****REG Crea subkey.vbs****************************************

Legge un valore

Quello che abbiamo visto fino ad ora può essere utile per inserire dei "trucchi" nel registro, per abilitare o disabilitare determinate caratteristiche, ecc. Oppure per scrivere i propri dati nel registry. Ma come si fa a leggere il valore di una voce? Con il metodo RegRead di Wscript.Shell. Nell'esempio c'è anche una semplice gestione delle eccezioni per rilevare l'eventuale inesistenza della voce che si tenta di leggere.

'****************************************************************
' File: REG legge il valore di una voce.vbs
' Autore: (c) Giovanni Cenati http://digilander.libero.it/Cenati
' Legge il valore di una voce nel registro di sistema.
' Usa wscript.shell per accedere al registry.
'****************************************************************
Set oShell = WScript.CreateObject("WScript.Shell")

Voce = "HKLM\SOFTWARE\Cenati\Daniela"
Valore = oShell.RegRead(Voce)

Msgbox Voce & " = " & Valore

' Con gestione degli errori (voce non esistente)
On Error Resume Next
Voce = "HKLM\SOFTWARE\Cenati\Pippo"
Valore = oShell.RegRead(Voce)
If Err.Number <> 0 Then
MsgBox "La voce di registro " & Voce & " non esiste"
Else
Msgbox Voce & " = " & Valore
End If
'**********REG legge il valore di una voce.vbs*****************

Ma per leggere il contenuto di una voce di registro c'è anche una proprietà del modello ad oggetti di Word (non di Excel, per qualche strano motivo).

La funzione ha questa sintassi: PrivateProfileString(FileName As String, Sezione As String, Chiave As String) As String

Il FileName può essere un file ".INI". Se è una stringa nulla si accede al registro di configurazione.

La Sezione è la subkey del registry oppure la sezione tra parentesi quadre di un file INI.

La Chiave è la voce cercata. L'esempio riportato sotto è equivalente alla prima parte dell'esempio precedente che usa Wscript.Shell.

Set objWord = CreateObject("Word.application")
DocsDir = objWord.System.PrivateProfileString("", _
"HKEY_CURRENT_USER\Software\Cenati", _
"Daniela") & "\"
objWord.Quit

Cancella una chiave/valore

Per finire, una cosa molto rara. I programmi lasciano spesso il registro sporco con sottochiavi e valori non più utili. Ecco come fare a rimuovere i dati che non servono più.

Nello script si elimina la subkey che ho creato con gli esempi precedenti. Per scrivere o cancellare da altri rami del registry (qui è in HKEY_LOCAL_MACHINE), fare riferimento alle costanti presentate nel primo esempio.

Questo codice elimina tutta la subkey "Cenati", compresi eventuali valori ed eventuali sybkey. Non è quindi necessario svuotare la chiave prima di cancellarla. Occhio a non cancellare qualcosa di livello più alto!

'****************************************************************
' File: REG Cancella subkey.vbs
' Autore: (c) Giovanni Cenati http://digilander.libero.it/Cenati
' Usa WMI per cancellare una subkey dal registry.
' Uses WMI to delete a registry subkey.
'****************************************************************
Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")
strKeyPath = "SOFTWARE\Cenati"
oReg.DeleteKey HKEY_LOCAL_MACHINE, strKeyPath
'*****REG cancella subkey.vbs************************************

Questo altro esempio cancella una voce del registry utilizzando wscript.shell anzichè WMI. Se il percorso da cancellare finisce con la barra "\" significa che si vuole cancellare una subkey. Se non finisce con "\" si cancella una chiave.

'****************************************************************
' File: REG Cancella una chiave dal registry.vbs
' Autore: (c) Giovanni Cenati http://digilander.libero.it/Cenati
' Scrive una chiave o una subkey nel registro di sistema.
' Usa wscript.shell per accedere al registry.
'****************************************************************
Set oShell = WScript.CreateObject("WScript.Shell")

oShell.RegDelete "HKLM\SOFTWARE\Cenati\Daniela\"
'cancella una subkey (finisce con \)

'Cancella delle chiavi.
'Non finiscono con \
oShell.RegDelete "HKLM\SOFTWARE\Cenati\Paola"
oShell.RegDelete "HKLM\SOFTWARE\Cenati\Andrea"

'**********REG cancella una chiave dal registry.vbs*****************

        Esporta una chiave di registro

Quello che segue, se l'avessi scritto prima, vi avrebbe evitato di leggere tutta la pagina...

Il programma RegEdit serve per curiosare tra le chiavi di registro. Ma si può usare anche per esportare in un file .REG una o più chiavi. In questo modo si può scrivere nel registro semplicemente con un doppio click sul .REG. Ad esempio potreste salvare in questo modo le informazioni sulle connessioni internet, oppure sugli account di posta di Outlook Express.

RegEdit può creare un file REG anche specificando dalla riga di comando un apposito parametro.

Ad esempio (grazie a Fosco che mi ha scritto di questa possibilità):

regedit /e Save.reg  (esporta TUTTO il Registry in Save.reg)
regedit /s Save.reg    (importa nel registry il contenuto di save.reg)
regedit /e save.reg HKEY_CURRENT_USER\Identities   (esporta specifica key)

Esempio

set oShell = CreateObject("WScript.Shell")
oShell.run"regedit /e connessioni.reg HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections"

Giovanni Cenati

 

 


© Cenati Giovanni 2004/2010 - http://digilander.libero.it/Cenati - Reventlov at Katamail com

home | e-mail e contatti | Introduzione al sito | Cosa e' e come imparare VbScript