40
MICROSOFT ® ACCESS BEVEILIGING FAQ Goos van Beek Pagina 1 van 40 ‘Veelgestelde vragen’ over Microsoft ® Access Security voor Microsoft ® Access versies 2.0 tot en met 2000 Version 2.41 October, 2000 Door Mary Chipman, Andy Baron, Chris Bell, Michael Kaplan, Paul Litwin, and Rudy Torrico Vertaald aan de hand van: http://support.microsoft.com/default.aspx?scid=/support/access/content/secfaq.asp Mocht je (vertaal) fouten ontdekken, mail me dan even: [email protected] Introductie Deze ‘veelgestelde vragen’ zijn oorspronkelijk opgesteld om de beveiliging met betrekking tot Microsoft Access versies 2.0 tot en met 97 te omschrijven. Echter, de basis principes zijn onveranderd gebleven voor Microsoft Access 2000 en hoger. Bijna alle FAQ onderwerpen die betrekking hebben op Access 97 zijn ook op Access 2000 en hoger van toepassing. Lees voor ‘Access 2000’ dus ‘Access 2000 en hoger’ Wanneer je na het lezen van deze FAQ vragen of opmerkingen hebt kun je die posten in de Access.Security sectie van de Microsoft Public Newsgroups (msnews.microsoft.com) of je kunt contact opnemen met Microsoft Access Technical Support.

MS Access Security FAQ NL

Embed Size (px)

Citation preview

Page 1: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 1 van 40

‘Veelgestelde vragen’ over Microsoft® Access Security voor Microsoft® Access versies 2.0 tot en met 2000

Version 2.41 October, 2000

Door Mary Chipman, Andy Baron, Chris Bell, Michael Kaplan, Paul Litwin, and Rudy Torrico

Vertaald aan de hand van: http://support.microsoft.com/default.aspx?scid=/support/access/content/secfaq.asp Mocht je (vertaal) fouten ontdekken, mail me dan even: [email protected]

Introductie

Deze ‘veelgestelde vragen’ zijn oorspronkelijk opgesteld om de beveiliging met betrekking tot Microsoft Access versies 2.0 tot en met 97 te omschrijven. Echter, de basis principes zijn onveranderd gebleven voor Microsoft Access 2000 en hoger. Bijna alle FAQ onderwerpen die betrekking hebben op Access 97 zijn ook op Access 2000 en hoger van toepassing.

Lees voor ‘Access 2000’ dus ‘Access 2000 en hoger’

Wanneer je na het lezen van deze FAQ vragen of opmerkingen hebt kun je die posten in de Access.Security sectie van de Microsoft Public Newsgroups (msnews.microsoft.com) of je kunt contact opnemen met Microsoft Access Technical Support.

Page 2: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 2 van 40

1. Welke stappen moet je nemen om een database te beveiligen? Het proces om een database te beveiligen is voor alle versies van Access hetzelfde. Alleen is bij de oudere versies vanaf Access 95 de ‘Security wizard’ in het product íngebouwd, en vanaf Access 2000 kan de ‘Security wizard’ alle stappen uitvoeren, met inbegrip van het aanmaken van een nieuw werkgroepinformatiebestand. Je kunt er voor kiezen om de wizard te gebruiken, of om de database ‘handmatig’ te beveiligen.

1. Gebruik het Werkgroepbeheer programma (Wrkgadm.exe) om een nieuw werkgroepinformatiebestand te maken. Schrijf de gegevens Naam, Organisatie en Werkgroep-id op wanneer gevraagd wordt deze in te vullen bij het aanmaken van een nieuw werkgroepinformatiebestand, en bewaar deze gegevens op een veilige plaats. Wanneer je het werkgroepinformatiebestand op één of andere manier kwijtraakt, of het raakt beschadigd kun je alleen maar met deze identieke gegevens een nieuw werkgroepinformatiebestand aanmaken. Deze gegevens worden dan gecodeerd tot een unieke tekenreeks. Zonder het goede werkgroepinformatiebestand is het denkbaar dat je database voor altijd ontoegankelijk is. Een andere reden om deze informatie goed te bewaren is dat je deze gegevens nodig hebt wanneer je een beveiligde Access database wil ‘upgraden’ naar een hogere versie. De aanbevolen manier is om eerst een nieuw werkgroepinformatiebestand te maken in de nieuwe Access versie, en daarna de upgrade op de database zelf uit te voeren.

2. Werkgroepbeheer schakelt je automatisch naar het nieuwe werkgroepinformatie bestand. Start Access en open een database.

3. Je wordt aangelogd als gebruiker met de naam Beheerder. Gebruik in het Beveiliging menu opties om een wachtwoord aan Beheerder toe te wijzen. De Beheerder account is de standaard account, en door een wachtwoord aan dit account toe te wijzen vraagt Access bij de volgende start naar de naam en het wachtwoord van de gebruiker.

4. Maak nu een nieuwe gebruiker s account aan. Dit ga je gebruiken om de database te beveiligen.Voeg deze nieuwe gebruiker toe aan de Beheerder groep. Schrijf de gegevens die je gebruikt als Naam en Pincode weer op voor het geval dat je ooit een nieuw werkgroepinformatiebestand moet maken. De Pincode is NIET het wachtwoord. Het is een tekenreeks die samen met de Naam gebruikt wordt om een unieke tekenreeks te creëren, de SID (System IDentifier). Deze tekenreeks wordt gebruikt om de gebruiker te identificeren.

5. Sluit Microsoft Access af en log opnieuw in met het nieuwe gebruikersaccount wat je onder punt 4 hebt aangemaakt. Je hebt nog geen wachtwoord nodig voor dit account, (de Pincode die je bij 4 hebt opgegeven is niet het wachtwoord), het is nu het moment om dit te doen.

6. Verwijder de ‘standaard’ Beheerder uit de Beheerdersgroep, zodat de Beheerder alleen nog lid is van de gebruikers groep. De Beheerder account heeft geen ‘Beheer functies’ ingebouwd. Deze worden toegewezen door het lidmaatschap van de Beheerders groep. Hoewel je geen van de ingebouwde gebruikers of groepen (Beheerder, Beheerders en Gebruikers) kunt wissen, kun je gebruikers aan de Beheerders groep toevoegen of verwijderen, en de rechten beperken door toevoegen van gebruikers aan de gebruikers groep.

7. Open de database die je wilt beveiligen en start de ‘Wizard beveiliging op gebruikers niveau’. Selecteer de objecten die je wilt beveiligen. (Het is zaak om alles te beveiligen). De wizard maakt een nieuwe database, waarvan de (eerder nieuw aangemaakte) beheerder eigenaar is, en importeert alle objecten en relaties. De wizard verwijdert ook alle rechten van de standaard Beheerder en van de gebruikers groepen, en codeert de nieuwe database. De originele database wordt niet aangepast/veranderd. De Access 2000 Wizard maakt geen nieuwe database, maar maakt een back-up van de originele. Een nadeel van

Page 3: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 3 van 40

deze methode is dat niet alle rechten om de database te openen worden verwijderd bij de standaard Beheerder en de gebruikersgroep, ook al lijkt het alsof deze verwijderd zijn.

8. Open de nieuwe database. Omdat de wizard alle rechten van de Gebruikersgroep heeft verwijderd moet je zelf een nieuwe ‘Gebruikers groep’ aanmaken voor beveiligde objecten, en de rechten aan deze groep toewijzen. Iedere gebruiker moet lid zijn van de gebruikers groep, anders kunnen ze Microsoft Access niet opstarten. Wijs alleen rechten toe aan de Gebruikersgroep die iedereen (gebruikers) nodig heeft. Leden van de Beheerders groep hebben onherroepelijke toegang tot het beheren van database objecten. Wees dus voorzichtig met het toewijzen van Beheerders rechten.

9. Maak je eigen gebruikers en plaats deze in de groep met de voor hen toepasselijke rechten. Wijs geen directe rechten toe aan gebruikers omdat dit moeilijk te beheren is. Gebruikers krijgen de rechten mee uit de groep waartoe ze behoren. Het is gemakkelijker om de rechten van een groep te controleren dan die van individuele gebruikers. Wanneer een gebruiker lid is van verschillende groepen dan gelden de rechten van al deze groepen, plus de individueel toegewezen rechten. Er is geen mogelijkheid om rechten te weigeren aan een gebruiker die lid is van een groep die deze rechten wel heeft.Wanneer je specifieke rechten aan één gebruiker toe wilt wijzen maak je een aparte gebruikersgroep en wijs de rechten daar toe; voeg vervolgens deze gebruiker toe aan die specifieke groep. De reden is dat wanneer die éne gebruiker vertrekt en er een andere voor in de plaats komt je geen moeite hoeft te doen om de juiste rechten toe te wijzen.

10. Tot slot moeten de rechten database Openen/Uitvoeren handmatig van het database object verwijderd worden voor de gebruikersgroepen via het beveiligingsmenu, of via code. Dit voorkomt dat iemand de database opent terwijl gebruik wordt gemaakt van een ander werkgroepinformatiebestand, of van de standaard system.mdw/mda. In Microsoft Access 97 wordt verondersteld dat de Beveiliging Wizard de rechten database Openen/Uitvoeren verwijderd, maar dat is niet het geval. De Access 2000 Wizard lijkt deze rechten wel te verwijderen, maar testen hebben uitgewezen dat, hoewel verwijderd in het beveiligingsmenu, deze rechten niet verwijderd zijn, en de database geopend kan worden door gebruik te maken van een ander werkgroepinformatie bestand. De enige manier om dit te verhelpen bij Access 97 en Access 2000 is om een nieuwe, lege database te maken, ingelogd als Beheerder en alle objecten te importeren uit de beveiligde database. Voer dit uit voordat je teveel tijd steekt in het toewijzen van rechten op objecten. Wanneer objecten geïmporteerd worden krijgen ze in Access de status nieuw en verdwijnt de rechteninformatie die is opgeslagen in de brondatabase.

Onderstaande tabel geeft de standaard namen en locaties van het werkgroepinformatiebestand en het Werkgroepbeheer programma. Versie Werkgroepbestandsnaam

(standaard) Werkgroepbestandlocatie Wrkgadm.Exe locatie

2.0 System.mda C:\Access C:\Access 95 System.mdw C:\MSOffice\Access C:\MSOffice\Access 97 System.mdw C:\Windows\System C:\Windows\System 2000 System.mdw \Program Files\Common

Files\System \Program Files\MicrosoftOffice\Office\1043

Opmerking: 1043 is de standaard map voor de Nederlandse versie van Access

Page 4: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 4 van 40

2. Kort samengevat, hoe werkt Microsoft Access beveiliging? De Microsoft Jet database engine, die Microsoft Access gebruikt om gegevens en objecten op te slaan en te weer te geven, gebruikt een beveiligingsmodel gebaseerd op een werkgroep. Altijd wanneer de Jet database engine in bedrijf is, zoekt deze naar een werkgroepinformatiebestand, waarin de informatie ligt opgeslagen m.b.t. gebruikers en groepen die de database kunnen openen gedurende een sessie. Iedere geldige bestandsnaam kan worden gebruikt, zoals Wrkgrp_Sec.mdw. Het werkgroepinformatiebestand bevat de namen en beveiliging ID’s van alle groepen en gebruikers in die werkgroep, inclusief de wachtwoorden. Er zijn ingebouwde groepen (Beheerders en Gebruikers) en een algemene gebruikers account (Beheerder) welke in iedere werkgroep voorkomen. Door middel van het beveiligingsmenu, of via code kunnen nieuwe groepen en nieuwe gebruikers worden toegevoegd. De Beheerders groep is altijd aanwezig, en de gebruikers van deze groep hebben Beheerders rechten. Je kunt rechten verwijderen via code of via het menu, maar iedereen met beheerders rechten kan deze wijzigingen weer ongedaan maken. Er moet altijd tenminste één lid aanwezig zijn in de Beheerders groep om de database te beheren. De standaard gebruikers account, Beheerder, wordt altijd toegewezen aan de Beheerders groep en is het standaard account waarmee iedereen wordt ingelogd bij een onbeveiligde database. De andere ingebouwde groep, Gebruikers, is een algemene groep waartoe alle gebruikers moeten behoren, ongeacht tot welke andere groep ze behoren. Het is mogelijk om een gebruiker via code aan te maken, maar die gebruiker wordt niet automatisch toegevoegd aan de groep Gebruikers. Wanneer een gebruiker niet wordt toegevoegd aan de Gebruikersgroep kan deze gebruiker Microsoft Access niet opstarten. Intern zijn vele tabellen verbonden aan de rechten van de Gebruikersgroep. Noch de gebruiker Beheerder, noch de Gebruikersgroep hebben enige ingebouwde rechten (zoals de Beheerdersgroep heeft). Het beveiligen van een database houdt in dat er een nieuw lid aan de Beheerders groep wordt toegevoegd, en dat de ingebouwde Beheerder uit deze groep verwijderd wordt. Ook worden alle rechten van de Beheerder én van de Gebruikersgroep verwijderd, en er worden nieuwe gebruikersgroepen aangemaakt met door jou gedefinieerde rechten. Rechten op de verschillende objecten in Microsoft Access kunnen direct aan gebruikers worden toegevoegd (expliciete rechten), of aan groepen. Gebruikers nemen de rechten over van de groep(en) waartoe ze behoren (impliciete rechten). Microsoft Access gebruikt de “minst beperkende” regel; gebruikers hebben de som van hun impliciete- en expliciete rechten. Met andere woorden, wanneer een gebruiker behoort tot een groep met volledige rechten en je maakt hem ook lid van een groep met minder rechten, dan behoudt hij alle rechten, omdat hij nog steeds lid is van de groep met volledige rechten. Hoewel Microsoft Access de mogelijkheid heeft om rechtstreeks rechten aan gebruikers toe te wijzen wordt dit afgeraden, omdat het moeilijk te beheren is. Gebruikers- en groepsinformatie, inclusief wachtwoorden worden opgeslagen in het werkgroepinformatiebestand, het system.mda/mdw, wat de gebruiker logons verifieert tijdens opstarten. Rechten op individuele objecten zijn opgeslagen in de database zelf. Je kunt de gebruikers en groepen binnen de werkgroep rechten toekennen op verschillende niveaus, zoals Openen/Uitvoeren, Ontwerp lezen, Ontwerp wijzigen, Toevoegen en wissen van objecten in de database. Je kunt bijvoorbeeld gebruikers van een bepaalde groep rechten geven om bepaalde tabellen te lezen, en andere niet, of je kunt gebruikers uit een bepaalde groep het recht geven om bepaalde formulieren te lezen, maar niet om het ontwerp aan te passen. Het toekennen van een wachtwoord aan de standaard Beheerder gebruiker activeert het inlog dialoogvenster, zodat gebruikers verplicht worden een geldige gebruikersnaam en wachtwoord in te voeren zodra Access opgestart wordt. Wanneer je geen wachtwoord opgeeft, zullen alle gebruikers ingelogd worden als Beheerder (zonder wachtwoord) en zul je nooit het inlog

Page 5: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 5 van 40

dialoogvenster zien. Zo lijkt het alsof er geen beveiliging is, maar deze is doorzichtig zolang er geen wachtwoord wordt toegekend aan het algemene Beheerder account. Het database wachtwoord is geïntroduceerd met Microsoft Access 95. Dit is een simpel wachtwoord op de database zelf en geeft alleen gebruikers die het wachtwoord kennen toegang tot de database. Er is geen mogelijkheid om rechten toe te kennen aan gebruikers met deze eigenschap. Eigenlijk wordt het database password niet beschouwd als erg veilig. Zie hoofdstuk 4“Hoe pas ik een enkel wachtwoord toe op mijn database?” voor meer informatie over deze eigenschap.

Page 6: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 6 van 40

3. Wat is er veranderd in Microsoft Access beveiligingen (2.0, 95, 97, en 2000)?

1. Vanaf Microsoft Access 95 is de beveiligingwizard toegevoegd als deel van Microsoft Access. De beveiliging wizard assisteert je met het maken van een beveiligde applicatie vanuit een onbeveiligde applicatie.

2. Gebruikers kunnen groepsinformatie opvragen, ook al zijn ze geen lid van de Beheerders groep. Dit was heel moeilijk in Access 2.0 Zie hoofdstuk 22 “Hoe verkrijg programmatisch ik groep- en gebruikers informatie?”

3. In Access 95 is de dbSecReadSec constante toegevoegd om gebruikers rechten toe te kennen om beveiligingsinformatie op te vragen. Zonder deze instelling wordt het opvragen van deze informatie geweigerd. De Access 2.0 equivalent van deze constante is DB_SEC_READSEC.

4. Vanaf Access 95 worden rechten niet automatisch gereset naar <New Tables/Queries> wanneer een RefreshLink wordt uitgevoerd met een gelinkte tabel.

5. De minimale rechten die een gelinkte tabel vereist, is ‘Ontwerp Wijzigen’ in de front-end database (niet in de back-end tabel) In Microsoft Acces 2.0 was ‘Ontwerp lezen’ al voldoende.

6. Vanaf Microsoft Access 95 is er de mogelijkheid om een enkel database wachtwoord in te stellen voor het database bestand. Iedere gebruiker die lid is van de Beheerders groep, en de database eigenaar kunnen dit wachtwoord instellen. Hiervoor moet de database exclusief geopend worden.

7. Beginnend met Microsoft Access 95 is de naam van het werkgroepinformatiebestand veranderd in System.mdw in plaats van System.mda. Dit om onderscheid te maken tussen wizard- en bibliotheek databases, die nog steeds de extensie .mda gebruiken.

8. Een fout met RWOP (Run With Owner Permissions) queries toevoegen in Access 2.0, waarvoor de impliciete rechten ‘Gegevens invoeren’ voor de huidige gebruiker vereist zijn, is gecorrigeerd.

9. De wezenlijke constanten die je gebruikt bij het toepassen van beveiliging zijn veranderd, hoewel ze op elkaar lijken als je aan het formaat gewend bent. Tabel 1 toont de Microsoft Access 2.0 beveiliging constanten en de Microsoft Acces 95 tot en met de Microsoft Access 2000 beveiliging constanten.

10. In Access 2000 kunnen modules worden beveiligd door gebruik te maken van het VBA (Visual Basic® for Applications) wachtwoord, wat ingesteld kan worden vanuit de Visual Basic Editor. Kies het Extra menu, klik Eigenschappen van <project naam> en kies het tabblad Beveiliging. Beveiliging op gebruikersniveau in Access 2000 heeft niet de mogelijkheid om gebruikers toegang te weigeren tot de VBA code in modules en formulieren. Door gebruik te maken van het VBA wachtwoord kun je gebruikers verhinderen om de eigenschappen van het project te bekijken of aan te passen. Dit geld ook voor de standaard /klasse modules en voor de code achter de formulieren. Hoe dan ook, de beste manier om code te beschermen tegen bekijken/bewerken is de MDB converteren naar een MDE

11. Access 2000 heeft een extra recht toegekend aan de tabellen; de mogelijkheid om autonummer kolommen te bewerken. Hoewel er geen constanten zijn gedefinieerd voor deze rechten kun je ze wel definiëren in je eigen code.

Private Const dbSecModifyAutonumber = &HFF00

Wanneer een tabel is gemaakt in Access 2000, of een eerdere versie is geconverteerd, dan wordt deze eigenschap standaard niet ingesteld. De Access 2000 beveiligingsinterface geeft dit niet weer, net zomin als ADOX; de enige manier om dit in te stellen is via DAO beveiligingscode zoals de definitie hierboven. De Access beveiligingswizard stelt deze rechten wel in voor de speciaal aangemaakte groepen.

Page 7: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 7 van 40

Opmerking: Deze rechten staan niet toe om de referentiele integriteit te negeren; wanneer ‘cascaded updates’ niet zijn toegestaan in een opgelegde relatie, zal de update mislukken. Je moet ook voorzichtig zijn wanneer je het gebruikt omdat het effect kan hebben op de waarde die Access gaat gebruiken voor de volgende record wat in de tabel wordt ingevoegd. Om dit zelf te veranderen kun je gebruik maken van ADOX om de Seed property van de autonummer kolom aan te passen. (Zie voor meer informatie hoofdstuk 47 ”Aanvullende informatiebronnen:”)

3.1 Tabel 1: DAO Beveiligingsconstanten

DAO Security Constants

All Container/Document objects: Access 2.0 Access 95/97/2000 No permissions on object DB_SEC_NOACCESS dbSecNoAccess Full permissions on object DB_SEC_FULLACCESS dbSecFullAccess Can delete object DB_SEC_DELETE dbSecDelete Can read an object's security-related information

DB_SEC_READSEC dbSecReadSec

Can edit an object's permissions DB_SEC_WRITESEC dbSecWriteSec Can change the Owner property of an object

DB_SEC_WRITEOWNER dbSecWriteOwner

Table Container/Document objects: Can create new tables / queries DB_SEC_CREATE dbSecCreate Can read table definitions DB_SEC_READDEF dbSecReadDef Can modify or delete table definitions

DB_SEC_WRITEDEF dbSecWriteDef

Can read records DB_SEC_RETRIEVEDATA dbSecRetrieveData Can add records DB_SEC_INSERTDATA dbSecInsertData Can edit records DB_SEC_REPLACEDATA dbSecReplaceData Can delete records DB_SEC_DELETEDATA dbSecDeleteData Database Container/Document Can create new databases (valid only on the Database Container object in the workgroup file, System.mda/mdw)

DB_SEC_DBCREATE dbSecDBCreate

Can replicate database and/or change database password

N/A dbSecDBAdmin

Can open the database DB_SEC_DBOPEN dbSecDBOpen Can open the database exclusively DB_SEC_DBEXCLUSIVE dbSecDBExclusive

Access Security Constants All Container/Document objects: Access 2.0 Access 95/97/2000 Can execute form/report DB_SEC_FRMRPT_EXECUTE acSecFrmRptExecute Can read the design of form/report DB_SEC_FRMRPT_READDEF acSecFrmRptReadDef Can edit the definition of form/report

DB_SEC_FRMRPT_WRITEDEF acSecFrmRptWriteDef

Can execute macro DB_SEC_MAC_EXECUTE acSecMacExecute Can read macro definition DB_SEC_MAC_READDEF acSecMacReadDef Can edit macro DB_SEC_MAC_WRITEDEF acSecMacWriteDef Can read module definition DB_SEC_MOD_READDEF acSecModReadDef Can edit module DB_SEC_MOD_WRITEDEF acSecModWriteDef*

* In Access 2000 heeft dit recht effect op de Access gebruikers interface (je kunt bijvoorbeeld niet het OutputTo commando gebruiken) maar wordt niet ondersteund in de Visual Basic Omgeving. Daarom kunnen modules niet beveiligd worden d.m.v. Access en moet er gebruik gemaakt worden van het VBA wachtwoord, zoals besproken in hoofdstuk 3.10.

Page 8: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 8 van 40

4. Hoe pas ik een enkel wachtwoord toe op mijn database? Microsoft Access 2.0: Er is geen database wachtwoord eigenschap in Microsoft Access 2.0, dus moet je de applicatie beveiligen volgens de stappen zoals eerder besproken is. Wanneer dat klaar is wijs je rechten voor de gebruikers groep toe aan de objecten waar de gebruikers toegang toe moeten hebben. Verspreid het wachtwoord voor de Beheerder die je gedefinieerd hebt. Zorg dat de standaard Beheerder niet in de Beheerders groep staat. In Microsoft Access kunnen gebruikers zelf het eigen wachtwoord veranderen. Wanneer iemand het Beheerder wachtwoord veranderd en het wachtwoord vergeet is er geen mogelijkheid meer om het wachtwoord te wissen, behalve door een lid van de Beheerders groep. Zie hoofdstuk 5 “Hoe kan ik een vergeten wachtwoord wissen?” voor de benodigde code. Vanaf Microsoft Access 95 ondersteunt Microsoft Access share-level beveiliging d.m.v. een database wachtwoord. Je vindt deze mogelijkheid onder Extra|Beveiliging| Databasewachtwoord instellen. Om het wachtwoord in te stellen moet je lid zijn van de Beheerdersgroep, of eigenaar zijn van de database. De database moet exclusief geopend zijn. Het database wachtwoord wordt niet ondersteund in een replica database. Het gevaar is dat het wachtwoord ingesteld wordt, en vergeten. Daardoor kan voor iedereen de toegang tot de database afgesloten worden.

4.1 Database wachtwoord bugs.

Microsoft Access 95: Er zit een fout in de database wachtwoord eigenschap, alleen in Microsoft Access 95. Wanneer je een wachtwoord instelt dat een spatie bevat, zoals “Mijn Wachtwoord” en je comprimeert de database zul je de database niet meer met dat wachtwoord kunnen openen. Het compressie proces breekt het wachtwoord bij de spatie af. Het nieuwe wachtwoord is dan “Mijn”. Meer informatie hierover kan gevonden worden in de Microsoft Knowledge Base article Q152760, "ACC95: DB Password with Space Becomes Invalid After Compact". Deze fout is verholpen in Microsoft Access 97. Microsoft Access 95 en Microsoft Access 97: Een tweede fout heeft betrekking op zowel Microsoft Access 95 als op Microsoft Access 97 databases. Wanneer je het backslash (\) karakter gebruikt in een wachtwoord zul je de database niet meer met dat wachtwoord kunnen openen. De oplossing is om in plaats van 1 backslash (\) er twee te gebruiken (\\) Met andere woorden, wanneer het wachtwoord “Mijn\Wachtwoord” is kun je de database openen door “Mijn\\Wachtwoord” te typen.

5. Hoe kan ik een vergeten wachtwoord wissen? De DAO methode, NewPassword, kan in een VBA procedure gebruikt worden om wachtwoorden te maken en te wissen. Het gebruikt twee argumenten: het oude wachtwoord, en het nieuwe wachtwoord. Wanneer je gebruiker bent van de Beheerders groep, of je bent de eigenaar van de database, dan kun je NewPassword toepassen op elke gebruiker en wachtwoord. Voor het oude wachtwoord kun je lege aanhalingstekens (“”)gebruiken. Wanneer je niet tot deze groep behoort, kun je alleen het wachtwoord veranderen wanneer je het oude wachtwoord gebruikt als argument van NewPassword. De volgende code verandert of wijzigt het wachtwoord van een gebruiker. Er is geen foutafhandeling; je moet er zeker van zijn dat je de juiste gebruikersnaam gebruikt, en dat het wachtwoord niet langer is dan 14 tekens.

Function faqChangePassword (ByVal strUser As String, _ ByVal strPwd As String) As Integer Dim ws As Workspace Dim usr As User Set ws = DBEngine.Workspaces(0) Set usr = ws.Users(strUser) usr.NewPassword "", strPwd End Function

Page 9: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 9 van 40

Je kunt het databasewachtwoord ook veranderen met door de NewPassword methode toe te passen op het database object in plaats van op een User object, maar je moet wel het oude wachtwoord opgeven.

6. Wat is de beste manier om mijn beveiligde Microsoft Access applicatie te converteren naar de nieuwste versie van Microsoft Access? De beste manier om een beveiligde Microsoft Access applicatie te converteren is alleen mogelijk wanneer je de Werkgroep ID en de Pincodes beschikbaar hebt die je bij het maken van het originele werkgroepinformatiebestand hebt opgegeven. Je kunt een nieuw werkgroepinformatiebestand maken in de nieuwe Access versie door deze exacte gegevens in te vullen. Wanneer je daarna je database converteert naar de nieuwste versie van Microsoft Access kun je probleemloos verder. Wanneer het niet mogelijk is om het werkgroepinformatiebestand te reconstrueren, kun je gebruik blijven maken van het oude werkgroepinformatiebestand. Je kunt dan geen gebruik maken van de mogelijk nieuw toegevoegde functionaliteit van de nieuwste Microsoft Access versie. De beste manier is dan om de applicatie in de oudere Access versie van beveiliging te ontdoen voor deze te converteren (alle rechten weer toewijzen aan de gebruikers, de Beheerder weer terugzetten in de Beheerders groep en het wachtwoord wissen), zoals beschreven wordt in hoofdstuk 36, “Hoe kan ik de beveiligingen van mijn database opheffen?” Converteer de onbeveiligde database naar de nieuwste versie van Microsoft Access, en stel de beveiligingen weer in zoals beschreven in hoofdstuk 1 “Welke stappen moet je nemen om een database te beveiligen?”

