了解 Microsoft Access 安全性
了解 Microsoft Access 安全性
有很多方法可以保护您的 Access 数据库以及其中包含的数据。在本文中,我们将讨论用于保护组成数据库的各个对象(包含数据)、包含诸如窗体和报表等元素的对象以及代码(可能是数据库中最有价值的部分)的方法。本文中讨论的安全技巧只适用于 Microsoft Access 数据库 (.mdb) 文件。
以下各节介绍了几种保护 Access 数据库的方法。
加密可以避免在以电子方式传输数据库或者将其存储在软盘、磁带或光盘上时,其他用户偶然访问数据库中的信息。然而 Jet(Access 使用的数据库引擎)使用的加密方法非常薄弱,因此绝不能用于保护敏感数据。“加密/解密数据库”命令位于“工具”菜单的“安全”子菜单中。解密数据库是对加密过程的逆运算。
必须将 .mdb 文件转换为 MDE 文件。
要为项目中的模块设置密码: 为该项目从 Visual Basic 编辑器的“工具”菜单中选择“属性”命令。 在“项目属性”对话框中,单击“保护”选项卡。 选中“查看时锁定工程”复选框并键入密码。 在“确认密码”框中,重新键入密码,然后单击“确定”。 通过将数据库文件转换为 MDE 文件,可以完全保护 Access 中的代码免受非法访问。将 .mdb 文件转换为 MDE 文件时,Access 将编译所有模块,删除所有可编辑的源代码,然后压缩目标数据库。原始的 .mdb 文件不会受到影响。新数据库中的 VBA 代码仍然能运行,但不能查看或编辑。数据库将继续正常工作,您仍然可以升级数据和运行报表。尤其是,将 Access 数据库保存为 MDE 文件可以防止以下操作: 在设计视图中查看、修改或创建窗体、报表或模块。 添加、删除或更改对对象库或数据库的引用。 使用 Access 或 VBA 对象模型的属性或方法更改代码 - MDE 文件不包含可编辑代码。 导入或导出窗体、报表或模块。而表、查询、数据访问页和宏可以导入非 MDE 数据库,或从中导出。 要将 .mdb 文件转换为 MDE 文件: 关闭数据库。 单击“工具”菜单中的“数据库实用工具”。 单击“生成 MDE 文件”。 在“保存数据库为 MDE”对话框中,找到 .mdb 文件,然后单击“生成 MDE”。 有关将 .mdb 文件转换为 MDE 文件的更多要求,请参阅 Access 帮助中的“保护 Access 数据库中的 Visual Basic for Applications 代码”。
下面我们来看看用户级安全性。
Access 使用 Microsoft Jet 数据库引擎来存储和检索数据库中的对象。Jet 数据库引擎使用基于工作组的安全模型(也称为用户级安全性)来判断谁可以打开数据库,并保护数据库所包含对象的安全。无论是否明确设置了数据库的安全性,用户级安全性对所有 Access 数据库始终处于打开状态。您可以通过操纵用户和组帐户的权限和成员身份来更改 Access 中的默认安全级别。下面将对此进行介绍。
无论何时启动 Access,Jet 数据库引擎都要查找工作组信息文件(默认名称为 system.mdw,也可以使用扩展名 .mdw 任意命名)。工作组信息文件包含组和用户信息(包括密码),这些信息决定了谁可以打开数据库,以及他们对数据库中的对象的权限。对单个对象的权限存储在数据库中。这样,例如,就可以赋予一个组的用户(而不是其他用户)使用特定表的权限,而赋予另一个组查看报表的权限,但不能修改报表的设计。
工作组信息文件包括内置组(Admins 和 Users)以及一个通用用户帐户 (Admin),该帐户具有管理数据库及其包含的对象的权限(无限制)。您也可以使用菜单命令(“工具”菜单中的“安全”子菜单)或者通过 VBA 代码添加新的组和用户。
Admins 组不能被删除,其成员具有不可撤消的管理权限。您可以通过菜单或代码删除 Admins 组的权限,但 Admins 组的任何成员都可以重新添加权限。此外,Admins 组中必须始终至少有一个管理数据库的成员。对于没有进行安全设置的数据库,Admins 组始终包含默认的 Admin 用户帐户,它也是所有用户默认登录的帐户。
所有用户必须属于默认的 Users 组,不管他们是否还属于其他组。您可以在 VBA 中创建用户帐户,而并不将新的用户帐户添加到 Admins 组中。然而,如果不同时将该用户帐户添加到 Admins 组中,该用户将无法成功启动 Access,因为 Access 内部使用的用于管理数据库的很多表都映射到 Users 组的权限。
使用以下步骤进行 Access 数据库的安全设置: 将新用户帐户添加到 Admins 组中。该用户对数据库中的对象具有管理权限。 从 Admins 组中删除默认的 Admin 用户帐户。 从 Admin 用户和 Users 组中删除权限。 为所创建的任何自定义组分配权限。 在默认 Admin 用户帐户上设置密码会激活登录对话框,从而每次启动 Access 时都会提示用户输入用户名和密码。如果您没有在 Admin 帐户上设置密码,用户将自动作为 Admin 用户登录,无需密码,也不会出现登录对话框。
对数据库中对象的权限可以是显式的(直接分配给用户帐户)或隐式的(从用户所属的组继承),也可以是两者的结合。Access 在权限问题上使用“最少限制”规则,即用户的权限包括其显式和隐式权限的总和。例如,如果用户 A 的帐户具有限制权限,而用户 A 属于一个具有限制权限的组,同时也属于另一个具有管理(所有)权限的组,那么用户 A 将具有管理权限。有鉴于此,通常最好不要为用户帐户分配显式权限。而应创建具有不同权限的组,然后将用户分配给具有适当权限的组,这会减少数据库管理方面的麻烦。
在以下各节中,我们将展示如何通过用户界面和编程手段来保护数据库及其包含的对象。首先,我们来看看几种设置数据库密码的不同方法。
如果数据库处于打开状态,关闭数据库。 单击“文件”菜单中的“打开”重新打开数据库。 在“打开”对话框中,找到数据库,单击“打开”按钮旁边的箭头,然后单击“以独占方式打开”。 要手动设置数据库密码: 在“工具”菜单中,指向“安全”,然后单击“设置数据库密码”。 在“密码”框中,键入密码。 现在就设置了数据库密码。下次您或其他用户打开数据库时,会出现一个对话框要求输入密码。下面我们来看看如何通过编程设置数据库密码。
ALTER DATABASE,您可以编程设置、修改或删除数据库密码。
在这个语句中,密码由方括号 ([]) 分隔的 String 值表示,但下述情况例外。
第一次设置数据库密码时,使用 NULL 关键字作为 ALTER DATABASE 语句中的 OldPassword 参数。要删除数据库密码,请使用 NULL 关键字作为 ALTER DATABASE 语句的 NewPassword 参数。在这些情况下,关键字 NULL 不应出现在方框中。
在使用以下过程之前,可能需要设置对 Microsoft ADO Ext 2.5 for DDL and Security 库的引用(如果尚未设置): 在 Visual Basic 编辑器中,指向“工具”菜单中的“引用”。将显示“引用”对话框。 选中 Microsoft ADO Ext 2.5 for DDL and Security 复选框。 请看以下第一次设置密码时的代码:
此过程接受用户的密码以及 .mdb 文件的路径。首先,我们声明一个变量,代表对不具有安全设置的数据库的连接,同时声明一个 String 变量以包含我们用于更改密码的 SQL 语句。下一步,我们将 strAlterPassword 设置给使用 ALTER DATABASE PASSWORD 关键字的 Jet SQL 语句。请注意,因为我们不是要替换密码,因而第二个参数被设置为 NULL。下一步,我们打开一个到该数据库的连接。要设置密码,必须以独占方式打开数据库,因此要设置 Mode 属性。然后执行 SQL 语句。您通常可以从一个数据库运行此过程,以便在一个单独的不具有安全设置的数据库中设置密码。如果一切正常,函数返回 True。
如果要更改具有安全设置的数据库的密码,首先需要使用旧密码登录数据库,然后再更改密码。以下过程显示了这一技术。
在使用以下过程之前,可能需要设置对 Microsoft ADO Ext 2.5 for DDL and Security 库的引用(如果尚未设置): 在 Visual Basic 编辑器中,指向“工具”菜单中的“引用”。将显示“引用”对话框。 选中 Microsoft ADO Ext 2.5 for DDL and Security 复选框。 请看以下过程:
此过程与前面的子例程类似,只是在登录具有安全设置的数据库时,需要使用更改之前的旧密码。为此,针对要更改的数据库,我们设置了 Connection 对象的 Database Password 属性。这是 Connection 对象的扩展属性之一,所以我们使用了如上所示的特殊语法。要从具有安全设置的数据库中删除密码,也可以使用此过程,只需将 ALTER DATABASE 语句的第一个参数替换为 NULL 关键字即可。
下面我们来看看如何实现比在数据库中设置密码更强大的保护手段。
可以使用 Security Wizard 设置数据库的安全性。为此,请执行以下步骤: 打开要设置安全性的数据库。 在“工具”菜单中,指向“安全”,然后单击“设置安全机制向导”。将显示“设置安全机制向导”对话框。 因为我们要创建一个新的工作组信息文件,因此请确保选中此选项,然后单击“下一步”。 在“设置安全机制向导”对话框的第二个屏幕中(见图 1),为工作组信息文件键入一个新名称,或者接受默认名称。键入一个工作组 ID (WID)。WID 唯一标识了此工作组文件的 Admins 组。下一步,在相应的文本框中键入您的姓名和单位。虽然这些输入是可选的,但最好还是填入,因为只有知道这些信息的人才能重新创建工作组信息文件。
您也可以选择是否使用此工作组信息文件作为所有数据库的默认文件,或者只是用于这个特定的数据库。单击“创建快捷方式,打开设置了安全机制的数据库”选项,然后单击“下一步”。 在下一个屏幕中(见图 2),可以选择希望向导设置其安全机制的对象。默认情况下,向导将为所有现有对象和所有新创建的对象设置安全机制。单击“下一步”。
在下一个屏幕中(见图 3),您可以选择可选的具有特定权限的安全组。我们强烈建议您使用组来管理用户的访问权限,而不是赋予每个用户特定的权限。选择任何其他组帐户,然后单击“下一步”。
在此屏幕中(见图 4),您可以为 Users 组设置特定的权限。因为所有用户都自动成为 Users 组的成员,在此选择的任何权限都会应用于所有用户,所以最好限制该组的权限,或者保留默认设置 - 没有任何权限。单击“下一步”。
在下一个屏幕中(见图 5),您可以向工作组信息文件中添加用户。还可以为每个用户选择密码和个人 ID (PID)。Access 使用 PID 和帐户名为工作组标识唯一的用户。添加用户并单击“下一步”。
在此屏幕中(见图 6),您可以向工作组信息文件中的组添加用户。进行您的选择后单击“下一步”。
在最后一个屏幕中,为不具有安全设置的数据库的备份选择一个名称。保护好此原始数据库的备份是很有必要的,以防万一丢失或损坏了具有安全设置的数据库。单击“完成”。原始数据库将用 .bak 扩展名保存。 单击“完成”后,Security Wizard 将加密数据库,然后要求您使用新的工作组信息文件重新打开进行了安全设置的数据库。 下面我们来看看几种编程使用用户和组的方法。
Microsoft ADO Ext 2.5 for DDL and Security 库的引用(如果尚未设置): 在 Visual Basic 编辑器中,指向“工具”菜单中的“引用”。将显示“引用”对话框。 选中 Microsoft ADO Ext 2.5 for DDL and Security 复选框。
strUser 中指定了其名称的用户。例如,您可以先调用 DeleteUser 子例程来确保这一点。请看以下代码:
该过程首先为 Catalog 对象声明一个变量,然后实例化该对象。
然后,该过程打开到当前数据库的连接,并使用来自调用过程的参数,将新用户追加到 Catalog 对象的 Users 集合中。然后新用户被追加到默认的 Users 组。Users 集合包含了在工作组信息文件中定义的数据库的所有用户。
要删除现有用户,可以使用以下过程:
此过程与前面的过程类似,只是使用了 Catalog 对象的 Delete 方法删除了在 strUser String 参数中指定的用户。
此过程首先实例化 Catalog 对象,然后打开一个到当前数据库的连接。接下来,通过使用来自调用过程的参数,将新组追加到 Catalog 对象的 Groups 集合。
要删除现有组,可以使用以下过程:
此过程与前面的过程类似,只是使用了 Catalog 对象的 Delete 方法删除了在 strGroup String 参数中指定的组。
下面我们来看看如何通过编程设置对数据库对象的权限。
Group 或 User 对象的 SetPermissions 方法。在下面的过程中,我们首先撤消组的所有权限,然后再赋予组特定的权限。这样可以确保该组只具有我们指定的权限:
在当前数据库中打开一个 Catalog 对象后,我们使用了 Groups 集合的 SetPermissions 方法,撤消了该组对 Employees 表的所有权限。第一个参数是表的名称,第二个参数显示了对象的类型,这里是表。第三个参数指定了在设置权限时要执行的操作的类型,第四个参数是一个权限常数,指定了该组没有任何权限。我们已经撤消了该组对 Employees 表的所有权限,现在可以赋予其所希望的权限。
下一个语句的前三个参数与前一个语句中的相同。第四个参数是通过使用 Or 运算符,组合不同的权限常数所创建的一个值。这里,我们赋予了读取、插入和更新该表的权限。
要对指定类型(例如上述示例中的表)的所有新对象设置权限,请将用于赋予权限的语句中的第一个参数更改为 NULL 关键字。例如: