是否可以在 MS Access 中对设计视图进行密码保护?还是通过代码?

Posted

技术标签:

【中文标题】是否可以在 MS Access 中对设计视图进行密码保护?还是通过代码?【英文标题】:Is it possible to password protect Design view in MS Access? or through code? 【发布时间】:2020-03-03 06:16:53 【问题描述】:

我已经搜索过类似的问题,但没有得到我想要的答案。

我正在尝试使用 VBA 代码禁用 MS Access 功能区工具栏中的设计视图选项,以便用户无法访问它。我正在使用 MS Access 2007。

我已经尝试了here 提供的代码,但这对我不起作用。

我也尝试过 File->options 方法从功能区中删除设计视图。但是通过这一步,用户只需很少上网就可以返回设计视图,因此不会选择此解决方案。

有没有办法让设计视图密码保护就像我们对代码部分所做的那样?

【问题讨论】:

【参考方案1】:

在没有数据库的情况下打开 Access 程序

现在选择菜单文件 -> 打开

在文件打开对话框的右下角,取消按钮的左侧,将“打开”下拉菜单更改为“以独占方式打开”

按住左 Shift 键,这样您的启动代码就不会运行

现在选择您的数据库文件,然后单击“打开”按钮(在您已将其下拉菜单更改为“以独占方式打开”之后)

现在单击 Office 2013 功能区下的“文件”菜单。

有一个非常大的按钮,上面写着“使用密码加密”。

单击它并输入您的秘密数据库密码。

点击“确定”按钮后关闭数据库并重新打开。

现在没有人可以更改表单设计(除非他们知道您设置的密码)

【讨论】:

嗨,迈克,这会创建密码来保护代码。我正在设计视图中寻找密码保护,我们在其中拖放按钮和文本框等。 将 .accdb 转换为内部加密的 .accde 并且表单不可编辑(即使您自己也无法编辑,因此请保留原始 .accdb 用于开发并将 .accde 发布给您的最终用户) 【参考方案2】:

您有几个选项可以“保护”设计视图。正如一条评论所建议的那样,您可以为您的用户部署一个 accde 版本 - 但这消除了在文件中的设计视图中访问的任何可能性,因此如果您的用户有一个奇怪的错误,您必须将他们部署为“解锁' accdb 来查找问题。此外,您需要使用用户拥有的正确位版本来编译 accde 以使 accde 工作。例如,如果您拥有 32 位版本的访问权限,但您的用户拥有 64 位(或反向)版本,则 accde 将不会运行。所以,我建议用设置和一些代码来屏蔽它。

我已经在部署文件之前运行了一个“安全”功能 - 我在我的机器上保留了一个“解锁”开发副本,以及一个可以以编程方式“解锁”访问文件的“解锁器”文件.我已经将它与 2010、2013、2016 和 365 一起使用 - 所以我想它应该与 2007 一起使用。

我将我的代码放在下面,如果您有任何问题,请告诉我。

代码如下:

    Public Function UpdateDatabaseFileProperties( _
        sDatabaseFile As String _
        , bEnable As Boolean _
        ) As Boolean

    '   Error Direction
                                                        '
        On Error GoTo ErrorHandling
                                                        '
    '   Declare
                                                        '
        Dim AccObj As Access.Application
                                                        ' an array to hold the properties to change
        Dim arrProperty() As Variant
                                                        ' a counter to run through the permissions list
        Dim iCounter As Integer
                                                        '
    '   Set
                                                        ' an array of properties to change
        arrProperty = Array( _
            "StartupShowStatusBar" _
            , "AllowBuiltInToolbars" _
            , "StartupShowDBWindow" _
            , "AllowFullMenus" _
            , "AllowBreakIntoCode" _
            , "AllowSpecialKeys" _
            , "AllowByPassKey" _
            , "AllowShortcutMenus" _
            , "AllowDatasheetSchema" _
            )
                                                        ' set the access object
        SetAccessFileObject AccObj, sDatabaseFile, True, False, False
                                                        '
    '   Use Variables
                                                        '
        For iCounter = LBound(arrProperty) To UBound(arrProperty)
                                                        ' change the property of the database
            ChangeDatabaseProperty CStr(arrProperty(iCounter)), dbBoolean, bEnable, AccObj, True, False
                                                        ' go to the next property
        Next iCounter
                                                        ' set the navigation pane lock
        AccObj.DoCmd.LockNavigationPane bEnable
    ' close the file when complete
        CloseAccessDatabaseFile AccObj
                                                        '
    ExitCodeBlock:
                                                        '
    '   Clear Variables
                                                        '
        Exit Function
                                                        '
    '   Error Handling
                                                        '
    ErrorHandling:
                                                        '
        ErrorHandler Err.Number, Err.Description, lModuleID, 0
                                                        '
    End Function

Public Function ChangeDatabaseProperty( _
    sPropertyName As String _
    , vPropertyType As Variant _
    , vPropertyValue As Variant _
    , AccObj As Access.Application _
    , Optional bLeaveOpenAfterEdit As Boolean = False _
    , Optional bGiveUserControl As Boolean = False _
    ) As Boolean
                                                    '
'   Error Direction
                                                    '
    On Error GoTo ErrorHandling
                                                    '
'   Declare
                                                    '
    Dim dbs As DAO.Database
                                                    '
    Dim prp As DAO.Property
                                                    '
    'Dim AccObj As Access.Application
                                                    '
'   Set
                                                    ' set the database object
    Set dbs = AccObj.CurrentDb
                                                    '
'   Use Variables
                                                    ' set the property value
    dbs.Properties(sPropertyName).Value = vPropertyValue
                                                    ' if the file should not be left open after the changes are made
    If bLeaveOpenAfterEdit = False Then
                                                    ' quit the file and save all changes
        AccObj.Quit acQuitSaveAll
                                                    ' if the database file does not equal blank and it should be left open
    ElseIf bLeaveOpenAfterEdit = True And bGiveUserControl = True Then
                                                    ' provide control to the user
        AccObj.UserControl = True
        
        AccObj.Visible = True
                                                    '
    End If
                                                    '
ExitCodeBlock:
                                                    '
'   Clear Variables
                                                    '
    Set dbs = Nothing
                                                    '
    Set prp = Nothing
    
    If bLeaveOpenAfterEdit = False Then
                                                    '
        Set AccObj = Nothing
    
    End If
                                                    '
    Exit Function
                                                    '
'   Error Handling
                                                    '
ErrorHandling:
                                                    ' depending on the error experienced
    Select Case Err.Number
                                                    ' 3270 = property does not exist
        Case 3270
                                                    '
            Set prp = dbs.CreateProperty(sPropertyName, vPropertyType, vPropertyValue)
                                                    '
            dbs.Properties.Append prp
                                                    '
            Resume Next
                                                    ' in any other error
        Case Else
                                                    '
            ErrorHandler Err.Number, Err.Description, lModuleID, 0
                                                    '
            Resume ExitCodeBlock
                                                    '
    End Select
                                                    '
End Function

【讨论】:

以上是关于是否可以在 MS Access 中对设计视图进行密码保护?还是通过代码?的主要内容,如果未能解决你的问题,请参考以下文章

在 MS Access 2007 中对 ODBC 表导入 sql 查询

MS-Access 报告在执行时显示设计视图

MS Access 数据库 (2010) 如何从查询设计器创建临时表/过程/视图

专家 - 表单打开方式不同于设计视图与 MS Access 对象列表

MS Access:在设计指南视图中创建链接表不显示要链接的表?

是否可以在文本视图中对数据进行排序?