twitter.com/masterdriveit Google+ facebook.com/MasterDrive.it
+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 2 su 2

Discussione: [Access 2003 / VBA] uso TransferDatabase acLink

  1. #1
    L'avatar di liodevac
    liodevac non è in linea Scolaretto
    Iscritto il
    16-06-2010
    Luogo
    Puglia
    Posts
    375

    [Access 2003 / VBA] uso TransferDatabase acLink

    salve vi chiedo una spiegazione se possibile ad un impedimento che ho in una applicazione .mde, divisa BE su server - FE su pc client; l'applicazione comprende una serie di utenti (quindi c'è un file Protezione.mdb, creato con procedura standard di Access - il wizard) di cui due qualificati come amministratori e due come utenti completi.
    la procedura serve ad aggiornare il percorso di collegamento delle tabelle collegate (quello che fa la funzione 'Gestione tabelle collegate' da menù access), dopo aver fatto selezionare all'utente il file dei dati.
    il problema è che gli utenti amministratori riescono ad eseguire e concludere la procedura, mentre per gli altri utenti ne esce come se ci fosse errore con il messaggio prefissato da me "Impossibile connettersi al Server":...perché? forse perché appunto solo utenti amministratori possono eseguire quel comando?...e se sì che alternative ho?

    riporto codice che sto usando, non creato da me ma preso leggendo in questo forum e su sito Alex:

    in un modulo separato:
    codice:
    Option Compare Database
    Option Explicit
    
    Public Const fTabella = "Tables"
    Public Const cLnkTbl As String = "_LinkedTables"
    
    Public Function LinkTbl(pthbe As String) As Boolean
    On Error GoTo Err_LinkTbl
    Dim rs As DAO.Recordset
    Dim strsql As String
    Dim dbCurr As DAO.Database
    Dim S As String
    Dim mPathBE As String
    
        mPathBE = pthbe
        LinkTbl = False
        Set dbCurr = CurrentDb
        strsql = cLnkTbl
        dbCurr.TableDefs.Refresh
        Set rs = CurrentDb.OpenRecordset(strsql)
        rs.MoveFirst
        Do Until rs.EOF
            S = rs.Fields(0).Value
            If Esiste_Oggetto(S, fTabella) Then CurrentDb.TableDefs.Delete S
            DoCmd.TransferDatabase acLink, "Microsoft Access", pthbe, acTable, S, S
            rs.MoveNext
        Loop
        LinkTbl = True
    
    Exit_Here:
        rs.Close
        Set rs = Nothing
        Exit Function
    Err_LinkTbl:
        LinkTbl = False
        MsgBox "Impossibile connettersi al Server"
        Resume Exit_Here
    End Function
    
    Public Function Esiste_Oggetto(ByVal Nome_Ogg As String, _
    Typ_Ogg As String, Optional ByVal Nome_Dbs As String = "") As Boolean
    '*****************************************************************
    'Name : Esiste_Oggetto (Function)
    'Purpose : Verifie if Database Object(Table, Query, Form or ...) Exist
    'Inputs : String=Object Name
    ' : Type="Tables" or "Forms" or "Queries"
    ' : "Scripts" or "Reports" or "Modules"
    ' : Nome_Dbs=Database.mdb (Source where Function search)
    'Output : True if Object Exist
    '*****************************************************************
    Dim dbs As Database
    Dim tdf As TableDef
    Dim qdf As QueryDef
    Dim X, num_ogg As Integer
    
        If Nome_Dbs = "" Then
            Set dbs = CurrentDb
        Else
            Set dbs = OpenDatabase(Nome_Dbs)
        End If
        Select Case Typ_Ogg
        Case fTabella
            For Each tdf In dbs.TableDefs
                If tdf.Name = Nome_Ogg Then
                    Esiste_Oggetto = True
                    dbs.Close
                    Set dbs = Nothing
                    Exit Function
                End If
            Next tdf
        End Select
    
    Esci:
        Esiste_Oggetto = False
        dbs.Close
        Set dbs = Nothing
    End Function
    poi su una form c'è un controllo button che al click prima apre una finestra di selezione percorso di un file, e poi "cattura" la stringa (strFile) e la usa nella funzione di cui sopra:
    codice:
    Call LinkTbl(strFile)
    grazie in anticipo.

  2. #2
    L'avatar di @Alex
    @Alex non è in linea Very Important Person
    Iscritto il
    06-02-2007
    Luogo
    Mantova
    Posts
    9,713
    Dipende proprio da come hai gestito la sicurezza utente...!
    Di solito infatti quando si usa la sicurezza Utente la procedura di LINK delle tabelle è diversa... serve loggarsi al BE come Utente Autorizzato al Link, si genera la connessione usando gli Oggetti del Database
    quindi si distruggono detti Oggetti.

    Certo che se non hai declassato l'ADMIN la protezione è fatta a metà...!

    In tutti i modi gestire la protezione utenti con la gestione MDW è discretamente complesso nel contesto....

    Questo codice ti consente di aprire il file MDE appoggiandoti al file di sicurezza MDW:
    codice:
    Sub OpenDBWithNewWorkgroupFile(strPathToFile As String, _
         strDefaultUser As String, _
         strDefaultPwd As String, _
         strPathToDatabase As String)
           ' This function uses the unsupported PrivDBEngine object to
           ' open a database using a different workgroup information file
           ' than the one being used as the default. You might do this if
           ' you want to access data that is in a encrypted database that uses
           ' a different workgroup information file.
           
           Dim dbe As PrivDBEngine
           Dim wrk As Workspace
           Dim dbs As Database
           
           ' Return a reference to a new instance of the PrivDBEngine object.
           Set dbe = New PrivDBEngine
           ' Set the SystemDB property to specify the workgroup file.
           dbe.SystemDB = strPathToFile  ' Questo è il FileProtezione.MDW
           dbe.DefaultUser = strDefaultUser
           dbe.DefaultPassword = strDefaultPwd
           Set wrk = dbe.Workspaces(0)
           ' Open the secured database.
           Set dbs = wrk.OpenDatabase(strPathToDatabase)
       End Sub
    Ovviamente non userai [TransferDatabase] ma CreateTableDef con attributo acLink(se non ricordo male) basato sull'oggetto dbs aperto usando la protezione utenti...!
    Di base però fai attenzione che in teoria nessun UTENTE dovrebbe avere la possibilità di LINKARE le tabelle.
    Dovresti creareti uno USER con i privilegi di ADMIN, ma devi Declassare l'ADMIN a normal user rimuovendo tutti i privilegi...!
    Solo l'utente Speciale deve poter Linkare le Tabelle, e lo fai con quello che ti ho cercato di spiegare sopra... da codice ovviamente.

    Perchè questo... perchè se non declassi ADMIN, quando ripristini il SYSTEM.MDW(operazione da fare doverosamente) l'admin che è il DefaultUser può aprire il tuo MDE/MDB e danneggiarlo...!
    Eì vero infatti che quando si gestisce la sicurezza tramite MDW il Link di apertura del file MDE deve riportare l'estensione per il riferimento al file MDW, altrimenti
    verrebbe usato il Default(MDW) che è il SYSTEM, e non si potrebbe avere la gestione USERS.

    Siccome ripristinare il SYSTEM.MDW è una cosa banale... va da se che tu debba prevenire l'attentato...

    Ora sono 10 anni che non uso più queste tecniche quindi magari mi perdo qualche pezzetto... ma la cosa è come ho cercato di spiegarti.

    Mi chiedo se sei certo di avere le idee chiare di come si gestisce il sistema di protezione con MDW, perchè è una cosa molto scomoda ed io no ho mai
    avuto molto piacere usarla... oltretutto la sicurezza è minima, in quanto dovendo distribuire il fileprotetto.MDW risulta semplice scoprire USERS e PWD...!
    Ultima modifica di @Alex; 23-02-2011 22:46 
    @Alex
    Il CROSSPOST è VIETATO
    Mirror al vecchio sito WEB(salvare i Demo riassegnando l'estensione (.Zip/.Rar/.Exe in base all'icona...):
    http://mirror.masterdrive.it/alessandrobaraldi/
    Leggi il
    Regolamento del Forum e nel comprenderne la filosofia rispettalo.

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi