Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何删除MS Access VB项目上的密码?_Vba_Ms Access - Fatal编程技术网

Vba 如何删除MS Access VB项目上的密码?

Vba 如何删除MS Access VB项目上的密码?,vba,ms-access,Vba,Ms Access,我有一个MS Access数据库,其中包含一个受密码保护的VB项目。密码未知。Access数据库本身没有密码,因此我可以打开它:我无法在VBE中展开VB项目树 如果这是卓越的,那将是一件简单的事情。有关绕过Excel VB项目密码的优秀指南,请参见堆栈溢出: 虽然上面提到的答案中的代码似乎不是特定于应用程序的,但我无法让它与Access一起工作。我相信这是因为在Excel中,同一个应用程序对象可以包含多个工作簿,因此即使一个工作簿的VB项目受密码保护,您也可以从不同工作簿中的模块运行此代码,并且

我有一个MS Access数据库,其中包含一个受密码保护的VB项目。密码未知。Access数据库本身没有密码,因此我可以打开它:我无法在VBE中展开VB项目树

如果这是卓越的,那将是一件简单的事情。有关绕过Excel VB项目密码的优秀指南,请参见堆栈溢出:

虽然上面提到的答案中的代码似乎不是特定于应用程序的,但我无法让它与Access一起工作。我相信这是因为在Excel中,同一个应用程序对象可以包含多个工作簿,因此即使一个工作簿的VB项目受密码保护,您也可以从不同工作簿中的模块运行此代码,并且删除保护将应用于应用程序中的所有工作簿

但是,在Access中,应用程序对象一次只保存一个当前数据库。我无法在同一个应用程序中打开多个数据库。我尝试的是在一个新的应用程序中创建一个新的Access VB项目:根据Excel答案插入密码删除模块;然后,在运行取消保护脚本之前,从该VB项目中执行一个创建新Access应用程序的sub,并将受保护的数据库加载到其中。然而,这并没有起作用。脚本似乎不能跨应用程序的不同实例工作——即使它们在运行时都被识别

在我的工作环境中,我无法安装新软件,也无法访问十六进制编辑器。因此,有没有办法破解MS Access VB项目密码

澄清 关于提供代码示例,我是Stack Exchange的长期用户,非常熟悉新用户在没有实际显示其代码的情况下提出“您能帮助我吗?”之类的问题:但是问题并不总是要求包含代码

如果有帮助,我一直在尝试的是:

Sub DoVBA()
    Dim app As Application
    Dim filepath As String
    'filepath = Application.CurrentProject.Path & "\CCD-QAF_v0.6.mdb"
    filepath = Application.CurrentProject.Path & "\CCD-QAF_v0.6_OC2016.accdb"
    '
    Set app = New Application
    app.Visible = True
    app.OpenCurrentDatabase filepath
    unprotected ' Calls sub which works in Excel
End Sub

Sub unprotected()
    If Hook Then
        MsgBox "VBA Project is unprotected!", vbInformation, "*****"
    End If
End Sub
。。然后在另一个模块中:

Option Explicit

Private Const PAGE_EXECUTE_READWRITE = &H40

Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
        (Destination As Long, Source As Long, ByVal Length As Long)

Private Declare Function VirtualProtect Lib "kernel32" (lpAddress As Long, _
        ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long

Private Declare Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As Long

Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, _
        ByVal lpProcName As String) As Long

Private Declare Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As Long, _
        ByVal pTemplateName As Long, ByVal hWndParent As Long, _
        ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer

Dim HookBytes(0 To 5) As Byte
Dim OriginBytes(0 To 5) As Byte
Dim pFunc As Long
Dim Flag As Boolean

Private Function GetPtr(ByVal Value As Long) As Long
    GetPtr = Value
End Function

Public Sub RecoverBytes()
    If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6
End Sub

Public Function Hook() As Boolean
    Dim TmpBytes(0 To 5) As Byte
    Dim p As Long
    Dim OriginProtect As Long

    Hook = False

    pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")


    If VirtualProtect(ByVal pFunc, 6, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then

        MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6
        If TmpBytes(0) <> &H68 Then

            MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6

            p = GetPtr(AddressOf MyDialogBoxParam)

            HookBytes(0) = &H68
            MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4
            HookBytes(5) = &HC3

            MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6
            Flag = True
            Hook = True
        End If
    End If
End Function

Private Function MyDialogBoxParam(ByVal hInstance As Long, _
        ByVal pTemplateName As Long, ByVal hWndParent As Long, _
        ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer
    If pTemplateName = 4070 Then
        MyDialogBoxParam = 1
    Else
        RecoverBytes
        MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _
                           hWndParent, lpDialogFunc, dwInitParam)
        Hook
    End If
End Function
选项显式
Private Const PAGE_EXECUTE_READWRITE=&H40
私有声明子移动内存库“kernel32”别名“rtlmovemory”_
(目标长度为,源长度为,ByVal长度为)
私有声明函数VirtualProtect Lib“kernel32”(lpAddress尽可能长_
ByVal dwSize尽可能长,ByVal flNewProtect尽可能长,LPFLOLPROTECT尽可能长
私有声明函数GetModuleHandleA Lib“kernel32”(ByVal lpModuleName作为字符串)的长度为
私有声明函数GetProcAddress Lib“kernel32”(ByVal hModule,只要_
ByVal lpProcName(作为字符串)长度相同
专用声明函数DialogBoxParam Lib“user32”别名“DialogBoxParamA”(ByVal hInstance,长度为_
ByVal pTemplateName为长,ByVal hWndParent为长_
ByVal lpDialogFunc为长,ByVal dwInitParam为长)为整数
Dim HOOK字节(0到5)作为字节
Dim OriginBytes(0到5)作为字节
变暗pFunc为长
将标志变暗为布尔值
私有函数GetPtr(ByVal值为Long)为Long
GetPtr=值
端函数
公共子字节()
If标志然后移动内存ByVal pFunc,ByVal VarPtr(OriginBytes(0)),6
端接头
作为布尔值的公共函数Hook()
将TmpBytes(0到5)调整为字节
变暗p为长
朦胧的原汁原味
Hook=False
pFunc=GetProcAddress(GetModuleHandleA(“user32.dll”),“DialogBoxParamA”)
如果VirtualProtect(ByVal pFunc,6,PAGE_EXECUTE_READWRITE,OriginProtect)为0,则
移动内存ByVal VarPtr(TmpBytes(0)),ByVal pFunc,6
如果TmpBytes(0)和H68,则
移动内存ByVal VarPtr(OriginBytes(0)),ByVal pFunc,6
p=GetPtr(MyDialogBoxParam的地址)
HookBytes(0)=&H68
移动内存ByVal VarPtr(HookBytes(1)),ByVal VarPtr(p),4
HookBytes(5)=&HC3
移动内存ByVal pFunc,ByVal VarPtr(HookBytes(0)),6
Flag=True
Hook=True
如果结束
如果结束
端函数
私有函数MyDialogBoxParam(ByVal)长度_
ByVal pTemplateName为长,ByVal hWndParent为长_
ByVal lpDialogFunc为长,ByVal dwInitParam为长)为整数
如果pTemplateName=4070,则
MyDialogBoxParam=1
其他的
恢复字节
MyDialogBoxParam=DialogBoxParam(hInstance,pTemplateName_
hWndParent、lpDialogFunc、dwInitParam)
钩子
如果结束
端函数

上述内容是从链接问题中的Excel示例复制而来的,该示例在Excel中运行良好,但在Access中不起任何作用。这可能是因为在Excel中,您可以在一个工作簿中运行此代码,该工作簿作用于同一Excel应用程序中运行的所有其他工作簿。但是Access只允许每个应用程序有一个数据库。

2个关闭投票?请解释原因。这个问题和被链接的评价极高的Excel问题一样热门。我不是在征求软件建议:这是关于VBA的。该网站(experts exchange-ugh)说,要删除VBA密码,只需打开VBA编辑器并单击“工具-属性-保护”,然后从“查看项目属性的密码”中删除VBA密码框。@braX-请看编辑后的问题。我能找到的关于这个主题的每一个合理链接都表明使用十六进制编辑器是正确的选择。有可移植的十六进制编辑器,您可以在您的机器上运行,而无需安装。使用十六进制编辑器解锁的说明祝您好运!知道了。我理解。我在高安全性的环境中工作过,这些环境非常严格,工作几乎无法完成。我想在这种情况下你是索尔。我唯一能想到的另一个选择是在VBA中滚动您自己的二进制到十六进制类型编辑器,以进入该对象并翻转这些值。就我个人而言,我只是想减少损失,并将访问文件发送到回收站。