Cómo obtener los permisos de un objeto para un grupo o usuario
Por Enrique Martínez Montejo
Última revisión: 30/08/2003
 

Mediante el método GetPermissions de la colección Groups o Users de un objeto Catalog de ADOX, podemos obtener los permisos que sobre un objeto tiene un usuario o un grupo de usuarios, para que de ésta forma conozcamos si pueden acceder a la información y manipular los datos de nuestra base de datos de Access, por lo que es necesario al establecer la conexión, que indiquemos la ruta donde se encuentre el archivo de información de grupos de trabajo.

Los tipos de objetos donde se almacenan los permisos corresponden con los valores de las constantes de la enumeración ADOX.ObjectTypeEnum, que entre otros, los más comunes para bases de datos Access son los que a continuación se enumeran:

Constante Valor Descripción
adPermObjTable 1 El objeto es una tabla.
adPermObjColumn 2 El objeto es una columna.
adPermObjDatabase 3 El objeto es una base de datos.
adPermObjProcedure 4 El objeto es un procedimiento.
adPermObjView 5 El objeto es una vista

El método devolverá un valor Long que especifica una máscara de bits que contiene los permisos del grupo o usuario sobre un objeto en concreto, y que puede ser uno o la combinación de varios valores incluidos en la enumaración ADOX.RightsEnum:

Constante Valor Descripción
adRightCreate 16384 El usuario o grupo tiene permiso para crear nuevos objetos de este tipo.
adRightDelete 65536 El usuario o grupo tiene permiso para eliminar datos de un objeto. En objetos como las tablas, el usuario tiene permiso para eliminar valores de datos de los registros.
adRightDrop 256 El usuario o grupo tiene permiso para quitar objetos del catálogo. Por ejemplo, puede eliminar tablas mediante el comando DROP TABLE de SQL.
adRightExclusive 512 El usuario o grupo tiene permiso para tener acceso exclusivo al objeto.
adRightExecute 536870912 El usuario o grupo tiene permiso para ejecutar el objeto.
adRightFull 268435456 El usuario o grupo tiene todos los permisos sobre el objeto.
adRightInsert 32768 El usuario o grupo tiene permiso para insertar en el objeto. En objetos como las tablas, el usuario tiene permiso para insertar datos en la tabla.
adRightMaximumAllowed 33554432 El usuario o grupo tiene el número máximo de permisos permitidos por el proveedor. Los permisos específicos dependen de cada proveedor.
adRightNone 0 El usuario o grupo no tiene permisos sobre el objeto.
adRightRead -2147483648 El usuario o grupo tiene permiso para leer el objeto. En objetos como Table, el usuario tiene permiso para leer los datos de la tabla.
adRightReadDesign 1024
El usuario o grupo tiene permiso para leer el diseño del objeto.
adRightReadPermissions 131072 El usuario o grupo puede ver los permisos específicos de un objeto del catálogo pero no puede cambiarlos.
adRightReference 8192 El usuario o grupo tiene permiso para hacer referencia al objeto.
adRightUpdate 1073741824 El usuario o grupo tiene permiso para actualizar el objeto. En objetos como las tablas, el usuario tiene permiso para actualizar sus datos.
adRightWithGrant 4096 El usuario o grupo tiene permiso para conceder permisos sobre el objeto.
adRightWriteDesign 2048 El usuario o grupo tiene permiso para modificar el diseño del objeto.
adRightWriteOwner 524288 El usuario o grupo tiene permiso para modificar el propietario del objeto.
adRightWritePermissions 262144 El usuario o grupo puede modificar los permisos específicos de un objeto del catálogo.

Cuando un usuario crea una base de datos, inicialmente tiene los permisos que se detallan a continuación:

Permisos sobre la base de datos Valores Permisos sobre las Tablas/Consultas nuevas Valores
Administrar adRightWriteDesign Administrar adRightWriteOwner y adRightWritePermissions
Abrir o ejecutar adRightRead Modificar diseño adRightDrop
Abrir en modo exclusivo adRightExclusive Leer diseño adRightCreate, adRightReadDesign y adRightReadPermissions
    Leer datos adRightCreate, adRightRead, adRightReadDesign y adRightReadPermissions
    Actualizar datos adRightCreate, adRightRead, adRightReadDesign, adRightReadPermissions, adRightUpdate
    Insertar datos adRightCreate, adRightInsert, adRightRead, adRightReadDesign y adRightReadPermissions
    Eliminar datos adRightCreate, adRightDelete, adRightRead, adRightReadDesign y adRightReadPermissions

En cuanto a las restantes cuentas de usuarios existentes, ninguna de ellas dispondrá de permiso alguno, por lo que tendrá que ser el propietario de la base de datos, o una cuenta de usuario perteneciente al grupo Administradores la que conceda al usuario los permisos oportunos.

Por último, en lo que concierne a las cuentas de grupos de usuarios, al crear la base de datos los grupos por defecto Administradores y Usuarios tienen permisos para todos los objetos que conforman la base de datos, salvo que posteriormente se le rescindan tales privilegios.

El siguiente ejemplo implementa una función que devolverá los permisos que sobre un objeto de la base de datos tendrá la cuenta especificada en el argumento, la cual puede pertenecer tanto a un usuario como a un grupo de usuarios. Hay que hacer la salvedad que dicha función espera un objeto Catalog previamente configurado.

Private Function GetPermissions(cat As ADOX.Catalog, _
                                ByVal sUserName As String, _
                                ByVal sObjectName As String, _
                                Optional ByVal lObjectType As ADOX.ObjectTypeEnum = adPermObjTable, _
                                Optional ByVal bIsGroup As Boolean) As ADOX.RightsEnum

    On Error GoTo ErrGetPermissions

    ' Leemos los permisos que el grupo o usuario tiene sobre el objeto indicado
    '

    If (bIsGroup) Then
        ' Es un grupo
        GetPermissions = cat.Groups(sUserName).GetPermissions(sObjectName, lObjectType)
    Else
        ' Es un usuario
        GetPermissions = cat.Users(sUserName).GetPermissions(sObjectName, lObjectType)
    End If

    Exit Function

ErrGetPermissions:
    ' Se ha producido un error, por lo que la función retornará un
    ' número que debe de ser distinto de cero y que no coincida con
    ' ningún valor de la enumeración ADOX.RightsEnum
    '

    GetPermissions = -1

End Function

Para llamar a la función, simplemente bastará con utilizar un procedimiento parecido al siguiente:

Private Sub Command1_Click()

        Dim cat As ADOX.Catalog
        Dim lngPerm As ADOX.RightsEnum

        ' Creamos un objeto Catalog
        Set cat = New ADOX.Catalog

        ' Configuramos el objeto Catalog
        cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                               "Data Source=C:\Mis documentos\bd1.mdb;" & _
                               "Jet OLEDB:System Database=C:\Mis documentos\System.mdw;" & _
                               "User ID=Admin;" & _
                               "Password="

        ' Obtenemos los permisos que el grupo de usuarios «Users» tiene sobre un objeto
        ' de la base de datos, en éste caso, sobre las Tablas/Consultas nuevas
       
lngPerm = GetPermissions(cat, "Users", "", adPermObjDatabase, True)

End Sub

Indicar que, para obtener información sobre el objeto propiamente dicho de la base de datos, indicar en el parámetro sObjectName una cadena de longitud cero, ya que es el parámetro que espera el método GetPermissions de la colección Groups o Users del objeto Catalog:

lngPerm = GetPermissions(cat, "Admin", "", adPermObjDatabase)

Como la función devuelve una máscara de bits, podemos utilizar el operador And para ejecutar una comparación bit a bit entre el valor devuelto y algún valor de permisos que deseemos conocer, de tal forma que si es cero, dicho permiso no lo tiene establecido el usuario actual; cualquier otro número distinto de cero significará que sí tiene asignado el permiso cuyo valor se ha comparado en la operación realizada:

If ((lngPerm) And (adRightCreate)) Then
    MsgBox "Tiene permiso para crear nuevos objetos."
Else
    MsgBox "No tiene permiso."
End If

 

Otros enlaces de interés:

Cómo obtener y especificar el propietario de un objeto

Cómo establecer los permisos de un objeto para un grupo o usuario

Colección de ejemplos de la biblioteca de ADOX


Enrique Martínez Montejo - 2003

NOTA: La información contenida en este artículo, así como el código fuente incluido en el mismo, se proporciona COMO ESTÁ, sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo explicado, recomendado o sugerido en el presente artículo.

NOTE: The information contained in this article and source code included therein, is provided AS IS without warranty of any kind, and confers no rights. You assume any risk to implement, use or run it explained, recommended or suggested in this article.