TheTruster's Box

  • Increase font size
  • Default font size
  • Decrease font size
Home Programmazione Articoli Gestire la password di un Database Access in Visual Basic 6

Gestire la password di un Database Access in Visual Basic 6

E-mail Stampa PDF

Un po' di tempo fa, durante lo sviluppo di un'applicazione, ho avuto l'esigenza di gestire in modo "manageriale" un database Access.
Per gestione manageriale intendo che, l'applicazione che stavo sviluppando, non doveva gestire i dati presenti nel DB (o almeno, non solo), piuttosto era necessario analizzarne la struttura e, se il caso, modificarla.
Da qui è nata la necessità di consentire all'utente anche la possibilità di attribuire una password ad un DB che non la possedeva, o di eliminarla se questa era presente o, ancora, di modificare quella esistente a favore di un'altra.

Tengo a precisare che questa non è una guida per eliminare in modo illegale la password di un DB Access - visto che la password, se impostata, deve essere nota - ma solo un modo per gestire da codice delle operazioni che, normalmente, sarebbe necessario svolgere direttamente sul DB, con l'obbligatoria presenza del pacchetto Office installato sulla macchina in uso.


Quello che ci consentirà di inserire/modificare/cancellare la password dal nostro .mdb è il modello ad oggetti della libreria ADO, ovvero la Microsoft ActiveX Data Object 2.8. Ricordiamoci di referenziarla tra i riferimenti del nostro progetto, una volta aperto Visual Basic 6.

In realtà ADO è solo un "mezzo" e di per sè non possiede la possibilità di agire direttamente sulla password del DB, piuttosto ci servirà da tramite per lanciare verso il DB delle frasi SQL atte a variare la password dello stesso. Per "variare" si intende ovviamente una qualsiasi tra le operazioni di mofifica, inserimento o cancellazione.

Una cosa importante è che, per agire sullo stato della password, il DB Access deve essere aperto in modalità esclusiva, quindi è un'operazione che andrebbe fatta al difuori delle normali attività eseguite su un DB: inserimento, cancellazione e modifica dei dati presenti nelle tabelle.

Tornando all'esigenza oggetto di questo articolo, per facilitarmi il compito e rendere il codice sorgente dell'applicazione più flessibile e ordinato, ho pensato di creare una Classe, contenente proprietà e metodi che permettono, in maniera immediata, di raggiungere le funzioni che ci servono per aprire e chiudere il DB e, di conseguenza, variarne la password. La Classe, è stata ridotta all'essenziale, visto che viene presentata al solo scopo dimostrativo di questa particolare esigenza, ma ritengo che con un minimo di impegno si possa espandere, per includervi ulteriori funzionalità e caratteristiche.

Le proprietà della Classe:

  • DBProvider, consente di specificare un provider diverso da quello già impostato di default, ovvero il Microsoft Jet OLEDB 4.0;
  • DBName, è il nome completo di percorso del DB sul quale intendiamo agire;
  • DBPassword, è la password da specificare se questa è eventualmente già posseduta dal DB da aprire;
  • DBCursor, rappresenta il tipo di cursore che si intende utilizzare per aprire il DB. Quello di default è "Lato Server";
  • DBConnection, di sola lettura, consente di ricevere il riferimento alla connessione del DB aperto. Questo consente di sfruttare questo oggetto per necessità diverse da quelle che si prefigge la Classe, ad esempio per aprire un Recordset o per lanciare una SQL attraverso il metodo Execute.


I metodi della Classe:

  • OpenDB, attraverso il quale valorizzando il parametro Exclusive, è possibile aprire il DB in modalità esclusiva. Diversamente verrà aperto in modalità condivisa;
  • CloseDB, chiude la connessione attiva;
  • AddDBPassword, aggiunge una password al DB (richiede una nuova password)
  • ChangeDBPassword, cambia la password esistente (richiede vecchia e nuova password)
  • RemoveDBPassword, rimuove la password esistente (richiede la password corrente)


Per inserire il codice sotto riportato, basta seguire i seguenti passi:

  • Aprire un nuovo progetto Visual Basic 6;
  • Referenziare la Microsoft ActiveX Data Object 2.8 (Progetto > Riferimenti...);
  • Aggiungere un Modulo di Classe (Progetto > Inserisci modulo di classe);
  • Copiare il codice nel modulo debitamente rinominato in cDBManaging.


Dim m_DBName As String
Dim m_DBPassword As String
Dim m_DBCursor As ADODB.CursorLocationEnum
Dim m_DBConnection As ADODB.Connection
Dim m_DBProvider As String
'_________________________________________________________________
Const sProvider As String = "Microsoft.Jet.OLEDB.4.0"
 
Function OpenDB(Optional Exclusive As Boolean = False) As Boolean
 
Dim cnString As String
 
On Error GoTo Open_Error
 
connString = "Provider=" & m_DBProvider & "; " & _
             "Data Source=" & m_DBName & "; " & _
             "Jet OLEDB:" & _
             "Database Password=" & m_DBPassword & ";"
 
If Not m_DBConnection Is Nothing Then
    If m_DBConnection.State = adStateOpen Then
        m_DBConnection.Close
    End If
End If
 
Set m_DBConnection = New ADODB.Connection
 
If Exclusive Then
    m_DBConnection.Mode = adModeShareExclusive
End If
 
m_DBConnection.CursorLocation = m_DBCursor
m_DBConnection.Open connString
OpenDB = True
 
Exit Function
 
Open_Error:
OpenDB = False
 
End Function
'_________________________________________________________________

Function CloseDB() As Boolean
 
On Error GoTo Close_Error
 
If Not m_DBConnection Is Nothing Then
    If m_DBConnection.State = adStateOpen Then
        m_DBConnection.Close
        Set m_DBConnection = Nothing
    End If
End If
 
CloseDB = True
 
Exit Function
 
Close_Error:
CloseDB = False
 
End Function
'_________________________________________________________________

Property Let DBName(ByVal new_Value As String)
m_DBName = new_Value
End Property
'_________________________________________________________________

Property Get DBName() As String
DBName = m_DBName
End Property
'_________________________________________________________________

Property Let DBPassword(ByVal new_Value As String)
m_DBPassword = new_Value
End Property
'_________________________________________________________________

Property Get DBPassword() As String
DBPassword = m_DBPassword
End Property
'_________________________________________________________________

Property Let DBCursor(ByVal new_Value As ADODB.CursorLocationEnum)
m_DBCursor = new_Value
End Property
'_________________________________________________________________

Property Get DBCursor() As ADODB.CursorLocationEnum
DBCursor = m_DBCursor
End Property
'_________________________________________________________________

Property Let DBProvider(ByVal new_Value As String)
m_DBProvider = new_Value
End Property
'_________________________________________________________________

Property Get DBProvider() As String
DBProvider = m_DBProvider
End Property
'_________________________________________________________________

Property Get DBConnection() As ADODB.Connection
Set DBConnection = m_DBConnection
End Property
'_________________________________________________________________

Private Sub Class_Initialize()
DBCursor = adUseServer
DBProvider = sProvider
End Sub
'_________________________________________________________________

Function AddDBPassword(NewPassword As String) As Boolean
 
On Error GoTo Err_Handling
 
Dim sCommand As String
 
If DBConnection.Mode <> adModeShareExclusive Then
    AddDBPassword = False
    Exit Function
End If
 
sCommand = "ALTER Database Password `" & NewPassword & "` ``"
DBConnection.Execute sCommand
AddDBPassword = True
 
Exit Function
 
Err_Handling:
AddDBPassword = False
 
End Function
'_________________________________________________________________

Function RemoveDBPassword(CurrentPassword As String) As Boolean
 
On Error GoTo Err_Handling
 
Dim sCommand As String
 