7. Hoe zit het met het beveiligingslek in Microsoft Access 2.0? Het beveiligingslek in Microsoft Access 2.0 is uitgebreid bediscussieerd op het Internet. Het komt voor in de gebruikers interface en vereist geen gecompliceerde tools of deskundigheid – veel mensen zijn er per ongeluk over gestruikeld. Iemand die hiervan op de hoogte is kan vrij gemakkelijk torgang krijgen tot je formulieren, rapporten, macro’s en modules. Ze kunnen het beveiligingslek niet gebruiken om toegang te verkrijgen tot je tabellen en queries, wanneer je alle rechten hebt verwijderd, en queries gebruikt met de RunPermissions eigenschap ingesteld op Eigenaar (standaard is Gebruiker) om toegang te krijgen tot je data (zie ook hoofdstuk 10. hoe breng ik veld- of rij-niveau beveiliging op mijn tabellen tot stand (RWOP of queries met de runpermissions ingesteld op eigenaar)?”. Helaas is je code compleet onbeschermd, dus wanneer je de Admins gebruikersnaam en wachtwoord in je modules opgenomen hebt om bepaalde instructies uit te voeren zul je een andere benadering moeten overwegen. Het is belangrijk om op te merken dat dit betreffende beveiligingslek alleen beschikbaar is voor gebruikers die een geldige gebruikersnaam en wachtwoord hebben, evenals rechten om de database te openen. Sinds Access 95 is dit beveiligingslek gedicht. Opmerking. Het is menselijkerwijs niet mogelijk om op een adequate manier een desktop database te beveiligen tegen iemand die het beslist wil, die de tools heeft, en de kennis. Ook in Access 95 – 2000 zitten beveiligingslekken, zodat simpelweg een upgrade naar een nieuwere versie geen garantie is tegen hackers. Wanneer je beveiligingsbehoeften zodanig zijn dat je een ondoordringbare beveiliging vereist is, kun je beter gebruik maken van een server database, zoals SQL Server op een afgesloten Windows NT® of Windows 2000® platform.

8. Hoe kan ik mijn code beveiligen zonder dat gebruikers hoeven in te loggen? Dit kun je bereiken door gebruik te maken van twee verschillende werkgroepinformatiebestanden; één voor het ontwikkelen en beveiliging, en één voor distributie bij de gebruiker. Je kunt zelfs gebruik maken van het standaard System.mda/mdw voor je distributie.

1. Beveilig je database compleet door de stappen zoals besproken in hoofdstuk 1”Welke stappen moet je nemen om een database te beveiligen?”

2. Overtuig je ervan dat alle rechten naar de modules toe zijn ingetrokken voor de Users groep en voor de Admin gebruiker. (Wanneer je gebruik gemaakt hebt van de beveiliging wizard is dit al gebeurd).

Page 10: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 10 van 40

3. Ken volledige rechten toe aan de standaard Beheerder en de Gebruikersgroep voor alle objecten die voor iedereen toegankelijk moeten zijn.

4. Verdeel je applicatie gebruikmakend van het standaard werkgroepinformatiebestand. Omdat er geen wachtwoord is toegekend aan de Admin gebruiker in de standaard system.mda/mdw, logt iedereen aan als Admin en heeft iedereen alleen die rechten die je aan de Admin gebruiker en aan de Users groep hebt toegekend.

Wanneer je modificaties aan je database moet doorvoeren, maak je gebruik van het ontwikkelaars werkgroepinformatiebestand en log je aan als de eigenaar van de database. Vanaf Microsoft Access 97 kan een database geconverteerd worden naar een .mde bestand. Dit verwijdert alle bewerkbare code uit de database, en maakt het ontwerp van alle formulieren, rapporten en modules ontoegankelijk voor gebruikers. Het heeft verder geen enkel effect op data of op gelinkte tabellen. Om een .mde bestand te maken moet je Beheerdersrechten hebben op het bron bestand.

9. Hoe verwijder ik de standaard Beheerder (Admin) gebruiker? Het antwoord is eenvoudig. Dat kan niet. Het is algemeen verkeerde geïnterpreteerde informatie die ontstaan is in verschillende boeken, beginnend met de release van Microsoft Access 2.0. In Microsoft Access 1.x kan de Admin gebruiker gewist worden, maar daarna niet meer. Omdat de Admin account de standaard account is, die identiek is voor alle Microsoft Access installaties, is het niet nodig om deze te verwijderen uit de Beheerders groep als onderdeel van de database beveiliging. Je wilt eigenlijk alleen maar dat de Admin gebruiker een gewoon lid is van de gebruikers groep. Verwijder alle rechten van de gebruikers groep, zodat de Admin gebruiker geen rechten overerft. ( je kent alleen rechten toe aan je zelfgemaakte groepen). Wanneer je deze stap negeert zal je database nooit beveiligd zijn.

10. Hoe breng ik veld- of rij-niveau beveiliging op mijn tabellen tot stand (RWOP of queries met de RunPermissions ingesteld op Eigenaar (Owner))? (RWOP – Run With Owner Permissions). Om de werking van de ‘RunPermissions’ te begrijpen moet je eerst begrijpen hoe het ’eigenaarschap’ concept van Microsoft Access werkt. De gebruiker die een object maakt, of importeert in Microsoft Access wordt de eigenaar van dat object en heeft volledige rechten om dat object te beheren. Wanneer ik bijvoorbeeld een query maak die gegevens uit diverse tabellen haalt, moet ik wel rechten hebben op de data van die tabellen, anders zou ik de query niet kunnen maken, uitvoeren of opslaan. De RunPermissions eigenschap is standaard toegekend aan de Gebruikers, wat wil zeggen dat de query uitgevoerd wordt, met de rechten tot de basis tabellen van de query van de gebruiker die is aangelogd. Wanneer ik de RunPermissions eigenschap verander in Eigenaar, geef ik alle gebruikers de rechten op de tabellen alsof ze als Eigenaar ingelogd zijn, in plaats van met de rechten van de ingelogde gebruiker. Zulke queries worden vaak aangeduid als RWOP queries (Run With Owner Permissions). De RunPermissions eigenschap heeft alleen betrekking op opgeslagen queries. Je kunt het niet gebruiken in combinatie met gedefinieerde SQL strings in je modules door simpelweg WITH OWNERACCESS OPTION aan de string toe te voegen. De reden hiervoor is dat beveiliging is opgebouwd rondom opgeslagen objecten door deze bepaalde bits mee te geven. De code in de module heeft geen enkele manier om te ontdekken wie de eigenaar in dit geval zou moeten wezen, want er is geen opgeslagen object waarvan deze bits uitgelezen kunnen worden. Wanneer je een Salary kolom hebt in je Payroll tabel kun je een query ontwerpen die alle gegevens toont, behalve de kolom Salary. Wanneer je wilt dat de gebruikers alle Salaries zien, behalve die van de managers, kun je een query ontwerpen die een beperkt aantal rijen weergeeft, door gebruik te maken van en WHERE clausule, die weergave uitsluit van alle gegevens die aan een manager gerelateerd zijn. De beste manier om dit tot stand te brengen is om alle rechten van onderliggende tabellen te verwijderen, en alleen queries te gebruiken om de gebruikers de data te tonen die je wilt dat ze zien. Je kunt nu rechten toekennen aan de gebruikers groep alleen op deze query, alleen om de data te bekijken, of ook om data te wijzigen. Opmerking: Er zijn andere onderwerpen om te overwegen wanneer je RWOP queries gebruikt met gelinkte tabellen. Zie hoofdstuk 12 “Wat is het verschil tussen een “Attached Table” en een “Linked Table”?”, hoofdstuk 13 “Hoe beheer ik gelinkte tabellen met Microsoft Access Security?”, en hoofdstuk 14.1 “Het gebruik van RefreshLink om tabellen te relinken” Voor meer informatie.

Page 11: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 11 van 40

11. Waarom kan ik mijn RWOP toevoeg query niet uitvoeren? Actie queries (toevoegen, wijzigen, of verwijderen) hebben meestal alleen maar Read Data rechten nodig voor het query object zelf. Het soort actie query geeft al aan welke rechten er nodig zijn. Het is logisch dat voor een toevoeg query de Update Data rechten apart worden ingesteld. Voor RWOP queries geldt dat de rechten voor het toevoegen, bijwerken of verwijderen gelden van degene die de query gemaakt heeft (Insert Data, Update Data en Delete Data). De rechten van de RWOP query gebruiker op de bron tabel doen er verder niet toe. In feite hebben de query gebruikers normaal gesproken geen rechten op de bron- of doeltabellen van de RWOP query. Echter, Microsoft Access 2.0 toevoegqueries vormen een uitzondering. Hierbij zijn ook Read Data en Append Data rechten nodig op de tabel, in plaats van alleen maar Read Data en Append Data rechten op de query. In het geval van een gelinkte tabel heeft de gebruiker deze rechten nodig op zowel de bron- als de bestemmingsdatabase van de gelinkte tabel. Zonder deze rechten krijg je waarschijnlijk de volgende foutmelding:

Operation must use an updatable query

12. Wat is het verschil tussen een “Attached Table” en een “Linked Table”? Veranderde Term Waarschuwing: In Microsoft Access 95 en later is de term “Attached Table“ vervangen door de synonieme term “Linked Table”. Deze nieuwe term kan misleidend zijn, omdat de fundamentele werking niet veranderd is, en een gelinkte tabel is niet gelinkt zoals in de OLE terminologie. Het is nog steeds een ‘string’ verwijzing naar de plaats op de harde schijf waar de database staat met de basis tabel (in de eigenschappentabel is een ‘harde’ connectie string opgeslagen). Gelinkte tabellen in Microsoft Access hebben geen enkele relatie met OLE links zoals gebruikt bij Microsoft Word of Microsoft Excel; de enige overeenkomst is de terminologie - ze worden niet-automatisch bijgewerkt. Wanneer je de tabel verplaatst, wordt de link ook verbroken. Verder in dit document zijn de termen uitwisselbaar, en wordt met de term ‘basis tabel’ gerefereerd naar de tabel die gelinkt is, en in de back-end database staat. Microsoft Access 95/97/2000 gelinkte tabellen: De volgende aanpassingen in de werking zijn gemaakt.

1. Rechten worden niet langer gereset naar <New tables/queries> wanneer een RefreshLink wordt uitgevoerd op een bestaande link. Dit was een vervelende tekortkoming in Microsoft Access 2.0, en is gelukkig opgelost.

2. Als minimale rechten op de gelinkte tabel was Modify Design nodig(niet op de basis tabel). In Microsoft Access 2.0 was Read Design voldoende.

13. Hoe beheer ik gelinkte tabellen met Microsoft Access Security? De hoofdzaken zijn:

• Gebruikers voorzien van voldoende rechten zodat ze hun applicatie kunnen verbinden, of herverbinden met de back-end database.

• Het oplossen van de verschillen in rechten toewijzing tussen de front-end en back-end databases.

Er zijn vier technieken beschikbaar om een back-end connectie te veranderen.

• Gebruik de RefreshLink methode en het wijzigen van de connectie string van een TableDef.

• Gebruik het TransferDatabase commando om den back-end tabellen te linken.

Page 12: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 12 van 40

• Verwijder eerst de bestaande link en voeg deze vervolgens opnieuw toe met de nieuwe connection string gebruik makend van de Connect eigenschap van het TableDef object.

• Gebruik de Linked Table Manager ( In access 2.0 is dit de Attachment Manager).

Hoewel de RefreshLink methode de meest elegante oplossing lijkt heeft deze als nadeel dat de Read Data rechten op de back-end basis tabel moeten zijn ingesteld om de gebruiker de mogelijkheid te geven deze methode uit te voeren. In gevallen waarbij de enige toegang via RWOP queries plaatsvindt, vereist het re-linken (voorafgegaan door het verwijderen) alleen maar Read Design rechten op de basis tabel in de back-end database. Zie ook hoofdstuk 10 ”Hoe breng ik veld- of rij-niveau beveiliging op mijn tabellen tot stand(RWOP of queries met de RunPermissions ingesteld op Eigenaar)?” Het tot stand brengen van een nieuwe verbinding kan plaatsvinden via DAO door de Connect eigenschap te activeren van het TableDef object, of door gebruik te maken van de TransferDatabase macro actie. Wanneer je een verbinding via de menu’s tot stand wilt brengen moet je Read Design rechten hebben. Wanneer je via code de Connect eigenschap reset heb je geen enkele rechten nodig - de fout die optreedt in de module code wordt genegeerd en de tabel wordt gelinkte. Wanneer je gebruik maakt van de TransferDatabase macro, heb je Read Design rechten nodig op de back-end tabel. Wanneer je gebruik maakt van de Linked Table/Attachment Manager Add-in moet je Modify Design rechten op de front-end tabel hebben, en Read Data rechten op de back-end tabel. Het is belangrijk te weten dat je met twee gescheiden objecten werkt, voor wat betreft de beveiliging. Met andere woorden, je hebt de basis tabel in de back-end database, en de link in de front-end database. De tabel en de link zijn twee afzonderlijke objecten waarvan de rechten onafhankelijk van elkaar worden ingesteld door middel van de Container en Document objecten in DAO. Het toekennen van rechten op de gelinkte tabel heeft geen effect op de basis tabel, en andersom. Ongeacht de hoe de instellingen van de gelinkte tabel zijn, de gebruiker kan geen hogere rechten erven dan de rechten die hij heeft op de basis tabel. Het toekennen van alle rechten op een gelinkte tabel in de front-end, inclusief Beheerder, heeft dus geen enkele invloed op de ingestelde rechten van de basis tabel in de back-end database. Wanneer je alle rechten van de basis tabel zou verwijderen, kunnen gebruikers de tabellen niet meer openen, niet in de Design view, en niet in de Datasheet view in de front-end database, terwijl daar alle rechten zijn toegewezen. Belangrijk is om de rechten zo restrictief mogelijk toe te kennen op de tabellen in de back-end database. Dit voorkomt dat gebruikers de tabellen in de back-end direct kunnen openen. Wanneer je een tabel linkt, erft deze automatisch de rechten die je gedefinieerd hebt voor <New tables> voor elke groep of gebruiker in de front-end database. Aanbevolen wordt om volledige rechten toe te kennen aan de <New tables>, omdat dit toch geen effect heeft op de basis tabellen. Microsoft Access 2.0: In Microsoft Access 2.0 veroorzaakt het simpelweg vernieuwen van de links ervoor dat de rechten van de tabellen in de huidige database automatisch worden vervangen door de rechten die toegekend zijn aan de <New tables>. Zie ook hoofdstuk 16.3 “Updaten of vernieuwen van bestaande Links/Attachments” voor meer informatie.

14. Welke rechten zijn er nodig om gelinkte tabellen te vernieuwen? Je kunt de bestaande gelinkte tabellen vernieuwen door gebruik te maken van de Linked Table manager of met de Attachment Manager van Microsoft Access, of via code. Je moet Read Data rechten hebben op de TableDef objecten in de back-end database. De volgende minimum rechten zijn nodig voordat een gebruiker tabellen kan linken met de Linked Table/Attachment Manager of de RefreshLink methode. Naast de omschrijving van de rechten staat de corresponderende Access Basic of de gelijkwaardige Visual Basic for Applications constante. Minimum Permission Description for RefreshLink Access 2.0 Constants Access 95/97/2000

Page 13: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 13 van 40

Minimum Permission Description for RefreshLink

Access 2.0 Constants Access 95/97/up

1. *The ability to create New Tables/ Queries in the destination database

DB_SEC_CREATE DbSecCreate

2. *Read Design Permissions on the Table in the destination database

DB_SEC_READDEF DbSecReadDef

3. *Read Data permissions on the table in the destination database

DB_SEC_RETRIEVEDATA DbSecRetrieveData

4. Open/Run permissions for the source database

DB_SEC_DBOPEN DbSecDBOpen

5. Read Data permissions on the table in the source database

DB_SEC_RETRIEVEDATA DbSecRetrieveData

*Just set full permissions in the destination database

DB_SEC_FULLACCESS DbSecFullAccess

De volgende code is een voorbeeld hoe je programmatisch de instellingen van de rechten kunt manipuleren.De gebruikte constanten zijn Microsoft Access 2.0 constanten, maar de code wordt ook uitgevoerd in Microsoft Access 95, Microsoft Access 97 en Microsoft Access 2000. Veronderstelt wordt dat een lid van de Beheerders groep de code uitvoert

Function faq_SetPermissions (strTable As String, strSourceDB As String, _ strUsrName As String) ' This function will set permissions on the source table so that ' you can use the RefreshLink method to reattach tables. It grants ' Read Data permissions on the source table, Open/Run permissions ' on the source database and full permissions in the destination ' database on all tables and queries. You need to be a member of the ' Admins group to run this code. ' ' Parameters: ' strTable ' Name of the table for permissions to be set. Assumes the ' table named the same in both source and destination db. ' strSourceDB ' Fully-qualified name of the source database ' strUsrName ' Name of group or user you want to be able to ' use RefreshLink ' Dim db As Database Dim con As Container Dim doc As Document Dim ws As WorkSpace Set ws = dbengine.workspaces(0) ' set default full permissions in destination ' (current) database for new tables Set db = CurrentDB() Set con = db.Containers("Tables") con.username = strUsrName con.permissions = DB_SEC_FULLACCESS ' set full permissions for the linked table ' in the destination database Set doc = con.Documents(strTable) doc.username = strUsrName doc.permissions = DB_SEC_FULLACCESS ' Set open database permissions for the source database Set db = ws.OpenDatabase(strSourceDB) Set con = db.Containers("Databases") Set doc = con.Documents("MSysdb") doc.username = "Users" doc.permissions = doc.permissions Or DB_SEC_DBOPEN ' Set read data permissions for the base table Set con = db.Containers("Tables") Set doc = con.Documents(strTable) doc.username = strUsrName doc.permissions = doc.permissions Or DB_SEC_RETRIEVEDATA End Function

Page 14: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 14 van 40

14.1 Het gebruik van RefreshLink om tabellen te relinken Nu de Read Data rechten aan de brontabellen zijn toegevoegd en volledige rechten aan de bestemming tabel voor een gegeven gebruiker, heeft deze gebruiker de mogelijkheid om de RefreshLink methode toe te passen om de tabellen te relinken. Onderstaande code maakt gebruik van Microsoft Access 2.0 conventies, maar werkt ook met Microsoft Access 95, Microsoft Access 97 en Microsoft Access 2000.

Function faq_RefreshLink (strTable As String, strSourceDB As String) ' This function can be run by any user who has Read Data permission ' on the source table and Open/Run permissions on the source database ' Parameters: ' strTable ' Name of the table to be refreshed ' strSourceDB ' Fully-qualified path and filename of the source db ' Dim ws As WorkSpace Dim db As Database Dim tdf As TableDef Set ws = dbengine.workspaces(0) Set db = CurrentDB() Set tdf = db.TableDefs(strTable) ' specify new location of source table tdf.Connect = ";DATABASE=" & strSourceDB ' refresh the link tdf.RefreshLink End Function

14.2 Het gebruik van TransferDatabase om tabellen te relinken. Gebruikers hebben alleen de Read Design rechten nodig op de basis tabellen wanneer je er voor kiest om het TransferDatabase commando te gebruiken om de links te vernieuwen. Je kunt de faq_SetPermissions functie hierboven aanpassen om alleen Read design rechten toe te kennen door het aanpassen van de volgende regel

doc.permissions = doc.permissions Or DB_SEC_RETRIEVEDATA

wordt:

doc.permissions = DB_SEC_READDEF

Dit beperkt de rechten op de basis tabel naar enkel Read Design. Gebruikers hebben niet de mogelijkheid om data te bekijken in de DataSheet view, of om het ontwerp te wijzigen. De volgende functie staat gebruikers toe om de methode Transferdatabase te gebruiken om de tabellen te relinken.

Function faq_TransferDatabase (strTable As String, strSourceDB As String) ' TransferDatabase is actually a macro command. This function ' acts as a wrapper, passing the name of the table and the fully- ' qualified path and filename of the new location of the source ' database. Users need Read Design on the source table in order ' to run this code. It is assumed they have full permissions on ' the destination database. ' Dim db As Database Dim tdf As TableDef Set db = CurrentDB() ' Ignore any error that occurs if the table isn't already ' present in the destination database On Error Resume Next ' remove the old link db.tabledefs.Delete strTable

Page 15: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 15 van 40

' Relink using TransferDatabase DoCmd TransferDatabase A_ATTACH, "Microsoft Access", strSourceDB, A_TABLE, strTable, strTable End Function

14.3 Geen rechten nodig – Gebruik de .Connect eigenschap om tabellen te relinken. Wanneer je geen enkele rechten aan je tabellen wilt toekennen en je wilt toch dat de gebruikers de mogelijkheid hebben om de tabellen te linken kun je deze methode toepassen. Om alle rechten op de basis tabellen te verwijderen moet je de volgende regel in de faq_SetPermissions functie vervangen

doc.permissions = doc.permissions Or DB_SEC_RETRIEVEDATA

door: doc.permissions = DB_SEC_NOACCESS

Wanneer en gebruiker probeert via de gebruikers interface de tabellen te relinken krijgt hij de melding dat hij niet voldoende rechten heeft om deze bewerking uit te voeren.Wanneer je dit echter via code uitvoert zorgt het On Error resume Next statement ervoor dat de fout wordt genegeerd, en de tabel wordt toch gelinked. De gebruiker kan de tabel echter niet openen in de DataSheet of Design weergave, dus je moet een vantevoren gemaakte RWOP query hebben om de gebruiker in staat te stellen om toegang tot de data te hebben. Een gebruiker moet de mogelijkheid hebben om de volgende code uit te voeren, moet volledige rechten hebben op de front-end database, en Open/Run rechten op de back-end database - er zijn geen rechten nodig op de basis tabellen.

Function faq_ConnectLink (strTable As String, strSourceDB As String) ' This function can be run by any user who has OpenRun permission ' on the source database. It works equally well to link tables ' from scratch or to relink previously attached tables. In-line ' error handling is used to ignore any errors ' Parameters: ' strTable ' Name of the table to be linked ' strSourceDB ' Fully-qualified path and filename of the source db ' On Error Resume Next Dim db As Database Dim tdf As TableDef Set db = CurrentDB() ' Delete the link if it already exists db.tabledefs.Delete strTable ' Create new link Set tdf = db.CreateTableDef(strTable) ' Set the properties of the new link ' and append to the tabledefs collection tdf.SourceTableName = strTable tdf.Connect = ";DATABASE=" & strSourceDB db.tabledefs.Append tdf End Function

14.4 Foutmeldingen Ongeacht de techniek die je toegepast hebt controleert Microsoft Access of je de juiste rechten hebt. Onthou dat je geen enkele rechten op de basis tabellen hoeft toe te kennen, wanneer je relinkt door gebruik te maken van de Connect eigenschap, en het toekennen van alle rechten aan de front-end database geen enkele invloed heeft op de data beveiliging. Wanneer je dat niet doet kun je de volgende foutmeldingen krijgen:

Page 16: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 16 van 40

Microsoft Access 2.0.

Error Message Error Reason

“Can’t find Installable ISAM” No Read Design permission on the table in the destination database.

“No permission for <table>“ No ability to create New tables in destination database. No Open/Run permissions on source database.

“No Read Data permissions for <table>”

No Read Data permissions on table in Remote database.

Microsoft Access 95: Ongeacht welke instelling ontbreekt, er wordt maar één foutmelding en nummer teruggemeld. Dit is de "Application-defined or object-defined error" melding.

Microsoft Access 97 and 2000.

Error Message Error Reason “You don’t have the necessary permissions to use the <name> object. Have your system administrator or the person who created this object establish the appropriate permissions for you.”

No Open/Run permissions on source database. No Read Data permissions on table in source database.

“Couldn’t create; no modify design permissions for table or query <table>”

No ability to create New tables in the Current database.

15. Waarom hebben gebruikers die een link willen updaten, het recht om een nieuwe tabel te maken nodig in de front-end database? Zelfs als je alleen maar een bestaande link vernieuwt behandeld Microsoft Access dit alsof je een nieuwe tabel aanmaakt. Wanneer je rechten aan tabellen toekent wijst de instelling <New Tables> naar de rechten die een specifieke groep of gebruiker overerft wanneer er een nieuwe tabel wordt aangemaakt, en heeft niets te maken met het herroepen van de mogelijkheid om tabellen te maken. Je kunt de rechten om nieuwe tabellen te maken via de gebruikers interface niet verwijderen. Je moet dit via code doen, zoals beschreven in hoofdstuk 24 “Hoe voorkom ik dat gebruikers nieuwe objecten aanmaken in mijn database?”.

Microsoft Access 2.0: Via een checkbox kun je met de beveiliging wizard deze mogelijkheid uitschakelen voor bestaande gebruikers en groepen. Wanneer je deze optie kiest tijdens de uitvoering met de Security Wizard hebben alleen leden van de Beheerders groep nog de mogelijkheid om nieuwe tabellen en queries te maken. Dit maakt het voor alle andere gebruikers onmogelijk om nieuwe tabellen te linken.

Microsoft Access 95, Microsoft Access 97 en Microsoft Access 2000: Het verwijderen van deze rechten kan nu alleen nog bereikt worden via DAO code. De checkbox die in Microsoft Access 2.0 beschikbaar was is niet aanwezig inde nieuwe ingebouwde wizard. Zie ook hoofdstuk 24 “Hoe voorkom ik dat gebruikers nieuwe objecten aanmaken in mijn database?” voor de code lijst om deze rechten toe te kennen of te verwijderen.

16. Wat gebeurt er wanneer de rechten op een gelinkte tabel in de front-end database verschillen met die van de back-end? Microsoft Access gebruikt een combinatie van beveiligingsinstellingen in zowel de huidige als de gekoppelde database tijdens het verifiëren van de rechten op de gekoppelde tabellen. Rechten op de back-end tabellen kunnen niet worden teniet gedaan door meer liberale rechten op de front-end

Page 17: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 17 van 40

database. In deze context kun je de aansluitingen in de front-end database meer zien als connection strings, of als informatie die nodig is om de werkelijke tabellen te lokaliseren in de back-end database. Rechten op een connection string mogen, en kunnen, de rechten op de basis tabel niet teniet doen.

Microsoft Access behandelt de combinatie van toegekende rechten op de basis tabellen en de connection strings niet op de minst restrictieve manier, maar op de meest restrictieve manier. Microsoft Access stelt eerst vast wat de minst restrictieve rechten voor de tabel in de huidige en de remote database. Daarna vergelijkt Microsoft Access deze vergelijking en combineert deze zodanig dat alleen rechten die aan beide tabellen zijn toegevoegd beschikbaar zijn.

The following table highlights this.

Front-End DB + Back-End DB = Permissions on Attached/Linked Table

None + Administer = No Permissions

Read Only + Administer = Read Only

Administer + None = No Permissions

Administer + Read Only = Read Only

De eenvoudigste manier is om de gebruikers op de front-end alle rechten toe te kennen, en de rechten op de back-end database tot een minimum te beperken, voor wat nodig is om een gebruiker een tabel te laten relinken. Wanneer ze geen tabellen hoeven te relinken kun je alle rechten op de tabellen verwijderen en het gebruik van RWOP queries geeft de hoogste mate van beveiliging die mogelijk is.

16.1 Nieuwe Links tot stand brengen Het proces van het toevoegen van nieuwe gelinkte tabellen zet de standaard rechten op de rechten die ingesteld zijn bij <New Tables/Queries>

16.2 Welke rechten zou je moeten instellen voor <New Table/Queries>? De beste oplossing is om volledige rechten toe te kennen aan alle custom groepen voor wat betreft de <New Tables/Queries> in de front-end database. Wanneer een gelinkte tabel wordt gerefreshed krijgt deze de volledige rechten, maar iedere toegang tot de gelinkte tabel wordt bepaald door de ‘meest restrictieve’ regel. Toegang tot de basis tabel wordt gedowngrade tot de rechten die zijn toegekend aan de tabellen in de back-end database. Om de hoogste graad van beveiliging te bereiken moet je alle rechten voor alle groepen en gebruikers op de tabellen verwijderen voor de optie <New Tables/Queries> en voor alle tabellen in de database. Om de gegevens toch te kunnen bewerken kun je gebruik maken van queries met de eigenschap RunPermission ingesteld op Owner in plaats van op User (ook bekend als RWOP queries). Iedere tabel die een gebruiker maakt in de front-end database wordt niet beïnvloed door de standaard rechten instelling omdat de gebruiker ook de Owner is van de objecten en daardoor alle rechten op deze objecten heeft.

16.3 Updaten of vernieuwen van bestaande Links/Attachments Microsoft Access 2.0: Updaten van bestaande verbindingen zorgt ervoor dat de bestaande rechten gereset worden en de rechten van <New Tables/Queries> wordt overgenomen voor alle gebruikers en groepen anders dan de Admins en de gebruiker die op dat moment de bewerking uitvoert. Microsoft Access 2.0 behandelt de refresh van een gelinkte tabel als het maken van een nieuwe tabel, en de gebruiker die dat uitvoert wordt de eigenaar van de tabel, en krijgt daardoor alle rechten, ongeacht de instellingen in <New Tables/Queries>. Wanneer je de suggesties van alle- of geen rechten zoals besproken in hoofdstuk 16.2 “Welke rechten zou je moeten instellen voor <New Table/Queries>” voor <New Tables/Queries>. hebt opgevolgd zal dit geen probleem

Page 18: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 18 van 40

zijn. Iedere toegang tot de gelinkte tabellen (inclusief toegang via een RWOP query) zal de meest restrictieve regel volgen en de rechten downgraden naar de rechten van de basistabel in de back-end database.

Microsoft Access 95, Microsoft Access 97, and Microsoft Access 2000: Dit probleem is opgelost. Het uitvoeren van een update op een bestaande link heeft geen effect op bestaande rechten die eerder aan een gelinkte tabel zijn toegekend.

16.4 Rechten synchroniseren Wanneer het nodig is dat de rechten op de basis tabel altijd identiek zijn aan de gelinkte tabel rechten na het vernieuwen van een link, moet je de rechten kopiëren via DAO.

De volgende voorbeeld code opent de back-end database en controleert de rechten die op de basis tabellen staan, en kopieert deze rechten naar de gelinkte tabellen in de front-end database. De code verondersteld dat de namen van de tabellen en de namen van de links in beide databases identiek zijn. Omdat alleen leden van de Admins groep rechten kunnen toekennen moet je aanloggen als lid van de Admins groep om de code uit te kunnen voeren.

Oproepen van het voorbeeld: ysnOK = faq_CopyTablePermissions ( "C:\DATA.MDB" )

Function faq_CopyTablePermissions(pstrRemoteDB As String) As Integer ' ------------------------------------------------ ' copies permissions from the RemoteDB to the CurrentDB ' the full path to the remote db is passed in the pstrRemoteDB ' string parameter ' ------------------------------------------------- Dim ws As Workspace, db As DATABASE Dim dbTo As DATABASE, dbFrom As DATABASE Dim conFrom As Container, docFrom As Document Dim conTo As Container, docTo As Document Dim strDBName As String, strTblName As String Dim i As Integer, k As Integer, m As Integer On Error GoTo faq_Err_CopyTablePermissions '-------------------------- ' get current database '-------------------------- Set ws = DBEngine.Workspaces(0) Set db = CurrentDB() '---------------------------------------------- ' open From/To database under secured workspace ' establish From/To Containers '---------------------------------------------- Set dbTo = ws.OpenDatabase(db.Name) Set dbFrom = ws.OpenDatabase(pstrRemoteDB) Set conFrom = dbFrom.Containers("Tables") Set conTo = dbTo.Containers("Tables") '----------------------------------- ' copy permissions for all tables ' - ignore unmatched & system tables '------------------------------------ For i = 0 To dbFrom.TableDefs.Count - 1 strTblName = dbFrom.TableDefs(i).Name If Left$(strTblName, 4) <> "MSYS" Then Set docFrom = conFrom.Documents(strTblName) strTblName = "" On Error Resume Next strTblName = dbTo.TableDefs(i).Name On Error GoTo faq_Err_CopyTablePermissions If strTblName <> "" Then Set docTo = conTo.Documents(strTblName) For k = 0 To ws.Groups.Count - 1 '----------------------- ' synchronise group names ' copy group permissions ' -----------------------

Page 19: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 19 van 40

docFrom.UserName = ws.Groups(k).Name docTo.UserName = docFrom.UserName If docTo.Permissions <> docFrom.Permissions Then docTo.Permissions = docFrom.Permissions End If ' ------------------------------------------ ' following For/Next loop is only necessary ' if User Level permissions are applicable ' ------------------------------------------ For m = 0 To ws.Groups(k).Users.Count - 1 docFrom.UserName = ws.Groups(k).Users(m).Name docTo.UserName = docFrom.UserName docTo.Permissions = docFrom.Permissions Next m Next k End If End If Next i faq_CopyTablePermissions = True faq_Exit_CopyTablePermissions: If Not dbFrom Is Nothing Then dbFrom.Close If Not dbTo Is Nothing Then dbTo.Close If Not ws Is Nothing Then ws.Close Exit Function faq_Err_CopyTablePermissions: MsgBox "Table: [" & strTblName & "]" & Chr(13) & Error faq_CopyTablePermissions = False Resume faq_Exit_CopyTablePermissions End Function

17. Hoe kan ik de “meest restrictieve” rechten toekennen aan gekoppelde tabellen? Dit proces bestaat uit meerdere stappen. Het kan nuttig zijn de om de Enabled eigenschap van besturingselementen in te stellen afhankelijk van het updatetable zijn van een recordset.

Eerst moet je de gedetailleerde rechten opvragen van de specifieke gebruiker van de tabel. Daarna moet je alle volledige groepsrechten toevoegen. Deze stap moet afzonderlijk worden uitgevoerd op de huidige en de remote database.

Wanneer beide sets van volledige rechten volledig zijn berekend worden de twee samengevoegd door gebruik te maken van een binaire AND operator. Hierdoor blijven alleen de bits over die in beide sets ingesteld zijnen vormen zo de “ meest restrictieve” set van toegekende rechten.

Microsoft Access 2.0: Wanneer de huidige gebruiker geen lid is van de Admin groep kan het moeilijk zijn om deze informatie te verkrijgen. Zie hoofdstuk 23 ”Hoe verkrijg ik de groepsgegevens van de huidige gebruiker zonder Beheerder-Id en wachtwoord op te nemen in de code?” voor een oplossing.

Microsoft Access 95, Microsoft Access 97, and Microsoft Access 2000: Een nieuwe beveiligings instelling is toegevoegd wat de gebruikers toestemming geeft om de beveiliging informatie van een object op te vragen. Zonder deze instelling worden alle pogingen om deze informatie op te vragen afgekeurd. Deze instelling kan worden toegewezen via de dbSecReadSec constante.

De volgende functie zal de “meest restrictieve” rechten van de specifieke tabel terugmelden. Optioneel kan ook een query naam opgegeven worden als argument. Dit zou bijzonder nuttig zijn in omstandigheden waarbij RWOP queries de rechten tot de data beheren. Om de juiste rechten te verkrijgen wordt de query onderzocht om te zien of het een RWOP query is door te zoeken naar de “WITH OWNERACCESS OPTION” in de SQL string. Wanneer dat zo is worden de rechten van de eigenaar teruggemeld en gebruikt in de berekeningen. Als laatste stap worden de rechten van de huidige gebruiker toegepast voor verdere beperkingen op de rechten.

Example Usage :

If (faq_MostRestrictive("Categories","MyQuery") And dbSecReplaceData)= _ dbSecReplaceData then

Page 20: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 20 van 40

Msgbox "I can update this table" End if

Function faq_MostRestrictive(pstrTable As String, pstrQuery As String) As Long ' ------------------------------------------------ ' computes "most restrictive" permissions for the ' current user and specified table ' optional query may filter permissions ' ------------------------------------------------- Dim db As DATABASE, tdef As TableDef Dim con As Container, qdef As QueryDef Dim doc As Document, docQry As Document Dim lngImpCurrent As Long, lngImpRemote As Long Dim lngImpQuery As Long, strUser As String '-------------------------------------- ' open currentdb - set document to table ' compute implicit permissions '-------------------------------------- Set db = CurrentDB() Set con = db.Containers!tables Set doc = con.Documents(pstrTable) '------------------------------------------------ ' if query filter ' ... check for owner or user permissions ' ... adjust for currentuser permissions on query '------------------------------------------------- strUser = CurrentUser() lngImpQuery = DB_SEC_FULLACCESS If pstrQuery <> "" Then Set qdef = db.QueryDefs(pstrQuery) If InStr(qdef.SQL, "WITH OWNERACCESS OPTION") > 0 Then Set docQry = con.Documents(pstrQuery) strUser = docQry.Owner lngImpQuery = faq_Implicit(docQry, CurrentUser()) End If End If lngImpCurrent = lngImpQuery And faq_Implicit(doc, strUser) '-------------------------------------- ' get source table name & connect string ' open remote db - set document to table ' compute implicit permissions '--------------------------------------- Set tdef = db.TableDefs(pstrTable) pstrTable = tdef.SourceTableName Set db = OpenDatabase(Mid$(tdef.Connect, 11)) Set con = db.Containers!tables Set doc = con.Documents(pstrTable) lngImpRemote = faq_Implicit(doc, strUser) '-------------------------------- ' compute most restrictive rights '-------------------------------- faq_MostRestrictive = lngImpCurrent And lngImpRemote End Function

Function faq_Implicit(pdoc As Document, pstrUser As String) As Long '------------------------------------------------ ' computes "implicit" permissions for the ' specified user and document ( table or query ) '------------------------------------------------ Dim ws As Workspace Dim usr As User Dim lngPerms As Long Dim i As Integer '------------------------- ' get explicit permissions '------------------------- pdoc.UserName = pstrUser lngPerms = pdoc.Permissions '------------------------------------- ' add in each group where current user ' is a member '------------------------------------- Set ws = DBEngine(0) Set usr = ws.Users(pstrUser)

Page 21: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 21 van 40

For i = 0 To usr.Groups.Count - 1 pdoc.UserName = usr.Groups(i).Name lngPerms = lngperms Or pdoc.Permissions Next faq_Implicit = lngPerms End Function

18. Kan ik voorkomen dat gebruikers tabellen linken? Gebruikers mogen tabellen linken zolang ze Open/Run rechten hebben op de bron database zelf.Ze hebben Read Data rechten nodig om een verbinding te maken via de gebruikers interface, maar niet bij gebruik van code. Zie hoofdstuk 13 “Hoe beheer ik gelinkte tabellen met Microsoft Access Security?” en hoofdstuk 14 “Welke rechten zijn er nodig om gelinkte tabellen te vernieuwen?” voor meer informatie. Er is niets wat de gebruikers kan verhinderen een remote database direct te openen wanneer ze Open/Run rechten hebben. Je kunt voorkomen dat gebruikers de database in de DataSheet weergave openen om data te bekijken door de Read Data rechten van de tabel in de back-end database te verwijderen.

19. Hoe werk ik op tegelijkertijd met een beveiligde en een onbeveiligde applicatie? Maak verschillende koppelingen naar je bureaublad voor je beveiligde applicatie, en de standaard onbeveiligde versie van Microsoft Access. Je kunt maar bij één werkgroepinformatiebestand (System.mda/mdw) tegelijk zijn aangemeld. Gebruikers moeten dus weten dat ze Microsoft Access moeten afsluiten en opnieuw moeten starten wanneer ze willen schakelen tussen beveiligde- en onbeveiligde applicaties. Een tweede optie is om de gebruikers bekend te maken met het gebruik van de Workgroep Administrator, maar dat kan verwarrend werken bij eindgebruikers. Het maken van verschillende snelkoppelingen is niet zo moeilijk, en je hoeft het maar één keer te doen. De technieken hiervoor zijn verschillend voor iedere versie van Microsoft Access. Microsoft Access 2.0: Je moet gebruik maken van twee verschillende .INI bestanden: één voor de standaard installatie, en één voor de beveiligde applicatie. De eenvoudigste manier om dit te doen is dooreen kopie te maken van MSACC20.INI en die te herbenoemen naar bijvoorbeeld SECACC20.INI en dit op te slaan in je \Windows map. Verander één regel in de Options sectie van je SECACC20.INI bestand om te verwijzen naar je beveiligde werkgroepinformatiebestand. (SECAPP.MDA):

[Options] SystemDB=C:\ACCESS\SECAPP.MDA

De volgende stap is het maken van de snelkoppeling waar je beveiligde applicatie gebruik van zal maken. Dit door gebruik te maken van de /INI switch op de opdrachtregel om hiermee naar het .INI bestand te verwijzen waarin het pad naar het beveiligde werkgroepinformatiebestand staat. Dat ziet er ongeveer als volgt uit:

C:\msoffice\access\msaccess.exe /ini c:\windows\secacc20.ini

Gebruik van deze snelkoppeling start de beveiligde versie van Microsoft Access. De originele snelkoppeling start de standaard versie van Microsoft Access. Microsoft Access 95, Microsoft Access 97, and Microsoft Access 2000: Hier heb je geen .INI bestanden meer nodig; je kunt de switch /WRKGRP direct gebruiken op de opdrachtregel van de snelkoppeling:

C:\msoffice\access\msaccess.exe /wrkgrp c:\myapp\secacc.mdw

20. Hoe voorkom ik dat gebruikers toegang hebben tot de formulier code. Microsoft Access 2.0: Je kunt niet voorkomen dat gebruikers toegang hebben tot de code die je in een formulier of rapport module hebt geplaatst. (Deze code wordt aangeduid als Code Behind Forms, CBF). Er zit helaas een fout in Microsoft Access 2.0 die alle CBF prijsgeeft wanneer de

Page 22: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 22 van 40

gebruiker de regel DebugLibraries=True in de [Options] sectie van het MSACC20.INI bestand plaatst. Hiervoor is geen oplossing in Microsoft Access 2.0, maar het is aangepast in Microsoft Access 95. Je kunt je code beschermen door gevoelige code te verplaatsen naar globale modules, en de globale procedures op te roepen vanuit de CBF. Zorg ervoor dat je de Read Design rechten van de modules verwijdert. Microsoft Access 95, Microsoft Access 97, and Microsoft Access 2000: Verwijder de Read Design rechten van je formulieren. Microsoft Access 97 and Microsoft Access 2000: Je kunt je database compileren als een MDE bestand. Dit verwijdert alle bewerkbare code waardoor deze niet kan worden bekeken. Op deze manier hebben gebruikers geen mogelijkheid om formulieren, rapporten en module code te maken of te modificeren. Compileren naar een MDE heeft geen effect op de data.

21. Hoe kan ik zien wie er ingelogd is op mijn gedeelde netwerk applicatie? Microsoft Access heeft de functie CurrentUser(), die de naam van de ingelogde geruiker van de huidige database geeft, maar daar heb je niets aan wanneer je vast wil stellen wie er allemaal zijn ingelogd op een centrale netwerk database. Helaas is er geen ingebouwde manier om zoiets te realiseren. Een manier om deze functionaliteit wel te realiseren is door een eigen tabel toe te voegen waarin wordt bijgehouden wie er inloggen, en deze gegevens weer wissen wanneer de gebruiker weer uitlogt. Het probleem van deze methode is dat wanneer een gebruiker niet op de juiste manier het programma beeïndigd (bijvoorbeeld wanneer de computer van die gebruiker een ‘fatal error’ heeft (een GPF of een IPF) of de gebruiker zet de computer uit zonder eerst Microsoft Access af te sluiten) deze gebruiker nog steeds als ingelogd in de tabel staat, ook al is hij dat niet.Om hierop in te anticiperen zou je alle gebruikers uit de tabel kunnen verwijderen op een moment dat je weet dat er verder niemand is ingelogd, bijvoorbeeld tijdens een back-up/repair/compact. Je kunt ook een manier bedenken om je Administrator gebruikers in de tabel te laten bladeren en zulke ingelogde ‘phantom’ gebruikers te verwijderen. Microsoft stelt een DLL beschikbaar die je laat zien welke gebruikers er gebruik maken van een specifieke database (je krijgt een lijst met de computernamen die gebruik maken van de netwerk database), maar ook de Jet Database Engine 2.0/2.5/3.5/4.0 applicaties kunnen gecontroleerd worden. De DLL werkt niet in een 16 bits omgeving zoals Microsoft Access 2.0. Check de Microsoft Web site voor de meest recente versie, die compatibel zou moeten zijn met de Jet Database Engine 2.5 tot en met 4.0. Het JETLOCK.EXE bestand bevat de “ Understanding Jet Locking” white paper, alsmede de LDBView utility en de MSLDBUsr.dll. In Access 2000/Jet 4.0 zijn de eigenschappen van de MSLDBUsr.dll toegevoegd aan Jet en toegang hiertoe kan verkregen worden via de Jet 4.0 OLE DB provider. Om gebruik te maken van deze “ gebruikers lijst” kun je de volgende code gebruiken:

Const dbSecUserRosterGuid = "{947bb102-5d43-11d1-bdbf-00c04fb92675}" Dim rs As ADODB.Recordset Dim con As ADODB.Connection Set con = CurrentProject.Connection Set rs = con.OpenSchema(adSchemaProviderSpecific, , dbSecUserRosterGuid)

Deze GUID is een waarde die gedefinieerd is in een Jet OLE DB header file en is simpelweg provider-specific overzicht. Je krijgt een recordset met de volgende gegevens. Column Name Column Type Meaning COMPUTER_NAME Text The name of the computer LOGIN_NAME Text The Jet user name, matching the value that would be

returned by the CurrentUser function (not the operating system user name!)

CONNECTED Boolean Whether or not the user is currently connected

Page 23: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 23 van 40

SUSPECT_STATE Boolean Whether or not the user has left the database in a suspect state (note: this column will never have a False value; it will always be either True or Null).

Deze informatie is dezelfde die wordt geleverd door de MSLDBUsr.dll, aangevuld met de naam van de Jet user. Dit heeft natuurlijk alleen maar zin wanneer er verschillende gebruikers in de beveiligde werkgroep zijn gedefinieerd. Samen met het gebruikers rooster is er een tweede nieuwe eigenschap in Jet 4.0 bekend als ‘Passive Connection Control’. Deze eigenschap geeft je de mogelijkheid om de database in een zodanige staat te brengen dat de ingelogde gebruikers gewoon kunnen doorwerken, maar er geen nieuwe gebruikers meer kunnen inloggen. Wanneer iemand probeert de database te openen, krijgt deze de foutmeldingen te zien alsof de database exclusief door een andere gebruiker geopend is. Passive Connection Control kan alleen gebruikt worden met behulp van de Jet OLE DB provider. De Passive Connection Control kun je via de volgende code gebruiken:

Dim con As ADODB.Connection Set con = CurrentProject.Connection con.Properties("Jet OLEDB:Connection Control") = 1

Wanneer je deze eigenschap ingesteld hebt kun je met behulp van de ‘Gebruikers lijst’ vaststellen wie er nog steeds ingelogd is, en hen laten uitloggen, waarna bijvoorbeeld een repair/compact/back-up uitgevoerd kan worden. Opmerking: Er is geen manier op actief gebruikers van de database af te sluiten. Je moet Open Exclusive rechten op de database hebben om veranderingen in de Connection Control instelling van de database te maken.

22. Hoe verkrijg programmatisch ik groep- en gebruikers informatie? In Microsoft Access 2.0 kunnen alleen leden van de Beheerdersgroep informatie opvragen m.b.t. groepslidmaatschap en rechten van andere gebruikers. Bij de volgende functies wordt verondersteld dat je lid bent van de Beheerdersgroep en dat je voldoende rechten hebt om de code zonder foutmeldingen uit te voeren. In Microsoft Access 95 en later hebben alle gebruikers toestemming om groepslidmaatschapinformatie op te vragen, vooropgesteld dat er gebruik gemaakt wordt van een Microsoft Access 95 of later werkgroepinformatiebestand, en niet van een Microsoft Access 2.0 werkgroepinformatiebestand. Geeft een lijst van de gebruikers in een systeem:

Function faq_ListUsersInSystem () Dim ws As WorkSpace Dim i As Integer Set ws = DBEngine.Workspaces(0) For i = 0 To ws.Users.count - 1 Debug.Print ws.Users(i).Name Next i End Function Geeft een lijst van de groepen in een systeem: Function faq_ListGroupsInSystem () Dim ws As WorkSpace Dim i As Integer Set ws = DBEngine.Workspaces(0) For i = 0 To ws.Groups.count - 1 Debug.Print ws.Groups(i).Name Next i End Function

Page 24: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 24 van 40

Geeft een lijst van de gebruikers in een groep:

Function faq_ListUsersOfGroup (strGroupName As String) Dim ws As WorkSpace Dim grp As Group Dim i As Integer Set ws = DBEngine.Workspaces(0) Set grp = ws.Groups(strGroupName) For i = 0 To grp.Users.count - 1 Debug.Print grp.Users(i).Name Next i End Function

Geeft een lijst van groepslidmaatschap van de gebruikers:

Function faq_ListGroupsOfUser (strUserName As String) Dim ws As WorkSpace Dim usr As User Dim i As Integer Set ws = DBEngine.Workspaces(0) Set usr = ws.Users(strUserName) For i = 0 To usr.Groups.count - 1 Debug.Print usr.Groups(i).Name Next i End Function

Vaststellen of een gebruiker tot een bepaalde groep behoort:

Function faq_IsUserInGroup (strGroup As String, strUser as String) As Integer ' Returns True if user is in group, False otherwise ' This only works if you're a member of the Admins group. Dim ws As WorkSpace Dim grp As Group Dim strUserName as string Set ws = DBEngine.Workspaces(0) Set grp = ws.Groups(strGroup) On Error Resume Next strUserName = ws.groups(strGroup).users(strUser).Name faq_IsUserInGroup = (Err = 0) End Function

23. Hoe verkrijg ik de groepsgegevens van de huidige gebruiker zonder Beheerder-Id en wachtwoord op te nemen in de code? Microsoft Access 2.0: Er is een manier om dit te doen; hoewel, Microsoft ondersteunt dit niet. Het staat toe dat alle gebruikers toegang tot de groep- en gebruikers lidmaatschap gegevens. Deze techniek hoef je niet te gebruiken wanneer je gebruik maakt van Microsoft Access 95 of hoger, omdat je dan toegang tot die informatie hebt zonder dat je tot de groep van beheerders behoort.

Opmerking: Maak eerst een back-up van je werkgroepinformatiebestand (System.mda) voor dat je aan dit proces begint. Wanneer er iets vreselijk mis gaat loop je de kans dat je geen toegang meer hebt tot je applicatie.

Deze methode kent rechten toe aan de gebruikersgroep op twee tabellen in het werkgroepinformatiebestand (waar de groep- en gebruikers informatie wordt opgeslagen):

MSysAccounts MSysGroups

Wanneer je geen lid bent van de Beheerders groep krijg je normaalgesproken een foutmelding wanneer je de gegevens uit deze tabellen wilt bekijken, omdat de rechten op deze tabellen niet zijn ingesteld voor gebruikers. Omdat het werkgroepinformatiebestand ook een Microsoft Access

Page 25: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 25 van 40

database is, kun je deze openen wanneer je ingelogd bent als lid van de Beheerders groep. Je kunt nu de Read Data rechten voor geselecteerde gebruikersgroepen toekennen aan deze twee tabellen (het toekennen van de rechten aan de Users groep geeft de rechten door aan alle gebruikers). Om groepslidmaatschapsinformatie beschikbaar te maken voor geselecteerde gebruikers zijn de volgende stappen zijn noodzakelijk. Er wordt verondersteld dat de naam van het werkgroepinformatiebestand System.mda is.

1. Zorg dat er geen Microsoft Access programma loopt.

2. Maak een kopie van het werkgroepinformatiebestand en noem deze zoiets als “Test.mdb”.

3. Start Microsoft Access. Wanneer je beveiliging hebt ingesteld log je aan als Beheerder.

4. Open test.mdb Via View/Options/General schakel je de optie Show System Objects in. Gebruik Security/Permissions om rechten toe te kennen aan de MsysAccounts en MSysGroups tabellen voor de groepen of gebruikers die toegang moeten krijgen tot de groepslidmaatschapgegevens.

5. Sluit Microsoft Access af.

6. Wis System.mda en hernoem Test.mdb in System.mda.

Bevoegde gebruikers, of gebruikers van bevoegde groepen hebben nu toegang tot de groepslidmaatschapsinformatie op de manier zoals besproken is in hoofdstuk 22 “Hoe verkrijg programmatisch ik groep- en gebruikers informatie?” Microsoft Access 95, Microsoft Access 97, en Microsoft Access 2000: Je hoeft dit in Access 95, Access 97, en Access 2000 niet te doen. Hier hebben alle gebruikers toegang tot de groepslidmaatschapinformatie via het beveiligingsmenu of via code. 24. Hoe voorkom ik dat gebruikers nieuwe objecten aanmaken in mijn database? De volgende functie verwijdert de rechten voor een gespecificeerde gebruiker om nieuwe tabellen of queries te maken in de huidige database. Het argument, strUser, kan gelden voor een gebruiker of voor een groep. Je moet de functie faq_NoNew() niet alleen voor de specifieke gebruiker uitvoeren, maar ook op de Gebruikers groep. Dit omdat de gebruiker expliciete rechten heeft om nieuwe tabellen en queries te maken, en impliciete rechten afgeleid uit de Gebruikers groep. Er bestaat geen enkele manier om de rechten om nieuwe formulieren, rapporten, macro’s of modules te maken te verwijderen, tenzij je de database compileert als een MDE in Access 97 en Access 2000. Je moet Beheerders rechten hebben om de volgende code uit te voeren (in Microsoft Access 2.0 formaat).

Function faq_NoNew (strUser as String) Dim db As Database Dim con As Container Set db = DBEngine(0)(0) Set con = db.Containers("Tables") con.UserName = strUser con.Permissions = con.Permissions And Not DB_SEC_CREATE End Function

Wanneer je de rechten om nieuwe tabellen en queries te maken weer terug wilt zetten gebruik dan de volgende code:

Function faq_OKNew (strUser as String) Dim db As Database Dim con As Container Set db = DBEngine(0)(0)

Page 26: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 26 van 40

Set con = db.Containers("Tables") con.UserName = strUser con.Permissions = con.Permissions Or DB_SEC_CREATE End Function

Microsoft Access 95, Microsoft Access 97, and Access 2000: De intrinsieke constanten zijn het verschil in dit geval. De correcte spelling kan in de Object Browser opgezocht worden, of uit de lijst in hoofdstuk 3 “Wat is er veranderd in Microsoft Access beveiligingen tussen Microsoft Access 2.0, 95, 97, en 2000?” gehaald worden.

… con.Permissions = con.Permissions And Not dbSecCreate …

25. Hoe voorkom ik dat gebruikers op een andere manier gegevens bewerken dan via formulieren? De volgende techniek vereist dat je op een “beveiligde workspace” inlogt zoals in het volgende stukje code:

Set ws = dbengine.CreateWorkspace("NewWS","DevUser","ValidPwd")

Alleen leden van de Beheerders groep kunnen deze rechten toekennen, dus de gebruiker DevUser moet een geldigegebruikers account zijn in de beheerdersgroep, en ValidPwd moet een geldig wachtwoord zijn. Waarschuwing: Het gebruik van deze techniek in Microsoft Access 2.0 kan de beveiliging van de applicatie beïnvloeden (zie hoofdstuk 7”Hoe zit het met het beveiligingslek in Microsoft Access 2.0?” ). Vanwege beveiligingslekken wordt deze techniek afgeraden in Microsoft Access 95. In Access 97 en 2000 kun je een MDE bestand maken, waardoor bescherming wordt geboden voor opgenomen beveiligingsinformatie in de code. Wanneer je geen gebruik maakt van Microsoft Access 2.0, of je denkt niet dat je gebruikers het beveiligingslek het beveiligingslek ontdekken volgen hier de stappen die je moet volgen om ALLE rechten van de onderliggende tabellen te verwijderen voor alle groepen en gebruikers:

1. Log in als gebruiker van de Beheerders groep.

2. Maak een query die toegang heeft tot de tabellen en zet de RunPermissions rechten op Owner’s in plaats van op user’s. Gebruikers hebben zovoldoende rechten om gegevens te lezen, toe te voegen, veranderen, en te wissen. Geen enkele groep of gebruiker, behalve leden van de beheerders groep, heeft op deze manier toegang tot deze query.

3. Maak formulieren en besturingselementen met deze query als gegevensbron.

4. Inclusief de code op de Activate en Deactivate gebeurtenissen zoals hieronder.

5. Ken de rechten Open/Run toe aan dit formulier voor groepen en gebruikers.

Gebruikers kunnen nu geen gegevens meer lezen uit de tabellen of queries. Wanneer het formulier geopend wordt, wordt de Activate gebeurtenis gestart, welke de geschikte rechten toekent aan de gegevensbron van het formulier. De Deactivate gebeurtenis verwijdert de rechten weer. Wanneer het formulier weer de focus krijgt zorgt de Activate gebeurtenis er weer voor dat de rechten worden toegekent. Wanneer het formulier sluit vindt de gebeurtenis Dectivate plaats voor de gebeurtenis close. Pop-up formulieren hebben een ander probleem, omdat deze de Activate en Deactivate gebeurtenis niet oproepen. De code voor deze gebeurtenis moeten verplaatst worden naar respectievelijk de Open en Close gebeurtenissen. De Modal of PopUp eigenschap van deze formulieren moet op Yes gezet worden, of worden opgeroepen via het A_DIALOG argument tijdens de OpenForm actie. Dit heeft hetzelfde effect om het formulier de focus te geven wanneer het zichtbaar is.

Page 27: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 27 van 40

OnActivate : =faq_TblQueryGivePermissions ("MyQuery", Form) OnDeactivate : =faq_TblQueryRemovePermissions (Form) Function faq_TblQueryGivePermissions (pstrRecordSource As String, pfrm As Form) '---------------------------------------------------- ' Use OR operator to assign permissions additively ' Pass permission settings to secured workspace routine ' If recordsource is null, set it up (first time only) ' --------------------------------------------------- Dim lngPermissions As LonglngPermissions = lngPermissions Or DB_SEC_RETRIEVEDATA lngPermissions = lngPermissions Or DB_SEC_INSERTDATA lngPermissions = lngPermissions Or DB_SEC_REPLACEDATA lngPermissions = lngPermissions Or DB_SEC_DELETEDATA 'The form’s RecordSource should have been left blank. If not, 'the user will receive permissions error(s) opening the form 'since the OnOpen event fires before the OnActivate event, 'which is being used to grant the necessary permissions. ' faq_SetPermissions pstrRecordSource, lngPermissions 'Now that the user has permissions to use the RecordSource 'query, we can set the form’s RecordSource. ' If IsNull(pfrm.RecordSource) Then 'Access 2.0 and 95 'If Len(pfrm.RecordSource) = 0 Then 'Access 97 pfrm.RecordSource = pstrRecordSource End If End Function Function faq_TblQueryRemovePermissions (pfrm As Form) ' ---------------------------------------------------- ' Reset permissions by calling secured workspace routine ' ---------------------------------------------------- faq_SetPermissions pfrm.RecordSource, DB_SEC_NOACCESS 'The line below can be substituted if you wish to allow the users to have 'Read Data on the form's Recordsource after the form is closed. ' faq_SetPermissions pfrm.RecordSource , DB_SEC_RETRIEVEDATA End Function Sub faq_SetPermissions (pstrTblQry As Variant, plngPermissions As Long) ' ---------------------------------- ' log in to secured workspace ' establish tables container (also contains queries) ' establish table / query document and user ' set permissions to passed value ' ---------------------------------- Dim ws As WorkSpace, db As Database, con As Container, doc As Document Set db = CurrentDB() Set ws = DBEngine.CreateWorkspace("Temp","System User","Tricky Pswd") Set db = ws.OpenDatabase(db.Name) Set con = db.Containers("Tables") Set doc = con.Documents(pstrTblQry) doc.UserName = CurrentUser() doc.permissions = plngPermissions con.Documents.Refresh db.Close ws.Close End Sub OnActivate : =faq_TblQueryGivePermissions ("MyQuery", Form) OnDeactivate : =faq_TblQueryRemovePermissions (Form)

Function faq_TblQueryGivePermissions (pstrRecordSource As String, pfrm As Form) '---------------------------------------------------- ' Use OR operator to assign permissions additively ' Pass permission settings to secured workspace routine ' If recordsource is null, set it up (first time only) ' --------------------------------------------------- Dim lngPermissions As LonglngPermissions = lngPermissions Or DB_SEC_RETRIEVEDATA lngPermissions = lngPermissions Or DB_SEC_INSERTDATA

Page 28: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 28 van 40

lngPermissions = lngPermissions Or DB_SEC_REPLACEDATA lngPermissions = lngPermissions Or DB_SEC_DELETEDATA 'The form’s RecordSource should have been left blank. If not, 'the user will receive permissions error(s) opening the form 'since the OnOpen event fires before the OnActivate event, 'which is being used to grant the necessary permissions. ' faq_SetPermissions pstrRecordSource, lngPermissions 'Now that the user has permissions to use the RecordSource 'query, we can set the form’s RecordSource. ' If IsNull(pfrm.RecordSource) Then 'Access 2.0 and 95 'If Len(pfrm.RecordSource) = 0 Then 'Access 97 pfrm.RecordSource = pstrRecordSource End If End Function

Function faq_TblQueryRemovePermissions (pfrm As Form) ' ---------------------------------------------------- ' Reset permissions by calling secured workspace routine ' ---------------------------------------------------- faq_SetPermissions pfrm.RecordSource, DB_SEC_NOACCESS 'The line below can be substituted if you wish to allow the users to have 'Read Data on the form's Recordsource after the form is closed. ' faq_SetPermissions pfrm.RecordSource , DB_SEC_RETRIEVEDATA End Function

Sub faq_SetPermissions (pstrTblQry As Variant, plngPermissions As Long) ' ---------------------------------- ' log in to secured workspace ' establish tables container (also contains queries) ' establish table / query document and user ' set permissions to passed value ' ---------------------------------- Dim ws As WorkSpace, db As Database, con As Container, doc As Document Set db = CurrentDB() Set ws = DBEngine.CreateWorkspace("Temp","System User","Tricky Pswd") Set db = ws.OpenDatabase(db.Name) Set con = db.Containers("Tables") Set doc = con.Documents(pstrTblQry) doc.UserName = CurrentUser() doc.permissions = plngPermissions con.Documents.Refresh db.Close ws.Close End Sub

26. Hoe kan ik bepaalde delen van mijn applicatie beveiligen (een Add-In), terwijl andere delen volledig toegankelijk blijven voor Microsoft Access gebruikers? Je zult gebruik moeten maken van twee werkgroepinformatiebestanden: één die je gebruikt voor het ontwikkelen en beveiligen van je applicatie, en één voor de distributie. Het distributie werkgroepinformatiebestand kan het standaard Microsoft Access werkgroepinformatiebestand zijn, als daar je voorkeur naar uit gaat. Wanneer je de applicatie beveiligd met gebruik van je eigen werkgroepinformatiebestand moet je er zeker van zijn dat de standaard Gebruikersgroep alleen de rechten heeft waarvan je wilt dat alle gebruikers ze hebben, terwijl de volledige rechten alleen gelden voor gebruikers van de Beheerders groep van je eigen werkgroepinformatiebestand. Het toekennen van rechten op publieke objecten aan de Gebruikersgroep betekent dat de Gebruikersgroep in een ander werkgroepinformatiebestand (inclusief het standaard System.mda/mdw)deze rechten overerft. Je moet zelf met je ontwikkelaars werkgroepinformatiebestand inloggen om de hele applicatie te modificeren.

1. Pas de stappen toe zoals beschreven in hoofdstuk 1”Welke stappen moet je nemen om een database te beveiligen?”

Page 29: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 29 van 40

2. Gebruik Security/Permissions om rechten toe te kennen of in te trekken van de Gebruikers groep.

3. Verzend je Add-In met je System mda/mdw.

27. Hoe voorkom ik dat gebruikers de AutoExec macro passeren door de Shift toets ingedrukt te houden? Microsoft Access 2.0: Er is geen enkele manier om dit te voorkomen, tenzij je je applicatie distribueert met gebruik van een run-time wersie. In de volledige ‘retail’ versie van Microsoft Access zijn er een paar methoden om gebruikers hierin te ontmoedigen:

1. Je kunt je objectenvoorzien van het voorvoegsel “Usys” zodat ze verborgwn zijn in het Database venster. (Normaalgesproken vinden de meeste mensen een leeg Database venster erg saai en zullen alsnog de AutoExec macro uitvoeren). Het nadeel is dat ze de objecten wel zullen zien wanneer ze de eigenschap Show System/Hidden Objects hebben aangevinkt.

2. Je kunt volledige beveiliging doorvoeren op al je database objecten, zodat gebruikers ze niet kunnen veranderen of beschadigen. Dit is de enige manier om volledige beveiliging toe te passen wanneer de gebruiker een volledige ‘retail’ versie van Microsoft Access heeft.

Microsoft Access 95, Microsoft Access 97, en Microsoft Access 2000: Je kunt de AllowBypassKey eigenschap op False instellen om te voorkomen dat gebruikers de opstart eigenschappen en de AutoExec macro passeren door de SHIFT toets ingedrukt te houden tijdens het opstarten. Deze optie is alleen in te stellen via code.

Deze functie hoeft maar één keer uitgevoerd worden op de database waarvan je de AllowByPass eigenschap wil instellen. De gedocumenteerdde syntax in het Access Help bestand om deze eigenschap te creeren en in te stellen is: CreateProperty(PropertyName, PropertyType, PropertyValue, DDL). Alleen, iedere gebruiker die enige kennis van zaken heeft kan via code deze AllowByPass eigenschap weer uitschakelen. Om je daartegen te beschermen moet je de vierde parameter (DDL) op True instellen. CreateProperty(PropertyName, PropertyType, PropertyValue, True). De volgende functie kan gestart worden vanuit een andere database, of vanuit het ‘Direct’ venster.

Function faq_DisableShiftKeyBypass(strDBName as String, fAllow as Boolean) As Boolean On Error GoTo errDisableShift Dim ws As Workspace Dim db As DATABASE Dim prop As Property Const conPropNotFound = 3270 Set ws = DBEngine.Workspaces(0) Set db = ws.OpenDatabase(strDBName) db.Properties("AllowByPassKey") = Not fAllow faq_DisableShiftKeyBypass = fAllow exitDisableShift: Exit Function errDisableShift: 'The AllowBypassKey property is a user-defined ' property of the database that must be created ' before it can be set. This error code will execute ' the first time this function is run in a database.

Page 30: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 30 van 40

If Err = conPropNotFound Then ' You must set the fourth DDL parameter to True ' to ensure that only administrators ' can modify it later. If it was created wrongly, then ' delete it and re-create it correctly. Set prop = db.CreateProperty("AllowByPassKey", _ dbBoolean, False, True) db.Properties.Append prop Resume Else MsgBox "Function DisableShiftKeyBypass did not complete successfully." Faq_DisableShiftKeyBypass = False GoTo exitDisableShift End If End Function

28. Hoe voorkom ik dat een ‘run-time’ applicatie geopend wordt in een ‘full retail’ Microsoft Access versie? Hiervoor moet je een functie schrijven die gebruik maakt van SysCmd() om te controleren of een database geopend wordt in een ‘run time’ versie van Microsoft Access.

Function KillIt() As Integer If Syscmd(SYSCMD_RUNTIME) = 0 Then ' use the following intrinsic constant for Microsoft Access 95 or 97 ' If Syscmd(acSysCmdRuntime) = 0 Then Application.Quit End If End Function

Roep deze functie op vanuit je opstart formulier, of vanuit de AutoExec macro. Dit is de eerste stap om je te verdedigen. Helaas is het zo, dat wanneer iemand de SHIFT toets ingedrukt houdt tijdens het opstarten hij deze functie passeert. Je moet dus altijd zorgen dat de shift toets uitgeschakeld is, zoals beschreven in het vorige hoofdstuk. Je kunt meerdere oproepen naar de functie KillIt() in je applicatie plaatsen. Bijvoorbeeld bij de openingsgebeurtenissen van je formulieren, of als berekende kolom in je queries. Je houdt de mensen dan misschien niet buiten, maar je maakt het wel heel onaantrekkelijk voor ze om binnen te komen.

Microsoft Access 95, Microsoft Access 97, en Microsoft Access 2000: Je kunt de AllowBypassKey eigenschap instellen zoals besproken in hoofdstuk 27 “Hoe voorkom ik dat gebruikers de AutoExec macro passeren door de Shift toets ingedrukt te houden?” Dit zorgt ervoor dat de AutoExec macro altijd uitgevoerd wordt, zodat je de Kill functie niet in je queries hoeft op te nemen.

29. Werkt Microsoft Access beveiliging ook wanneer ik OLE Automation of Microsoft Query gebruik om Microsoft Access tabellen te bewerken? Ja, want Microsoft Access beveiliging wordt ingesteld op het Microsoft Jet Database Engine niveau, wat niet overschreden kan worden door enige andere applicatie. De Jet Database Engine controleert of een andere gebruiker voldoende rechten heeft voordat de gegevens overgedragen worden. Alleen de rechten die je op een object gezet hebt worden gehonoreerd.

DDE alarm: Wanneer je gegevens via DDE opvraagt moet je één speciaal geval in gedachten houden. Omdat je aan kunt melden op een lopende Microsoft Access sessie, zijn alle rechten geldig van de gebruiker die ingelogd is, niet van de gebruiker die via DDE verbonden is.

30. 28. Hoe kan ik de beveiligingswizard gebruiken zonder een gecodeerde database te maken? Microsoft Access 2.0: Nadat de beveiligingswizard klaar is kun je de database decoderen via het menu File / Database coderen/decoderen. Hier kies je de database die je gemaakt hebt en je kiest decoderen optie in het menu. Om toegang tot deze optie te hebben mag er geen database geopend zijn.

Page 31: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 31 van 40

Microsoft Access 95, Microsoft Access 97, and Microsoft Access 2000: Gebruik dezelfde optie als hierboven omschreven, alleen de menu optie staat onder Extra | Beveiliging | Database coderen/decoderen.

31. Wanneer ik de Beveiligingswizard in Microsoft Access 2.0 gebruik stopt deze na 99%. Microsoft Access 2.0: Dit is een fout in de Microsoft Access 2.0 Beveiligingswizard, die wordt opgeroepen doordat er geen andere objecten dan tabellen in de database staan. Maak een ander object in je database (dat kan een leeg formulier, rapport, macro of module zijn) en voer de beveiligingswizard nog een keer uit.

32. Ik dacht dat ik mijn database had beveiligd, maar iemand heeft deze geopend met zijn of haar eigen werkgroepinformatiebestand. Is de Microsoft Access beveiliging verbroken? Er zijn een aantal dingen die alle werkgroepinformatiebestanden (System.mda) gemeen hebben, de standaard Beheerder gebruiker en de standaard Gebruikersgroep.Wanneer je hieraan rechten toekent, geef je in wezen deze rechten aan iedere willekeurige Microsoft Access gebruiker. (Zie hoofdstuk 26 “Hoe kan ik bepaalde delen van mijn applicatie beveiligen (een Add-In), terwijl andere delen volledig toegankelijk blijven voor Microsoft Access gebruikers?” )

Om dit te voorkomen moet je de stappen opvolgen zoals beschreven in hoofdstuk 1 “Welke stappen moet je nemen om een database te beveiligen?” , met gebruik van de beveiligingswizard om zo alle rechten van de Gebruikersgroep uit te schakelen.

Microsoft Access is een pc desktop database, dus per definitie kan deze niet beveiligd worden, omdat het bestand altijd gekopieerd kan worden. De tools en hackers bestaan om in een fysiek bestand in te breken.De meeste zogenaamde beveiligingslekken in Microsoft Access ontstaan doordat de beveiliging wel bestaat, maar verkeerd wordt begrepen, en daardoor niet goed wordt toegepast. Zoals je hebt kunnen zien vanaf hoofdstuk 1”Welke stappen moet je nemen om een database te beveiligen?”; er zijn een hoop stappen die je moet nemen, en het is gemakkelijk om er één over te slaan, waardoor je database niet optimaal is beveiligd. Daaraan toegevoegd maakt het beveiligingslek in Microsoft Access 2.0 non-data objecten extra kwetsbaar (Zie hoofdstuk 7”Hoe zit het met het beveiligingslek in Microsoft Access 2.0?” voor meer informatie).

Het antwoord is dus dat je tot op zekere hoogte op Microsoft Access beveiliging kunt rekenen. Wanneer je een strenge beveiliging wilt hebben kun je overwegen om een server product zoals SQL Server met geïntegreerde beveiliging toe te passen, op een afgesloten Windows NT of Windows 2000 installatie. Voor applicatie en code beveiliging kun je in Access 97 en hoger de database compileren tot een MDE bestand.

33. Ik wil een administrator op afstand aanmaken, de database kan beheren, gebruikers kan toevoegen maar die niet de rechten op database objecten kan wijzigen. Je kunt dit tot stand brengen met twee verschillende werkgroepinformatiebestanden: één voor de ontwikkelaar, en één voor distributie. Je kunt de database beveiligen met het ontwikkelaarsbestand en rechten toekennen aan je zelfgemaakte groepen (impliciete rechten), zodat alle rechten worden overerft door het groepslidmaatschap. Je gebruikt een tweede werkgroepinformatiebestand om je applicatie te distribueren. Door voor beide werkgroepinformatiebestanden dezelfde groepsnamen en PID’s te gebruiken zijn de rechten op de objecten, toegekend in het ontwikkelaars werkgroepinformatiebestand overerfbaar op deze specifieke groepen. Je kunt nu een lokaal beheerder account aanmaken in het distributie werkgroepinformatiebestand en dit aan de Beheerdersgroep toevoegen. Dit lokaal beheerderaccount heeft dan de mogelijkheden om gebruikers en groepen te verwijderen en aan te maken. Er zijn geen mogelijkheden om rechten op database objecten te veranderen, of om ze te openen, tenzij hij deze rechten overerft omdat hij lid is van de Beheerdersgroep. De reden dat dit

Page 32: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 32 van 40

werkt is, omdat de account van de lokale Beheerder niet in het ontwikkelaars werkgroepinformatiebestand voorkomt waarmee de database is beveiligd. Daarom kan deze lokale beheerder geen rechten beheren op objecten in de database. Anders dan de (standaard) Gebruikersgroep, die voor alle Access werkgroepinformatiebestanden hetzelfde is, is de Beheerdersgroep uniek. De SID van deze groep is gecodeerd met behulp van de gegevens die opgegeven zijn bij het maken van het werkgroepinformatiebestand. De Beheerdersgroep heeft Beheerderrechten die niet kunnen worden ingetrokken; alleen een Beheerders account kan gebruikt worden om een database te beveiligen. Om die reden kan de lokale Beheerder de gebruiker- en groepsinformatie (opgeslagen in het werkgroepinformatiebestand) manipuleren, maar heeft hij geen rechten op database objecten (die opgeslagen liggen in de database, die alleen de originele Beheerdergroep “ziet” als de groep met de vereiste rechten).

Deze techniek werkt gelijkwaardig in alle versies van Microsoft Access. In Microsoft Access 2.0 heeft het werkgroepinformatiebestand de extensie .MDA; in Microsoft Access 95,97 en 2000 heeft het werkgroepinformatiebestand de extensie mdw.

Voer de volgende stappen uit:

1. Maak via het menu Extra | Beveiliging | werkgroepbeheer een nieuw ontwikkelaars werkgroepinformatiebestand (Develop.mda/mdw).

2. Log in via Develop.mda/mdw en volg de noodzakelijke stappen om je database te beveiligen.

3. Wanneer je je eigen ‘custom’ gebruikersgroepen aanmaakt moet je de exacte naam (hoofdlettergevoelig) en PID’s opschrijven die je daarbij gebruikt. Deze gegevens heb je later nodig.

4. Ken de passende rechten toe aan deze groepen, en wees er zeker van dat je geen enkele Beheerders rechten toekent aan deze groepen op enig object in de database. Wees er ook zeker van dat alle rechten van de (standaard) Beheerder en Gebruikersgroep zijn verwijderd.

5. Maak via het menu Extra | Beveiliging | werkgroepbeheer een nieuw gebruikers werkgroepinformatiebestand (User.mda/mdw). Dit gebruik je voor de distributie van de applicatie. Zorg ervoor dat je andere gegevens invult bij Naam, Organisatie en Werkgroep-id dan die je gebruikt hebt bij je Develop.mda/mdw

6. Maak in User.mdw/mda exact dezelfde groepsnamen aan die je gemaakt hebt in je Develop.mda/mdw, door gebruik te maken van de identieke hoofdlettergevoelige namen en PID’s die je in je Develop.mda/mdw gedefinieerd hebt.

7. Maak een gebruikers account aan (SiteAdmin) en voeg dit toe aan de Beheerdersgroep. Dit maakt SiteAdmin de beheerder voor de User.mda/mdw werkgroep.

8. Voeg een wachtwoord toe aan de Beheerder gebruiker, wat er voor zorgt dat het inlogdialoogvenster getoond wordt.

9. Voeg User.mda/mdw toe tijdens de verdeling van je applicatie, niet develop.mda/mdw. De SiteAdmin gebruiker heeft de mogelijkheden om de gebruikers en groepen te beheren, maar heeft niet de mogelijkheid om rechten op de database te veranderen. Je moet de gebruiker die van het SiteAdmin account gebruik maakt wel instrueren om niet de speciaal aangemaakte (custom) gebruikersgroepen te verwijderen. Dit zou als gevolg hebben dat gebruikers geen toegang meer hebben tot de database objecten. Wanneer je rechten moet aanpassen log je in via het Develop.mda/mdw werkgroepinformatiebestand. Wees er zeker van dat geen van de gebruikers in het User.mda/mdw werkgroepinformatiebestand ontwerprechten heeft op enig database object, of op de database zelf!

Page 33: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 33 van 40

34. Hoe kan ik een database beveiliging ongedaan maken? Je moet beheerdersrechten hebben, en/of lid zijn van de Beheerdersgroep in het werkgroepinformatiebestand dat gebruikt is om de database mee te beveiligen. Ken alle rechten toe aan de (standaard) Gebruikersgroep en aan het (standaard) Beheerdersaccount. Voeg de Beheerder weer toe aan de Beheerdersgroep en verwijder het wachtwoord van de beheerdersaccount. Het inlogdialoogvenster wordt niet meer getoond wanneer het wachtwoord van de Beheerdersaccount is verwijderd. Optioneel kun je de beveiligingswizard nog een keer gebruiken om het eigenaarschap van alle objecten weer terug te zetten naar de Beheerder, maar de beveiligingswizard verwijderd ook alle rechten van de gebruikersgroep, want misschien niet je bedoeling is.

35. Ik heb mijn wachtwoord vergeten, ik ben het kwijtgeraakt en ik heb geen toegang meer tot mijn database Dit kan een serieus probleem zijn, nadat je deze FAQ hebt gedownload, omdat je misschien volledige beveiliging hebt toegepast, en op een correcte manier. Er zijn twee mogelijke manieren om het probleem te benaderen:

1. Kijk of je misschien een stap hebt overgeslagen bij het beveiligen van je database. Het is misschien nodig om hoofdstuk 1“Welke stappen moet je nemen om een database te beveiligen?” nog eens door te nemen om te zien of je ergens een stap hebt overgeslagen, of niet correct hebt uitgevoerd, waardoor er misschien een lek in je beveiliging zit.

2. Wanneer je de gebruikersnamen, groepsnamen en PID’s van je werkgroepinformatiebestand hebt bewaard kun je dit weer opbouwen. Als je dit exact hebt gedaan kun je dit werkgroepinformatiebestand weer gebruiken om volledige toegang tot je database te krijgen. Als je niet de Eigenaar, maar wel de Beheerdersgroep kunt maken, dan kun je in een nieuwe beheerder aanmaken. Met die nieuwe beheerder kun je inloggen en de beveiliging ongedaan maken zoals hiervoor beschreven. Daarna kun je de beveiligingen weer opnieuw instellen.

Wanneer geen van deze methoden uitkomst biedt geeft het plaatsen van een posting in een nieuwsgroep misschien een hint waar je informatie kunt vinden om dit probleem op te lossen, of een ‘third-party’ leverancier die je tegen een vergoeding wil helpen met dit probleem.

36. Heb ik een apart werkgroepinformatiebestand nodig voor iedere database die ik ontwikkel in mijn omgeving? Aparte werkgroepinformatiebestanden voor iedere database die gebruikt wordt door dezelfde mensen die je toepassingen gebruiken kan leiden tot beheerders nachtmerries. Het is efficiënter om één werkgroepinformatiebestand te maken met veel groepen, zodat wanneer je een gebruiker of groep verwijderd, je dit maar in één werkgroepinformatiebestand hoeft te doen. Hou wel in de gaten dat gebruikersprofielen en groepslidmaatschappen in het werkgroepinformatiebestand liggen opgeslagen (System.mda/mdw), en dat de actuele rechten op de database objecten in de desbetreffende database zijn opgeslagen. Een methode om uit te vinden welke groep tot een bepaalde database behoort kun je de groepsnamen voorzien van een voorvoegsel waaruit de databasenaam naar voren komt. Een voorbeeld zou zijn “AcctUsers” voor een accounting database, of “mktUsers” voor een marketing database. Je kunt eenvoudigweg alle rechten voor de (standaard) Gebruiker en alle groepen die niet met die database verbonden zijn verwijderen, en alleen rechten toekennen aan de groep die er wel toe behoort.

Wanneer je wel met verschillende werkgroepinformatiebestanden werkt kun je eenvoudig snelkoppelingen maken voor elk afzonderlijk. Zie hoofdstuk 19 “Hoe werk ik op tegelijkertijd met een beveiligde en een onbeveiligde applicatie?” voor meer informatieover hoe je zoiets opzet.

Page 34: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 34 van 40

37. Hoe gebruik ik DAO om rechten te manipuleren? Rechten kunnen aan Container- en Document objecten toegekend worden, en aan Containers en Documents ‘collections’. Rechten zijn eigenschappen van Document objecten die zijn toegekend aan specifieke Gebruikers en Groepen. Het zijn feitelijk gezien ‘bit reeksen’ die een bepaalde beveiligingsconstante representeren. (Zie 3.1 “Tabel 1: DAO Beveiligingsconstanten” voor een compleet overzicht).

Het instellen van de rechten vindt plaats door het combineren van de constanten door gebruik te maken van de Visual Basic for Applications operatoren AND en OR, en door het toekennen van de gewenste rechten aan de desbetreffende gebruiker of groep. De onderstaande code geeft bijvoorbeeld expliciete rechten aan Gebruikersgroep om de database te openen in de ‘shared mode’. Alle code in dit hoofdstuk is gebaseerd op de ingebouwde constanten van Microsoft Access 95, 97 en 2000. Het werkt ook met Microsoft Acces 2.0, wanneer je de betreffende constanten vervangt door de constanten die gebruikt worden in Microsoft Access 2.0 (Zie hoofdstuk 3.0 “Wat is er veranderd in Microsoft Access beveiligingen tussen Microsoft Access 2.0, 95, 97, en 2000?” voor een overzicht van de Microsoft Access 95,97,2000 en Microsoft Access 2.0 constanten).

Dim db As Database Dim con As Container Dim doc As Document Set db = CurrentDb() Set con = db.Containers("Databases") Set doc = con.Documents("MSysdb") doc.UserName = "Users" doc.Permissions = dbSecDBOpen

Je kunt rechten combineren met bestaande rechten. Het volgende voorbeeld wordt het recht om de database exclusief te openen door gebruik te maken van de OR operator toegevoegd aan de bestaande rechten die de Gebruikersgroep heeft.

con.UserName = "Users" con.Permissions = con.Permissions Or dbSecDBExclusive

Wanneer je juist één recht wilt verwijderen, maak je gebruik van de AND NOT operator om de OpenExclusive optie te verwijderen, terwijl de andere rechten intact blijven.

con.UserName = "Users" con.Permissions = con.Permissions And Not dbSecDBExclusive

Als je alleen wilt controleren welke rechten een gebruiker heeft, gebruik je de AND operator en controleer je op specifieke rechten. Het volgende voorbeeld controleert of de Gebruikersgroep het recht heeft om het formulier Employees te openen in de voorbeeld database Northwind:

Dim db as Database Dim con as Container Dim doc as Document Set db = DBEngine(0)(0) Set con = db.Containers("Forms") ' refresh to make sure the collection is current con.Documents.Refresh Set doc = con.Documents("Employees") con.UserName = "Users" If (doc.permissions And acSecFrmRptExecute) > 0 Then Debug.Print "Users group can open Employees form" Else Debug.Print "Users group can’t open Employees form" End If

Page 35: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 35 van 40

38. Ik heb een gebruiker aangemaakt d.m.v. code, maar de gebruiker is niet zichtbaar in de Gebruikersgroep en kan Microsoft Access ook niet opstarten. De meest voor de hand liggende oorzaak hiervan is dat je de gebruiker in een aparte stap aan je Gebruikersgroep moet toevoegen via code. Wanneer je dit via de gebruikersinterface doet gebeurt dit automatisch. De volgende code maakt een nieuwe gebruikersaccount aan en voegt dit toe aan de Gebruikersgroep.

Access 2.0 functie:

Function sCreateUser (ByVal strUser As String, ByVal strPID As String) As Integer '----------------------------------------------------------- ' Create a new user and add them to the Users group ' Returns True on success, False if user already exists '=========================================================== Dim db As Database Dim ws As WorkSpace Dim usr As User Dim grpUsers As Group Dim strSQL As String, varPwd As String ' if the password isn't supplied, make sure you ' pass an empty string for the password argument varPwd = "" Set ws = DBEngine.Workspaces(0) ws.Users.Refresh On Error Resume Next ' check to see if user already exists by using inline ' error handling to trap any errors caused by setting ' a reference to a possibly non-existent user strUser = ws.Users(strUser).Name If Err = 0 Then MsgBox "The user you are trying to add already exists.", _ vbInformation, "Can't Add User" sCreateUser = False Else ' go ahead and create the user account Set usr = ws.CreateUser(strUser, strPID, varPwd) ws.Users.Append usr ws.Users.Refresh ' now add the user to the Users group Set grpUsers = ws.Groups("Users") Set usr = grpUsers.CreateUser(strUser) grpUsers.Users.Append usr grpUsers.Users.Refresh sCreateUser = True End If End Function

Access 95, 97, and 2000 Functie

Public Function sCreateUser(ByVal strUser As String, ByVal _ strPID As String, Optional varPwd As Variant) As Integer '----------------------------------------------------------- ' Create a new user and add them to the Users group ' Returns True on success, False if user already exists '=========================================================== Dim db As DATABASE Dim ws As Workspace Dim usr As User Dim grpUsers As GROUP Dim strSQL As String ' if the password isn't supplied, make sure you ' pass an empty string for the password argument If IsMissing(varPwd) Then varPwd = "" Set ws = DBEngine.Workspaces(0) ws.Users.Refresh On Error Resume Next ' check to see if user already exists by using inline ' error handling to trap any errors caused by setting ' a reference to a possibly non-existent user strUser = ws.Users(strUser).Name If Err.Number = 0 Then

Page 36: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 36 van 40

MsgBox "The user you are trying to add already exists.", _ vbInformation, "Can't Add User" sCreateUser = False Else ' go ahead and create the user account Set usr = ws.CreateUser(strUser, strPID, varPwd) ws.Users.Append usr ws.Users.Refresh ' now add the user to the Users group Set grpUsers = ws.Groups("Users") Set usr = grpUsers.CreateUser(strUser) grpUsers.Users.Append usr grpUsers.Users.Refresh sCreateUser = True End If End Function

39. Ik heb een gebruiker aangemaakt, maar kan niet inloggen als die gebruiker. Wanneer je een gebruiker aanmaakt via het Microsoft Access Beveiligingsmenu, wordt je gevraagd om een naam voor de nieuwe gebruiker in te vullen, en een PID. De PID is geen wachtwoord, en wanneer je dit in het wachtwoord dialoogvenster invult zal je inlog poging mislukken. Nadat je een nieuwe gebruiker hebt aangemaakt moet je als deze gebruiker inloggen, zonder een wachtwoord in te vullen. Wanneer je ingelogd bent kun je een wachtwoord invullen met behulp van de Microsoft Access menu’s. Wanneer je via code een gebruiker aanmaakt kun je het wachtwoord en de PID tegelijkertijd toewijzen, zoals blijkt uit de code in hoofdstuk 38. “Ik heb een gebruiker aangemaakt d.m.v. code, maar de gebruiker is niet zichtbaar in de Gebruikersgroep en kan Microsoft Access ook niet opstarten.”

40. Ik heb de beveiligingswizard gebruikt, maar gebruikers kunnen vanuit een andere werkgroep nog steeds de database openen. Microsoft Access 2.0, Microsoft Access 95: De reden hiervoor is dat de beveiligingswizard van deze twee Microsoft Access versies niet de Open/Run rechten voor de gebruikersgroep van de database zelf verwijderen. Wanneer je alle stappen om de database te beveiligen hebt opgevolgd en je weet zeker dat je niets hebt vergeten, kun je de Open/Run rechten van de Gebruikersgroep verwijderen. Wanneer je het probleem nog steeds hebt, is de kans groot dat je een stap hebt overgeslagen tijdens de beveiliging van je applicatie. Het meest voor de hand liggende is vergeten de Beheerder account uit de beheerdersgroep te verwijderen, of de Beheerder account heeft explicite rechten op objecten). Microsoft Access 97 and Microsoft Access 2000: Er wordt verondersteld dat de beveiligingswizard de Open/Run rechten van de Gebruikersgroep verwijderd, maar dit mislukt in Microsoft Access 97. In Microsoft Access 2000 lijkt het alsof de Open/Run rechten zijn verwijderd, maar dit is niet volledig gebeurt. Hierdoor kunnen gebruikers met de standaard System.mdw een beveiligde Microsoft Access 2000 database openen. De oplossing hiervoor is om een nieuwe database aan te maken, ingelogd als lid van de Beheerdersgroep en hierin alle objecten te importeren.

41. Hoe breng ik beveiliging tot stand wanneer ik een Visual Basic front-end gebruik. Visual Basic 3.0/4.0: Je moet in het bezit zijn van Microsof Access (Microsoft Access 2.0 voor Visual Basic 3.0 of Visual Basic 4.0-16; Microsoft Access 95 voor Visual Basic 4.0-32) om een database te beveiligen. Het werkgroepbeheer programma van Microsoft Access wordt niet met Visual Basic meegeleverd. (Zie hoofdstuk 1”Welke stappen moet je nemen om een database te beveiligen?”). Visual Basic 3.0: Visual Basic 3.0 laat je niet direct rechten of eigenaars toekennen aan objecten. Je moet daarvoor een beveiligingsschema opzetten met Microsoft Access. Zie voor meer informatieKnowledge Base artikel Q105990 “ How Visual Basic 3.0 handles Security Set By Microsoft Access” .

Page 37: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 37 van 40

Visual Basic 4.0, 5.0 and 6.0: Je kunt beveiliging toepassen met behulp van DAO, net zoals in Microsoft Access, vooropgesteld dat je tenminste de 32-bit Visual Basic uitvoering gebruikt in combinatie met Jet 3.0 of hoger. Algemeen gesproken is het opzetten van Microsoft Access beveiliging eenvoudiger dan het schrijven van visual Basic code. Je kunt later altijd de rechten aanpassen via Visual Basic.

42. Heb ik een System.mda nodig wanneer ik Visual Basic gebruik om beveiligde objecten te beheren? Visual Basic 3.0/4.0: Ja, zie hieronder. Visual Basic 3.0: Je kunt gebruik maken van de SetDataAccessOption opdracht binnen Visual Basic om te verwijzen naar het .INI bestand, wat weer verwijst naar het juiste werkgroepinformatiebestand, waarna je de opdracht SetDefaultWorkspace uitvoert. Voordat er enige vorm van gegevenstoegang plaatsvindt, moet je eerst inloggen als een bepaalde gebruiker. In het .INI bestand moet de SystemDB optie op de volgende manier worden omschreven:

[Options] SystemDB=C:\msoffice\access\system.mda

Visual Basic 4.0-16 bit: Wanneer je gebruik maakt van Visual Basic 4.0-16, dan moet je een .INI bestand maken zoals bij Visual Basic 3.0. Als aanvulling moet je de volgende code gebruiken om de Jet 2.5 database aan te spreken:

DBEngine.IniPath = C:\myapp\myapp.ini DBEngine.DefaultUser = "LogonUserName" DBEngine.DefaultPassword = "LogonPassword"

In het .INI bestand moet de SystemDB optie op de volgende manier worden omschreven:

[Options] SystemDB=c:\msoffice\access\system.mda

De gebruikersnaam en het wachtwoord kunnen variabelen of referenties zijn naar besturingselementen. Je moet gebruik maken van de DefaultUser en de DefaultPassword methoden; de CreateWorkspace methode van de DBEngine werkt niet goed wanneer je geen gebruik maakt van de DefaultUser en DefaultPassword methode. Visual Basic 4.0-32 bit tot en met Visual Basic 6.0: Wanneer je Visual Basic 4.0-32 bit en hoger gebruikt moet je onderstaande code gebruiken voordat je de Jet 3.0 en hogere databases aanspreekt:

DBEngine.SystemDB = c:\myapp\system.mdw DBEngine.DefaultUser = "LogonUserName" DBEngine.DefaultPassword = "LogonPassword" Set ws = DBEngine.Workspaces(0) Set db = ws.OpenDatabase("DatabaseName.mdb") Set rs = rs.OpenRecordset("Recordset source")

Merk op dat je de SystemDB methode van het DBEngine object kunt gebruiken om direct naar het werkgroepinformatie bestand te verwijzen, zonder dat gebruik te maken van een referentie naar het .INI bestand. Ook hier kunnen de gebruikersnaam en het wachtwoord variabelen of referenties zijn naar besturingselementen. Let op dat je het DBEngine object eerst initialiseert voordat je gebruik maakt van de methode CreateWorkspace of de methode Workspaces(0) van het DBEngine object.

43. Hoe open ik een wachtwoord beveiligde database vanuit Visual Basic?

Page 38: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 38 van 40

Wanneer je een beschermde database hebt met alleen een wachtwoord beveiliging, kun je de database in Visual Basic 4.0 en hoger openen door gebruik te maken van code die gelijkwaardig is aan onderstaande code. (Veronderstelt dat je database is gelokaliseerd op “c:\path\database.mdb" en dat het wachtwoord "curry" is:

Dim wrk as Workspace Dim dbProtected as Database Set wrk = DBEngine.Workspaces(0) Set dbProtected = wrk.OpenDatabase("c:\path\database.mdb", _ False, False, ";PWD=curry")

Deze zelfde code werkt ook met Microsoft Access 95, Microsoft Access 97, Microsoft Access 2000 wanneer je programmatisch een wachtwoord beveiligde database wilt openen. (Bovenstaande code werkt niet met Microsoft Access 2.0 of met Visual basic 3.0, omdat de Jet1.x en de jet 2.x databases geen wachtwoord beveiligde databases ondersteunt). 44. Hoe open ik een rapport in een beveiligde Access database vanuit Visual Basic?

Omdat rapporten geen onderdeel zijn van DAO, moet je Automation gebruiken om een rapport te openen. De volgende code start een sessie van Microsoft Access:

Dim lngReturn As Long Dim objAccess As Access.Application lngReturn = Shell("C:\MSACCESS.EXE " _ & "/wrkgrp c:\MyMDW.mdw /User username /Pwd password /Nostartup") DoEvents Set objAccess = GetObject(, "Access.Application") objAccess.OpenCurrentDatabase "c:\MyMDB.mdb", False objAccess.DoCmd.OpenReport "MyReport", acViewPreview Set objAccess = Nothing

45. Hoe zit het met het gebruik van ADOX of ADO en het programmatisch beveiligingsbeheer?

Hoewel van ADOX (ADO extensions for Data Defenition en Security) wordt verondersteld dat het gelijke functionaliteit heeft als DAO, komt het behoorlijk tekort wanneer het op beveiliging aankomt. Veel eigenschappen werken simpelweg niet, zoals het toekennen van rechten aan Access objecten (formulieren en rapporten) en het aanmaken van nieuwe gebruikers. Hou het bij DAO wanneer je programmatisch de beveiligingen beheert. Voor meer specifieke informatie over deze tekortkomingen neem dan het officiële verslag, “ Migreren van DAO naar ADO” in de lijst van hoofdstuk 47”Aanvullende informatiebronnen:”.

46. Hoe kan ik via code een database openen die is beveiligd met een ander werkgroepinformatiebestand? Het niet ondersteunde privDBEngine object staat je toe om je aan te melden op een andere database via code. Het opent niet de database door een sessie van Microsoft Access op te starten, maar geeft je alleen toegang tot de Jet objecten (tabellen en queries) Je kunt ieder DAO object gebruiken.

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 secured database that uses ' a different workgroup information file. Dim dbe As PrivDBEngine Dim wrk As Workspace

Page 39: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 39 van 40

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 dbe.DefaultUser = strDefaultUser dbe.DefaultPassword = strDefaultPwd Set wrk = dbe.Workspaces(0) ' Open the secured database. Set dbs = wrk.OpenDatabase(strPathToDatabase) End Sub

Merk op dat het privDBEngine niets anders doet dan een nieuwe sessie openen van de Jet engine Je hebt dezelfde functionaliteit als bij onderstaande code:

Dim dbe As DAO.DBEngine Set dbe = CreateObject("DAO.DBEngine")

De regel “ DAO.DBEngine” wordt gebruikt voor Jet 3.0. Om latere versies te gebruiken, gebruik je “DAO.DBEngine.35” of “DAO.DBEngine.36” voor respectievelijk Access 97 en Access 2000. Voor meer informatie: zie de informatie ‘Migratie van DAO naar ADO’ in de lijst van 47 ” Aanvullende informatiebronnen:”

47. 45. Aanvullende informatiebronnen: • The Security White Paper and Security Wizard are available from Microsoft. For Microsoft Access

95, Microsoft Access 97, and Microsoft Access 2000, the Security Wizard is built into the product.

• ·The online Microsoft Knowledge Base at http://search.support.microsoft.com/kb/.

• SmartAccess (Pinnacle Publishing). Subscription information 1-800-788-1900. Pinnacle can be found on the Internet at http://www.pinpub.com. SmartAccess has published a variety of articles dealing with Microsoft Access security. A catalog of back issues is available upon request.

• Access/VisualBasic SQL Advisor. Subscription information 1-800-336-6060. Advisor can be found on the Internet at http://www.advisor.com. Back issues are available as well as product support and information about conferences hosted by Advisor publications.

• Visual Basic Programmer's Journal. Subscription information 1-800-848-5523. Fawcette (the publishers of VBPJ) can also be found on the Internet at http://www.vbpj.com.

• The white paper, "Migrating from DAO to ADO," discusses the features and limitations of DAO-ADO migration. It can be obtained at http://msdn.microsoft.com/library/techart/daotoadoupdate.htm

• A Security Manager add-in for Access 97 and Access 2000 is available for download from the Microsoft support site. The add-in simplifies administration of a secured database, and enables the user to back up a database's security state as well as set the database's security from a backup.

For the Access 97 Security manager add-in see: Q236010 - ACC97: Microsoft Access Security Manager Add-in Available in Download Center http://support.microsoft.com/support/kb/articles/q236/0/10.asp For the Access 2000 Security manager add-in see: Q235961 - ACC2000: Microsoft Access Security Manager Add-in Available in Download Center http://support.microsoft.com/support/kb/articles/q235/9/61.asp

Page 40: MS Access Security FAQ NL

MICROSOFT® ACCESS BEVEILIGING FAQ

Goos van Beek Pagina 40 van 40