MS Access VBA 错误:运行时错误“70”权限被拒绝

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/45332357/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-12 12:58:47  来源:igfitidea点击:

MS Access VBA Error: Run time error '70' Permission Denied

vbams-accessms-office

提问by jason

I believe this issue is a result of a recent update to MS Office/Access or Windows 10. When I run this code:

我相信这个问题是最近更新到 MS Office/Access 或 Windows 10 的结果。当我运行此代码时:

Dim s As String
With CreateObject("Scriptlet.TypeLib")
    s = Left(.Guid, 9)
   newguidx = Right(s, 8)
End With

I get an error: Permission Denied on the With Statement. This is new only only cropped up after my admins updated our systems. I have no option to roll back updates. Anyone come across this and have a work around?

我收到一个错误:With 语句中的权限被拒绝。这是新的只有在我的管理员更新我们的系统后才会出现。我没有回滚更新的选项。任何人都遇到过这个问题并有解决办法吗?

OS: Windows 7 Enterprise Access Version: 2010

操作系统:Windows 7 Enterprise Access 版本:2010

Thanks

谢谢

回答by David Zemens

From Microsoft:

来自微软

This issue is by design, as of the July security updates. This control is blocked as a security measure to help prevent malicious code from running in Office applications. We are working on getting a knowledgebase article out with the recommended method. Until that KB is ready, I'll post the content here:

WorkaroundThe preferred method is to change the code to use Windows API CoCreateGuid (https://msdn.microsoft.com/en-us/library/windows/desktop/ms688568(v=vs.85).aspx) instead of CreateObject("Scriptlet.TypeLib").Guid

此问题是设计使然,截至 7 月安全更新。此控件被阻止作为一项安全措施,以帮助防止恶意代码在 Office 应用程序中运行。我们正在努力使用推荐的方法发布知识库文章。在 KB 准备好之前,我将在此处发布内容:

解决方法首选方法是更改​​代码以使用 Windows API CoCreateGuid ( https://msdn.microsoft.com/en-us/library/windows/desktop/ms688568(v=vs.85).aspx) 而不是CreateObject("Scriptlet.TypeLib").Guid

' No VT_GUID available so must declare type GUID
Private Type GUID_TYPE
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(7) As Byte
End Type
Private Declare PtrSafe Function CoCreateGuid Lib "ole32.dll" (Guid As GUID_TYPE) As LongPtr
Private Declare PtrSafe Function StringFromGUID2 Lib "ole32.dll" (Guid As GUID_TYPE, ByVal lpStrGuid As LongPtr, ByVal cbMax As Long) As LongPtr
Function CreateGuidString()
    Dim guid As GUID_TYPE
    Dim strGuid As String
    Dim retValue As LongPtr
    Const guidLength As Long = 39 'registry GUID format with null terminator {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

    retValue = CoCreateGuid(guid)
    If retValue = 0 Then
        strGuid = String$(guidLength, vbNullChar)
        retValue = StringFromGUID2(guid, StrPtr(strGuid), guidLength)
        If retValue = guidLength Then
            ' valid GUID as a string
            CreateGuidString = strGuid
        End If
    End if
End Function

Alternate Workaround

This will allow you to use CreateObject("Scriptlet.TypeLib")however it will lessen the security protection added by the Office July 2017 security update. You can set a registry key that will allow Scriptlet.TypeLibto instantiate inside of Office applications. When this registry key is set, Office will not block any use of this COM control.

  • Open Registry Editor.
  • Go to: Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Common\COM Compatibility{06290BD5-48AA-11D2-8432-006008C3FBFC}
    • Note: you may need to search the registry to find the correct location under HKEY_LOCAL_MACHINE based on your installed Office version.
  • Add ActivationFilterOverride
  • Set DWORD: 1

Detailed Instructions:

  1. Click Start, click Run, type regedit in the Open box, and then click OK. Locate and then click the following key in the registry: HKEY_LOCAL_MACHINE
  2. On the Edit menu, point to Find, and then enter the following in the Find What: text box: COM Compatibility
  3. Ensure Keys is selected, and Values and Data are deselected. Next select Match whole string only, click Find Next Locate and then click the following key: {06290BD5-48AA-11D2-8432-006008C3FBFC} Note: if the key is not present you will need to add it. On the Edit menu, point to New, and then click Key. Type in {06290BD5-48AA-11D2-8432-006008C3FBFC}
  4. On the Edit menu, point to New, and then click DWORD (32-bit) Value
  5. Type ActivationFilterOverride for the name of the DWORD, and then press Enter.
  6. Right-click ActivationFilterOverride, and then click Modify.
  7. In the Value data box, type 1 to enable the registry entry, and then click OK.
  8. Note to disable the ActivationFilterOverride setting, type 0 (zero), and then click OK.
  9. Exit Registry Editor, and then restart any open Office application.

替代解决方法

这将允许您使用,CreateObject("Scriptlet.TypeLib")但它会减少 Office 2017 年 7 月安全更新添加的安全保护。您可以设置允许Scriptlet.TypeLib在 Office 应用程序内部实例化的注册表项。设置此注册表项后,Office 将不会阻止使用此 COM 控件。

  • 打开注册表编辑器。
  • 转到:计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Common\COM 兼容性{06290BD5-48AA-11D2-8432-006008C3FBFC}
    • 注意:您可能需要根据您安装的 Office 版本搜索注册表以在 HKEY_LOCAL_MACHINE 下找到正确的位置。
  • 添加激活过滤器覆盖
  • 设置双字:1

详细说明:

  1. 单击开始,单击运行,在打开框中键入 regedit,然后单击确定。在注册表中找到并单击以下项:HKEY_LOCAL_MACHINE
  2. 在“编辑”菜单上,指向“查找”,然后在“查找内容:”文本框中输入以下内容:COM 兼容性
  3. 确保选中 Keys,并取消选中 Values 和 Data。接下来选择仅匹配整个字符串,单击查找下一个定位,然后单击以下键:{06290BD5-48AA-11D2-8432-006008C3FBFC} 注意:如果键不存在,则需要添加它。在编辑菜单上,指向新建,然后单击项。输入 {06290BD5-48AA-11D2-8432-006008C3FBFC}
  4. 在编辑菜单上,指向新建,然后单击 DWORD(32 位)值
  5. 为 DWORD 的名称键入 ActivationFilterOverride,然后按 Enter。
  6. 右键单击 ActivationFilterOverride,然后单击修改。
  7. 在数值数据框中,键入 1 以启用注册表项,然后单击确定。
  8. 注意要禁用 ActivationFilterOverride 设置,请键入 0(零),然后单击“确定”。
  9. 退出注册表编辑器,然后重新启动任何打开的 Office 应用程序。

回答by Erik A

In Access, we can suffice with this very short function to generate a GUID by leveraging Application.StringFromGUIDto cast bytes to a GUID. It generates pretty verbose GUIDs, though, with the format {guid {00000000-0000-0000-0000-000000000000}}.

在 Access 中,我们可以使用这个非常短的函数通过Application.StringFromGUID将字节转换为 GUID 来生成 GUID。但是,它会生成非常冗长的 GUID,格式为{guid {00000000-0000-0000-0000-000000000000}}.

Declare PtrSafe Sub CoCreateGuid Lib "ole32" (ByVal GUID As LongPtr)
Public Function NewGUID() As String
    Dim b(15) As Byte
    CoCreateGUID VarPtr(b(0))
    NewGUID = Application.StringFromGUID(b)
End Function

You can strip away unwanted characters, for example by replacing the last line of this function with NewGUID = Mid(Application.StringFromGUID(b), 8, 36). Then, the format will be 00000000-0000-0000-0000-000000000000

您可以删除不需要的字符,例如将此函数的最后一行替换为NewGUID = Mid(Application.StringFromGUID(b), 8, 36). 然后,格式将是00000000-0000-0000-0000-000000000000

回答by rchacko

Since windows update taken out "Scriptlet.TypeLib", try the following:-

由于 Windows 更新取出“Scriptlet.TypeLib”,请尝试以下操作:-

Declare Function CoCreateGuid Lib "ole32" (ByRef GUID As Byte) As Long
Public Function GenerateGUID() As String
    Dim ID(0 To 15) As Byte
    Dim N As Long
    Dim GUID As String
    Dim Res As Long
    Res = CoCreateGuid(ID(0))

    For N = 0 To 15
        GUID = GUID & IIf(ID(N) < 16, "0", "") & Hex$(ID(N))
        If Len(GUID) = 8 Or Len(GUID) = 13 Or Len(GUID) = 18 Or Len(GUID) = 23 Then
            GUID = GUID & "-"
        End If
    Next N
    GenerateGUID = GUID
End Function

Alternatively, if you are connecting to SQL Server 2008 or higher, try to use the SQL NEWID() function instead.

或者,如果您要连接到 SQL Server 2008 或更高版本,请尝试改用 SQL NEWID() 函数。