If DBConnection.Mode <> adModeShareExclusive Then
    RemoveDBPassword = False
    Exit Function
End If
 
sCommand = "ALTER Database Password `` `" & CurrentPassword & "`"
DBConnection.Execute sCommand
RemoveDBPassword = True
 
Exit Function
 
Err_Handling:
RemoveDBPassword = False
 
End Function
'_________________________________________________________________

Function ChangeDBPassword(CurrentPassword As String, NewPassword As String) As Boolean
 
On Error GoTo Err_Handling
 
Dim sCommand As String
 
If DBConnection.Mode <> adModeShareExclusive Then
    ChangeDBPassword = False
    Exit Function
End If
 
sCommand = "ALTER Database Password `" & NewPassword & "` `" & CurrentPassword & "`"
DBConnection.Execute sCommand
ChangeDBPassword = True
 
Exit Function
 
Err_Handling:
ChangeDBPassword = False
 
End Function

L'uso della classe è molto semplice e bastano poche righe per aprire un DB ed agire sulla password.

Per prima cosa la classe va dichiarata, normalmente è meglio inserire questa riga nella sezione dichiarazioni del modulo:

Dim myDB As cDBManaging
Poi possiamo passare all'utilizzo vero e proprio, istanziandola e valorizzandone le proprietà che ci servono:

Set myDB = New cDBManaging
 
With myDB
    .DBCursor = adUseClient
    .DBName = "C:\PercorsoDelDB\NomeDelDatabase.mdb"
    .DBPassword = "Password"  'Obbligatoria, nel caso il DB ne possegga già una
    If Not .OpenDB(True) Then  'Apro in modalità esclusiva
        MsgBox "Si è verificato un errore nell'apertura del DB"
    End If
End With
Per aggiungere una password:

myDB.AddDBPassword "NuovaPassword"
Per variare la password esistente con una nuova:

myDB.ChangeDBPassword "VecchiaPassword", "NuovaPassword"
Per eliminare la password:

myDB.RemoveDBPassword "VecchiaPassword"

Tutte i metodi, restituiscono un valore booleano attraverso il quale è possibile controllare la buona riuscita dell'operazione, come nel caso della OpenDB. In quel caso il valore booleano viene utilizzato per determinare se il DB è stato aperto oppure no, nel qual caso, viene rilasciato un avviso all'utente.

Nel caso abbiate dubbi od osservazioni, non esitate a proporre i vostri commenti. Occhiolino

 

Commenti  

 
0 #1 2011-05-14 19:34
La classe usata è molto interessante per poter eseguire le operazioni sulla passaword. Ho copiato la prima parte in un modulo nominandolo come richiesto, ma poi.... tutto il resto a partire da "Dim myDB As cDBManaging" in poi dove deve essere inserito? Come faccio da form a richiamare la classe?. E' possibile avere un sorgente per poter capire meglio?. Grazie, nell'attesa invio i miei saluti.
N.B. La risposta mi è indispensabile
Citazione
 
 
0 #2 TheTruster 2011-05-14 20:51
Ciao Leo,
Il codice necessario ad istanziare la Classe (quello da Dim myDB As cDBManaging in poi) puoi inserirlo dove più ti serve, sia direttamente nel Form dal quale intendi usarlo, o in un Modulo, magari dentro una Sub da richiamare da altri punti del progetto.

Se inserisci il codice nel Form, ovviamente devi inserirlo in una routine di evento, ad esempio nell'evento click di un pulsante.
Citazione
 

Aggiungi commento

Si prega di aggiungere commenti in tema.
Sono assolutamente vietati messaggi volgari, pubblicitari e/o promozionali.
I commenti ritenuti non conformi saranno rimossi.


Codice di sicurezza
Aggiorna

Sondaggio

Cosa vorresti vedere di più su TheTruster's Box?
 

Utenti on-line

 2 visitatori online

MasterDrive.it



Aggiungi TheTruster's Box ai preferiti!