Curiosare nel registry usando come scusa le sorgenti dati ODBC (Storico)

Un paio di giorni fa, qualcuno ha chiesto sul forum come si genera da programma una origine dati ODBC, sapendo che il mio collega il Sistemaio usualmente inserisce nei login script la generazione delle origini dati ODBC necessarie al lavoro quotidiano degli utenti, gli ho chiesto se poteva darmi gli script, ovviamente, i suoi script sono in VBA visto che vengono eseguiti dal sistema al login, pertanto li ho presi come spunto per questo post, in cui vedremo come esaminare le origini dati ODBC che esistono su una macchina siano esse ODBC di sistema oppure ODBC Utente, usando .NET al posto di VBA. Ne seguirà un'altro, forse due, che mostreranno come generare l'origine dati ODBC da .NET

Nello script del Sistemaio, nella sezione che genera gli ODBC di sistema c'era il seguente codice:

cRegKey1 = "HKLM\Software\ODBC\ODBC.INI\" & trim(ssNome) & "\"
cRegKey2 = "HKLM\Software\ODBC\ODBC.INI\ODBC Data Sources\"

Assomigliano molto a due chiavi del registry, e il prefisso HKLM sembra indicare  HKey Local Machine, quindi, ne deduciamo che per vedere quali ODBC sono definiti su di un PC abbiamo bisogno di una chiave del registry. Visto che entrambe le chiavi qui sopra si trovano sotto ODBC\ODBC.INI, questa chiave sarà l'oggetto della mia curiosità:

Il progetto di test, solo in C#, lo trovate in Area Download.

La soluzione OriginiDatiODBC contiene un solo progetto WindowsForms con lo stesso nome, in cui è una sola form FrmMain. Nella form ho inserito i seguenti controlli:

uno split container, due bottoni nel pannello 1, una textbox multilinea nel pannello 2 che riempie tutto il pannello.

Il primo bottone, btnLeggiODBC, ha il seguente codice sull'evento click:

        private void btnLeggiODBC_Click(object sender, EventArgs e)
        {
            RegistryKey  regKeySys = Registry.LocalMachine.CreateSubKey( "Software\\ODBC\\ODBC.INI" );
            string[] keys = regKeySys.GetSubKeyNames();
            StringBuilder sb = new StringBuilder();
            sb.AppendLine(new string('-', 30)); 
            sb.AppendLine("Lista ODBC di sistema trovati:");
            for( int i=0; i< keys.Length; i++ )
            {
                sb.AppendLine(keys[i]);
                RegistryKey odbcKey = regKeySys.OpenSubKey(keys[i]);
                string[] valueNames = odbcKey.GetValueNames();
                for (int j = 0; j < valueNames.Length; j++)
                {
                    sb.AppendFormat("* \t {0}={1}", valueNames[j], odbcKey.GetValue(valueNames[j]).ToString());
                    sb.AppendLine();
                }
            }
            sb.AppendLine(new string('-', 30));
            sb.AppendLine();
            this.txtResult.Text = sb.ToString() + this.txtResult.Text;
        }

Cosa abbiamo fatto? Un metodo che lista tutte le chiavi del registry che si trovano su LocalMachine\Software\ODBC\ODBC.INI, per farlo utilizziamo le classi RegistryKey e Registry che si trovano in Microsoft.Win32, Apriamo la chiave contenente i dati dell'ODBC, usando il metodo CreateSubKey della proprietà LocalMachine dell'oggetto Registry.

Fatto questo, per listare che cosa c'è dentro alla chiave relativa agli ODBC, usiamo il metodo GetSubKeyNames per ottenere i nomi di tutte le chiavi che si trovano sotto alla chiave principale. Proseguiamo poi preparando uno stringbuilder che ci permetterà di visualizzare il contenuto del registry, ed infine facciamo un ciclo sulla lista delle chiavi che abbiamo recuperato e per ognuna di esse, usiamo il metodo OpenSubKey per ottenere l'oggetto RegistryKey, e la funzione GetValueNames per ottenere tutti i nomi dei valori presenti in ciascuna delle chiavi, con un ciclo annidato aggiungiamo allo StringBuilder  i nomi dei valori ed il loro valore (non è un gioco di parole).

Cosa otteniamo facendo click sul nostro bottone? Una lista di questo tipo:

------------------------------
Lista ODBC di sistema trovati:
4UAHR
* Database=4UAHR
* Description=AHR - For You I.T.
* Driver=\sqlncli.dll
* Language=Italiano
* Server=4unb10
* Trusted_Connection=Yes
DBMIRROR
* Driver=C:\WINDOWS\system32\sqlncli.dll
* Description=Connessione al DBMIRROR MEXAL
* Server=rddev
* Database=DBMIRROR
* LastUser=scosolo
* Trusted_Connection=Yes
GlobalCar
* DBQ=C:\Programmi\Macromedia\Dreamweaver MX\Samples\Database\global.mdb
* Description=Data Source for the Compass Travel tutorial site.
* Driver=C:\WINDOWS\system32\odbcjt32.dll
* DriverId=25
* FIL=MS Access;
* SafeTransactions=0
* UID=
ODBC Data Sources
* DBMIRROR=SQL Native Client
* GlobalCar=Microsoft Access Driver (*.mdb)
* PUBS=SQL Native Client
* 4UAHR=SQL Native Client
ODBC File DSN
* DefaultDSNDir=C:\Programmi\File comuni\ODBC\Data Sources
PUBS
* Driver=C:\WINDOWS\system32\sqlncli.dll
* Description=Connect to Pubs Database
* Server=4unb10
* Database=pubs
* LastUser=scosolo
* Trusted_Connection=Yes
------------------------------

Quelle contrassegnate in Azzurro, sono le origini dati ODBC di sistema inserite sul mio PC, ciascuna contiene al suo interno come valori le seguenti informazioni:

Il Driver, usualmente una DLL che si trova su WINDOWS\System32, poi dei parametri diversi a seconda del tipo di driver, in questo caso sono di 2 soli tipi, driver per SQL Server 2005 e il driver per il tutorial di DreamWeaver MX che invece è un file access. Ogni origine dati ha una Descrizione, ed alcuni parametri variabili che permettono al driver di comporre la stringa di connessione a quel tipo di sorgente dati.

Le chiavi contrassegnate in Rosso, non sono origini dati, sono invece delle chiavi di configurazione per la gestione degli ODBC, infatti, ODBC Data Sources contiene la lista degli ODBC con il nome del driver ad essi associato, mentre  ODBC File DSN contiene la cartella che ospita i DSN salvati su file.

Il secondo bottone btn_LeggiODBCUsr, fa qualcosa di simile a quel che fa il primo bottone, però, invece di partire da LocalMachine, parte da CurrentUser, l'oggetto che rappresenta i dati di configurazione del registro per l'utente correntemente loggato. Questo, ci permette di ottenere ed osservare, i dati di configurazione ODBC utente.

        private void btnLeggiODBCUsr_Click(object sender, EventArgs e)
        {
            RegistryKey regKeyUsr = Registry.CurrentUser.CreateSubKey("Software\\ODBC\\ODBC.INI");
            StringBuilder sb = new StringBuilder();
            sb.AppendLine(new string('-', 30));
            sb.AppendLine("Lista ODBC utente trovati:");
            string[]  keys = regKeyUsr.GetSubKeyNames();
            for (int i = 0; i < keys.Length; i++)
            {
                sb.AppendLine(keys[i]);
                RegistryKey odbcKey = regKeyUsr.OpenSubKey(keys[i]);
                string[] valueNames = odbcKey.GetValueNames();
                for (int j = 0; j < valueNames.Length; j++)
                {
                    sb.AppendFormat("* \t {0}={1}", valueNames[j], odbcKey.GetValue(valueNames[j]).ToString());
                    sb.AppendLine();
                }
            }
            sb.AppendLine(new string('-', 30));
            sb.AppendLine();

            this.txtResult.Text = sb.ToString() + this.txtResult.Text;

        }

