- ·上一篇文章:怎样可以从ACCESS中打印一个WORD文档
- ·下一篇文章:Access数据库开发技巧
了解 Microsoft Access 安全性
了解 Microsoft Access 安全性 Frank C. Rice Microsoft Corporation 2002年7月 适用于:Microsoft? Access 2002 摘要 :本文介绍对 Microsoft Access 2002 提供各种级别保护的不同方法。 目录
简介在早期版本的 Microsoft? Access(Microsoft Access 2000 以前)中,有关安全性的知识有时被认为是无法为任何人所掌握和应用的。您需要按顺序执行很多步骤,一旦遗漏某个步骤或者颠倒了顺序就会带来灾难性的后果。随着 Microsoft Access for Microsoft Windows? 95 的 Security Wizard 出现,以及 Microsoft Access 2000 的 Security Wizard 的不断改进,在 Access 中实现安全性已变得非常简单。但是,即使有了这些帮助,您也必须清楚自己的安全选项,并掌握在中保护数据和对象的操作。否则,轻者会带来数据安全隐患,重者会将您锁在自己的之外。 有很多方法可以保护您的 Access 以及其中包含的数据。在本文中,我们将讨论用于保护组成的各个对象(包含数据)、包含诸如窗体和报表等元素的对象以及代码(可能是中最有价值的部分)的方法。本文中讨论的安全技巧只适用于 Microsoft Access (.mdb) 文件。需要了解的有关保护敏感数据的知识您应该知道,有很多工具和第三方实用程序可以用于探测任何类型的的密码,以及来自任何工作组信息文件的用户名和密码(本文后面将详细介绍工作组信息文件)。如果需要保护敏感数据免受非法访问,最好的安全措施就是使用计算机操作系统提供的文件级安全性和文件共享安全性。文件级安全性涉及在数据文件上设置权限。文件共享安全性涉及限制对数据文件存储位置的访问。文件共享安全性的一个示例是在存储数据文件的文件夹(位于本地计算机或网络服务器上)上设置用户权限。为此,可以将数据拆分到多个文件中,在这些文件上设置用户权限,再将这些文件放置到受保护的文件共享空间中。然后可以从具有安全设置的 Access 链接到这些文件。Access 安全性概述以下各节介绍了几种保护 Access 的方法。加密或解密最简单(也是安全性最低)的保护方法是对进行加密。加密就是将文件压缩,从而使某些实用程序(如字处理器)不能解读这些文件。加密一个不具有安全设置的并不能保证的安全,因为任何人都可以打开并完全访问中的所有对象。有关对进行安全设置的详细内容,请参阅本文后面的 使用 Security Wizard 设置 Access 的安全性 。 加密可以避免在以电子方式传输或者将其存储在软盘、磁带或光盘上时,其他用户偶然访问中的信息。然而 Jet(Access 使用的引擎)使用的加密方法非常薄弱,因此绝不能用于保护敏感数据。“加密/解密”命令位于“工具”菜单的“安全”子菜单中。解密是对加密过程的逆运算。使用自定义界面另一种相对简单的保护方案是使用自定义界面代替 Access 标准界面。与加密一样,它也不能保护中的对象和敏感数据的安全。通过选择“工具”菜单中的“启动”选项,您可以指定自定义的启动窗体、菜单,甚至自定义的标题和图标。还可以选择取消 Database 窗口,从而对缺乏相应技术的应用程序用户隐藏这些对象。“启动”对话框的各项功能也可以通过编程实现。有关如何从“启动”对话框设置启动选项的详细信息,请参阅 Access 帮助中的“关于启动选项”。有关如何通过编程设置启动选项的详细信息,请参阅 Access 帮助 Microsoft Visual Basic? 编辑器的“设置‘启动'选项和编码中的选项”。设置密码您可以在上设置密码,从而要求用户在访问数据和对象时输入密码。 注意: 使用密码保护或其中的对象的安全性也称为共享级安全性。 您不能使用此选项为用户或组分配权限,因此任何掌握密码的人都可以无限制地访问所有 Access 数据和对象。“设置密码”命令位于“工具”菜单的“安全”子菜单中。用户级安全性除共享级安全性外,您还可以使用用户级安全性,它提供了最严格的访问限制,使您能够最大限度地控制及其中包含的对象。这是我们所推荐的保护措施的一部分(当和操作系统提供的文件级和共享级安全性结合使用时),因此我们将在本文后面对用户级安全性做详细介绍。 同样,我们也将讨论用于保护中包含的 Visual Basic for Applications (VBA) 代码的各种方法。 警告: 用户级安全性(在单独使用时)主要用于保护中的代码和对象,以免用户不小心进行了修改或更改。如果不希望用户非法访问窗体、报表或模块中的代码,则 必须 将 .mdb 文件转换为 MDE 文件(本文后面将详细介绍)。要避免用户修改中的查询、宏或数据访问页,唯一的方法就是将文件放在一个受保护的文件共享区域中。此外,在 Access 中不可能既允许用户修改表中的数据,同时又禁止其修改表的设计或删除表。要提供这样一种功能,需要使用一个基于服务器的产品,例如 Microsoft SQL Server?。设置模块密码使用密码可以保护所有标准模块和类模块(例如窗体和报表中包含的代码)以免用户不小心修改或查看 VBA 代码。设置密码后,您只需在每次会话时输入一次密码,以便在 Visual Basic 编辑器中查看或修改代码。除查看和编辑外,在剪切、复制、粘贴、导出或删除任何模块时也都需要密码。但应该清楚的是,使用这种方法保护代码不能防止您或其他用户运行代码,也不能防止其他用户使用第三方实用程序(如 16 进制编辑器)来查看代码。要完全保护代码, 必须 将 .mdb 文件转换为 MDE 文件。 要为项目中的模块设置密码:
使用 MDE 文件通过将文件转换为 MDE 文件,可以完全保护 Access 中的代码免受非法访问。将 .mdb 文件转换为 MDE 文件时,Access 将编译所有模块,删除所有可编辑的源代码,然后压缩目标。原始的 .mdb 文件不会受到影响。新中的 VBA 代码仍然能运行,但不能查看或编辑。将继续正常工作,您仍然可以升级数据和运行报表。尤其是,将 Access 保存为 MDE 文件可以防止以下操作:
关于 Access 用户级安全性Access 使用 Microsoft Jet 引擎来存储和检索中的对象。Jet 引擎使用基于工作组的安全模型(也称为用户级安全性)来判断谁可以打开,并保护所包含对象的安全。无论是否明确设置了的安全性,用户级安全性对所有 Access 始终处于打开状态。您可以通过操纵用户和组帐户的权限和成员身份来更改 Access 中的默认安全级别。下面将对此进行介绍。 无论何时启动 Access,Jet 引擎都要查找工作组信息文件(默认名称为 system.mdw,也可以使用扩展名 .mdw 任意命名)。工作组信息文件包含组和用户信息(包括密码),这些信息决定了谁可以打开,以及他们对中的对象的权限。对单个对象的权限存储在中。这样,例如,就可以赋予一个组的用户(而不是其他用户)使用特定表的权限,而赋予另一个组查看报表的权限,但不能修改报表的设计。 工作组信息文件包括内置组(Admins 和 Users)以及一个通用用户帐户 (Admin),该帐户具有管理及其包含的对象的权限(无限制)。您也可以使用菜单命令(“工具”菜单中的“安全”子菜单)或者通过 VBA 代码添加新的组和用户。 注意: 安装 Access 时,安装程序会自动创建工作组信息文件,并使用您指定的名称和单位信息来命名。因为这一信息通常很容易被判断出来,因而未经授权的用户很可能会创建另一个版本的工作组信息文件,从而在由该工作组信息文件定义的工作组中,为自己设定一个不可撤消的管理员帐户(Admins 组的成员)权限。为防止发生这种情况,应创建一个新的工作组信息文件,并指定唯一的工作组 ID (WID)。这样,只有知道 WID 的用户才能创建该工作组信息文件的副本。本文后面将讨论使用 User-level Security Wizard 创建新的工作组信息文件。 Admins 组不能被删除,其成员具有不可撤消的管理权限。您可以通过菜单或代码删除 Admins 组的权限,但 Admins 组的任何成员都可以重新添加权限。此外,Admins 组中必须始终至少有一个管理的成员。对于没有进行安全设置的,Admins 组始终包含默认的 Admin 用户帐户,它也是所有用户默认登录的帐户。 所有用户必须属于默认的 Users 组,不管他们是否还属于其他组。您可以在 VBA 中创建用户帐户,而并不将新的用户帐户添加到 Admins 组中。然而,如果不同时将该用户帐户添加到 Admins 组中,该用户将无法成功启动 Access,因为 Access 内部使用的用于管理的很多表都映射到 Users 组的权限。 使用以下步骤进行 Access 的安全设置:
手动设置密码您可以为设置密码,从而要求用户在访问时输入密码。然而,一旦用户登录后,便可以不受限制地访问中的数据和对象。 注意: 在设置密码之前,建议备份并将其存储在一个安全的位置。 在设置密码之前,需要以独占方式打开。要以独占方式打开:
通过编程设置密码按以下语法使用关键字 ALTER DATABASE ,您可以编程设置、修改或删除密码。 ALTER DATABASE PASSWORD NewPassword OldPassword 在这个语句中,密码由方括号 ([]) 分隔的 String 值表示,但下述情况例外。 第一次设置密码时,使用 NULL 关键字作为 ALTER DATABASE 语句中的 OldPassword 参数。要删除密码,请使用 NULL 关键字作为 ALTER DATABASE 语句的 NewPassword 参数。在这些情况下,关键字 NULL 不应出现在方框中。 在使用以下过程之前,可能需要设置对 Microsoft ADO Ext 2.5 for DDL and Security 库的引用(如果尚未设置):
使用 Security Wizard 设置 Access 的安全性可以使用 Security Wizard 设置的安全性。为此,请执行以下步骤:
通过编程添加和删除用户和组为设置了安全性后,您可能需要使用用户和组。以下各节展示了其中的一些技巧。 在使用以下各节介绍的过程之前,可能需要设置对 Microsoft ADO Ext 2.5 for DDL and Security 库的引用(如果尚未设置):
添加和删除用户以下过程将创建一个新的用户帐户,然后将其追加到用于当前的工作组信息文件中的默认 Users 组。 注意: 要在 Access 中使用下面的示例,您需要作为 Admins 组的成员登录并打开一个。在下面的过程中,您要确保工作组信息文件不包含在 strUser 中指定了其名称的用户。例如,您可以先调用 DeleteUser 子例程来确保这一点。 请看以下代码: Private Function AddUser(ByVal strUser As String, _ ByVal strPID As String, _ Optional ByVal strPwd As String) As Boolean Dim catDB As ADOX.Catalog On Error GoTo AddUser_Err ' 实例化 Catalog 对象。 Set catDB = New ADOX.Catalog With catDB ' 使用到当前的连接打开 ' Catalog 对象。 .ActiveConnection = CurrentProject.Connection ' 创建新的用户帐户。 .Users.Append strUser, strPwd, strPID ' 向默认 Users 组追加新的用户帐户。 .Groups("Users").Users.Append strUser End With ' 关闭 Catalog 对象。 Set catDB = Nothing AddUser = True AddUser_Err: Msgbox Err.Number & ":" & Err.Description AddUser = False End Function 该过程首先为 Catalog 对象声明一个变量,然后实例化该对象。 注意: Catalog 对象是 Access 文件中所有对象的容器。 然后,该过程打开到当前的连接,并使用来自调用过程的参数,将新用户追加到 Catalog 对象的 Users 集合中。然后新用户被追加到默认的 Users 组。 Users 集合包含了在工作组信息文件中定义的的所有用户。 要删除现有用户,可以使用以下过程: Private Function DeleteUser(ByVal strUser As String) As Boolean Dim catDB As ADOX.Catalog On Error GoTo DeleteUser ' 实例化 Catalog 对象。 Set catDB = New ADOX.Catalog With catDB ' 在当前中打开 Catalog 对象。 .ActiveConnection = CurrentProject.Connection ' 删除 strUser。 .Users.Delete strUser End With ' 关闭 Catalog 对象。 Set catDB = Nothing DeleteUser = True DeleteUser_Err: Msgbox Err.Number & ":" & Err.Description DeleteUser = False End Function 此过程与前面的过程类似,只是使用了 Catalog 对象的 Delete 方法删除了在 strUser String 参数中指定的用户。添加和删除组添加组的过程与添加用户的过程类似。 Private Function AddGroup(ByVal strGroup As String, _ ByVal strPID As String) As Boolean Dim catDB As ADOX.Catalog On Error GoTo AddGroup_Err Set catDB = New ADOX.Catalog With catDB ' 在当前中打开 Catalog 对象。 .ActiveConnection = CurrentProject.Connection ' 创建新的组。 .Groups.Append strGroup, strPID End With ' 关闭 Catalog 对象。 Set catDB = Nothing AddGroup = True AddGroup_Err: Msgbox Err.Number & ":" & Err.Description AddGroup = False End Function 此过程首先实例化 Catalog 对象,然后打开一个到当前的连接。接下来,通过使用来自调用过程的参数,将新组追加到 Catalog 对象的 Groups 集合。 要删除现有组,可以使用以下过程: Private Function DeleteGroup(ByVal strGroup As String) As Boolean Dim catDB As ADOX.Catalog On Error GoTo DeleteGroup_Err Set catDB = New ADOX.Catalog With catDB ' 在当前中打开 Catalog 对象。 .ActiveConnection = CurrentProject.Connection ' 删除 strGroup。 .Groups.Delete strGroup End With ' 关闭 Catalog 对象。 Set catDB = Nothing DeleteGroup = True DeleteGroup_Err: Msgbox Err.Number & ":" & Err.Description DeleteGroup = False End Function 此过程与前面的过程类似,只是使用了 Catalog 对象的 Delete 方法删除了在 strGroup String 参数中指定的组。 下面我们来看看如何通过编程设置对对象的权限。通过编程设置权限要对中的各种对象设置权限,可以使用 Group 或 User 对象的 SetPermissions 方法。在下面的过程中,我们首先撤消组的所有权限,然后再赋予组特定的权限。这样可以确保该组只具有我们指定的权限: Private Function SetGroupPermissions(ByVal strGroup As String, _ ByVal strTable As String, ByVal strObjectType As String, _ ByVal strAction As String, _ ByVal strRevokeEnum As String) As Boolean Dim catDB As ADOX.Catalog On Error GoTo SetGroupPermissions_Err Set catDB = New ADOX.Catalog With catDB ' 在当前中打开 Catalog 对象。 .ActiveConnection = CurrentProject.Connection ' 撤消组的所有权限。 .Groups(strGroup).SetPermissions tblTable, _ strObjectType, strAction, strRevokeEnum ' 赋予组特定的权限。 .Groups(strGroup).SetPermissions tblTable, _ strObjectType, strAction, _ adRightRead Or adRightInsert Or adRightUpdate End With ' 关闭 Catalog 对象。 Set catDB = Nothing SetGroupPermissions = True SetGroupPermissions_Err: Msgbox Err.Number & ":" & Err.Description SetGroupPermissions = False End Function 在当前中打开一个 Catalog 对象后,我们使用了 Groups 集合的 SetPermissions 方法,撤消了该组对 Employees 表的所有权限。第一个参数是表的名称,第二个参数显示了对象的类型,这里是表。第三个参数指定了在设置权限时要执行的操作的类型,第四个参数是一个权限常数,指定了该组没有任何权限。我们已经撤消了该组对 Employees 表的所有权限,现在可以赋予其所希望的权限。 下一个语句的前三个参数与前一个语句中的相同。第四个参数是通过使用 Or 运算符,组合不同的权限常数所创建的一个值。这里,我们赋予了读取、插入和更新该表的权限。 要对指定类型(例如上述示例中的表)的所有新对象设置权限,请将用于赋予权限的语句中的第一个参数更改为 NULL 关键字。例如: ... catDB.Groups(strGroup).SetPermissions NULL, adPermObjTable ...小结在本文中,我们讨论了实现 Access 不同保护级别的各种方法,介绍了共享级和用户级安全性。同时还介绍了如何使用 Access Security Wizard 以及如何通过编程来实现安全设置。安全 |

图 1:“设置安全机制向导”对话框的第二个屏幕
图 2:“设置安全机制向导”对话框的第三个屏幕
图 3:“设置安全机制向导”对话框的第四个屏幕
图 4:“设置安全机制向导”对话框的第五个屏幕
图 5:“设置安全机制向导”对话框的第六个屏幕
图 6:“设置安全机制向导”对话框的第七个屏幕