Adventures As Me


MS Technical documentation strikes again!

Written 17 Feb 2004

This is an oddity I've encountered in the past. An entry in Microsoft's Technical Docs (help file and MSDN) states that a certain property is read/write. To read the value you do:

  temp = object.property
To set (write) the value you do:
  object.property = temp
Seems rather straightforward doesn't it. However in practice it can go awry. 2 -3 years ago dummy entries were entered in the registry on a test machine. How, I don't know because I never assigned values to the functions that read the values.

Yesterday this oddity bit me again. This time it was within MS Access while checking the permissions available. The API provided doesn't reproduce what the GUI shows as the permissions assigned. Hence I did a bit of testing with my code to see if I could spot something I did wrong.

The testing produced this lovely code:

Sub CheckPermissions()
  Dim db As Database
  Dim con As Container
  Dim doc As Document
  Dim perms As Scripting.Dictionary
  
  DBEngine.SystemDB = "W:\path\to\the\security.mdw"
  
  Set db = DBEngine(0)(0)
  Set perms = CreateObject("Scripting.Dictionary")
  
  perms.Add "dbSecNoAccess", dbSecNoAccess
  perms.Add "dbSecFullAccess", dbSecFullAccess
  perms.Add "dbSecDelete", dbSecDelete
  perms.Add "dbSecReadSec", dbSecReadSec
  perms.Add "dbSecWriteSec", dbSecWriteSec
  perms.Add "dbSecWriteOwner", dbSecWriteOwner
  perms.Add "acSecFrmRptExecute", acSecFrmRptExecute
  perms.Add "acSecFrmRptReadDef", acSecFrmRptReadDef
  perms.Add "acSecFrmRptWriteDef", acSecFrmRptWriteDef
  perms.Add "acSecMacExecute", acSecMacExecute
  perms.Add "acSecMacReadDef", acSecMacReadDef
  perms.Add "acSecMacWriteDef", acSecMacWriteDef
  perms.Add "acSecModReadDef", acSecModReadDef
  perms.Add "acSecModWriteDef", acSecModWriteDef
  perms.Add "dbSecCreate", dbSecCreate
  perms.Add "dbSecWriteDef", dbSecWriteDef
  perms.Add "dbSecReadDef", dbSecReadDef
  perms.Add "dbSecRetrieveData", dbSecRetrieveData
  perms.Add "dbSecInsertData", dbSecInsertData
  perms.Add "dbSecReplaceData", dbSecReplaceData
  perms.Add "dbSecDeleteData", dbSecDeleteData
  perms.Add "dbSecDBAdmin", dbSecDBAdmin
  perms.Add "dbSecDBCreate", dbSecDBCreate
  perms.Add "dbSecDBExclusive", dbSecDBExclusive
  perms.Add "dbSecDBOpen", dbSecDBOpen

  Debug.Print
  Set con = db.Containers("Scripts")
  'Set doc = con.Documents("Incentive")

  ' refresh to make sure the collection is current
  con.Documents.Refresh
  con.UserName = "Users" 'Hard code a user
    
  Debug.Print con.UserName & " - " & con.Name '& ": " & doc.Name
  Debug.Print "doc.Permissions: " & doc.Permissions
  Debug.Print "doc.AllPermissions: " & doc.AllPermissions
  Debug.Print "dbSecFullAccess: " & dbSecFullAccess
  Debug.Print "Anded: " & (con.Permissions And perms.Item("dbSecFullAccess"))
  For Each doc In con.Documents
    For Each p In perms.Keys
      msg = doc.Name & "[" & p & "]"
      If (doc.Permissions And perms.Item(p)) > 0 Then
        msg = msg & ": Yes"
      ElseIf (doc.AllPermissions And perms.Item(p)) = 0 Then
        msg = msg & ": No Access"
      Else
        msg = msg & ": No"
      End If
      Debug.Print msg
    Next
  Next
End Sub

Running it showed what I expected to see. However it had a strange side-effect. It reset all the permissions for the group. Actually I should say it revoked all the permissions for the group! Not nice, especially when people began calling that they could no longer access the DB.

It was much fun to reset the permissions because I had no idea what they were in the first place (I did not set them originally). This was with MS Access 2003.

Related Posts