Anche questo metodo, come il precedente utilizza le classi Registry, RegistryKey, ed i metodi CreateSubKey, GetSubKeyNames, OpenSubKey, GetValueNames, GetValue per ottenere le informazioni sul contenuto della chiave del Registry e dei suoi sottolivelli che a noi interessano.

Cosa otteniamo premendo il tasto sulla form?

------------------------------
Lista ODBC utente trovati:
ahrdemo
* Driver=C:\WINDOWS\system32\SQLSRV32.dll
* Description=ADHOC REVOLUTION
* Server=(local)
* Database=ahrdemo
* LastUser=sa
* Trusted_Connection=Yes
dBASE Files
* UID=
* SafeTransactions=0
* DriverId=533
* Driver=C:\PROGRA~1\FILECO~1\MICROS~1\OFFICE12\ACEODBC.DLL
Excel Files
* UID=
* SafeTransactions=0
* DriverId=1046
* Driver=C:\PROGRA~1\FILECO~1\MICROS~1\OFFICE12\ACEODBC.DLL
MS Access Database
* UID=
* SafeTransactions=0
* DriverId=25
* Driver=C:\PROGRA~1\FILECO~1\MICROS~1\OFFICE12\ACEODBC.DLL
ODBC Data Sources
* Visio Database Samples=Microsoft Access Driver (*.MDB)
* ahrdemo=SQL Server
* dBASE Files=Microsoft Access dBASE Driver (*.dbf, *.ndx, *.mdx)
* Excel Files=Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)
* MS Access Database=Microsoft Access Driver (*.mdb, *.accdb)
Visio Database Samples
* SafeTransactions=0
* DefaultDir=""
* DBQ=C:\PROGRA~1\MICROS~2\Visio11\1040\DBSAMPLE.MDB
* DriverId=25
* Driver=C:\WINDOWS\system32\\odbcjt32.dll
* UID=
* ReadOnly=System.Byte[]
------------------------------

Anche in questo caso, in Blu abbiamo gli ODBC utente memorizzati sulla macchina e invece in rosso abbiamo la chiave ODBC Data Sources che contiene la lista degli ODBC ed il nome del driver ad essi associato.

Facciamo il riassunto di quello che abbiamo scoperto con la scusa della gestione degli ODBC:

  • Il namespace Microsoft.Win32 che contiene classi per la gestione del sistema
  • la classe statica Registry che fornisce proprietà che danno accesso alle principali chiavi del registro di sistema
    • LocalMachine Proprietà statica che fornisce l'accesso a HKey Local Machine
    • CurrentUser Proprietà statica che fornisce l'accesso a HKey Current User
  • la classe RegistryKey che permette di aprire e leggere una chiave di registro e ottenere informazioni o fare modifiche sulla chiave letta.
  • il metodo CreateSubKey che permette di aprire una chiave esistente sul registro oppure di generarne una nuova.
  • il metodo GetSubKeyNames che permette di ottenere una lista delle sottochiavi di una chiave di registro (se ne è provvista)
  • il metodo GetValueNames che permette di ottenere una lista dei nomi dei valori di una chiave di registro (se ne è provvista)
  • il metodo GetValue che permette di ottenere il valore di un valore (uff!) di una chiave di registro.

Nel prossimo post, proveremo a generare una origine dati ODBC nuova e vedere l'effetto che fa...

Tags: ,

Print | posted on lunedì 24 marzo 2008 18.58

Feedback

No comments posted yet.

Your comment:





 
Please add 7 and 8 and type the answer here:

Copyright © Sabrina C.

Design by Bartosz Brzezinski

Design by Phil Haack Based On A Design By Bartosz Brzezinski