【问题标题】:Permission denied error when try use Scripting.Dictionary尝试使用 Scripting.Dictionary 时出现权限被拒绝错误
【发布时间】:2012-06-09 04:42:18
【问题描述】:

我正在使用 windows server 2008 R2 64 位和 IIS 7.5 并托管一个经典的 asp(32 位)网站并在 COM 服务器上调用 COM 组件(它也有 windows server 2008 R2 64 位)。但收到错误“Permission denied”,错误代码为 800A0046。

Set oDictAOGroup = CreateObject("Scripting.Dictionary")
oDictAOGroup.Add "1000", "5"
oUser.fn_Update_AO_Groups(oDictAOGroup)

asp 网站服务器使用DCOM 与COM 服务器通信。在 asp 网站服务器代理是由 COM 服务器类创建的。

我创建了一个测试函数并将值传递给该函数,然后代码就可以正常工作了。

oUser.fn_Update_AO_Groups_Test1("1000", "21")

但是当尝试传递 Scipting.Dictionary 对象时,会引发权限被拒绝错误。 我为此搜索了很多,但徒劳无功。

函数的代码是

Public Function fn_Update_AO_Groups(vntAODict As Variant)

On Error GoTo ErrorHandler

Dim oADOConnect As AMLCONNECT_V2.clsConnect
Dim oADOConn        As ADODB.Connection
Dim oADOCmd         As ADODB.Command
Dim vntKey          As Variant

    If Not objContext Is Nothing Then
        Set oADOConnect = objContext.CreateInstance("AMLCONNECT_V2.clsConnect")
        Set oADOCmd = objContext.CreateInstance("ADODB.Command")
    Else
        Set oADOConnect = New clsConnect
        Set oADOCmd = New ADODB.Command
    End If

    If IsObject(vntAODict) Then
        If oADOConnect.OpenADOConnection(oADOConn) Then
            With oADOCmd
                .CommandText = "Sp_Upd_AOGroups"
                .CommandType = adCmdStoredProc
                .Parameters.Append .CreateParameter("AO_ID", adInteger, adParamInput)
                .Parameters.Append .CreateParameter("Email_Group_ID", adInteger, adParamInput)
                Set .ActiveConnection = oADOConn
            End With
            'Execute stored procedure for each item in the dictionary
            For Each vntKey In vntAODict.Keys
                oADOCmd.Parameters("AO_ID").Value = vntKey
                oADOCmd.Parameters("Email_Group_ID").Value = vntAODict(vntKey)
                oADOCmd.Execute
            Next
        End If
    End If

TidyUp:

    Set oADOConn = Nothing
    Set oADOCmd = Nothing
    Set oADOConnect = Nothing

Exit Function

ErrorHandler:
    Dim ErrHandler As AMLCONNECT_V2.clsConnect

    If Not objContext Is Nothing Then
        Set ErrHandler = objContext.CreateInstance("AMLCONNECT_V2.clsConnect")
    Else
        Set ErrHandler = New AMLCONNECT_V2.clsConnect
    End If

    m_sErrorMessage = "Error Number: " + CStr(Err.Number) + "<BR>" + "Description: " + ErrHandler.LogError(Err.Number, Err.Description, "MODULE: AMLADMIN_V2.clsUsers", "FUNCTION:fn_Update_AO_Groups", errError, errVB, errDatabase, "")

    If Not ErrHandler Is Nothing Then Set ErrHandler = Nothing

    GoTo TidyUp:

End Function

任何人都可以为此提出补救措施吗?

函数接受字符串的代码

Public Function fn_Update_AO_Groups_Test1(strKey As String, strValue As String)

On Error GoTo ErrorHandler

Dim oADOConnect As AMLCONNECT_V2.clsConnect
Dim oADOConn        As ADODB.Connection
Dim oADOCmd         As ADODB.Command
Dim vntKey          As Variant

Dim ErrHandlerTest As AMLCONNECT_V2.clsConnect

    If Not objContext Is Nothing Then
        Set oADOConnect = objContext.CreateInstance("AMLCONNECT_V2.clsConnect")
        Set oADOCmd = objContext.CreateInstance("ADODB.Command")

    Else
        Set oADOConnect = New clsConnect
        Set oADOCmd = New ADODB.Command

    End If

            If oADOConnect.OpenADOConnection(oADOConn) Then
                With oADOCmd
                    .CommandText = "Sp_Upd_AOGroups"
                    .CommandType = adCmdStoredProc
                    .Parameters.Append .CreateParameter("AO_ID", adInteger, adParamInput)
                    .Parameters.Append .CreateParameter("Email_Group_ID", adInteger, adParamInput)
                    Set .ActiveConnection = oADOConn
                End With
                'Execute stored procedure for each item in the dictionary
                    oADOCmd.Parameters("AO_ID").Value = strKey
                    oADOCmd.Parameters("Email_Group_ID").Value = strValue
                    oADOCmd.Execute
            End If
TidyUp:

    Set oADOConn = Nothing
    Set oADOCmd = Nothing
    Set oADOConnect = Nothing

Exit Function

ErrorHandler:
    Dim ErrHandler As AMLCONNECT_V2.clsConnect

    If Not objContext Is Nothing Then
        Set ErrHandler = objContext.CreateInstance("AMLCONNECT_V2.clsConnect")
    Else
        Set ErrHandler = New AMLCONNECT_V2.clsConnect
    End If

    m_sErrorMessage = "Error Number: " + CStr(Err.Number) + "<BR>" + "Description: " + ErrHandler.LogError(Err.Number, Err.Description, "MODULE: AMLADMIN_V2.clsUsers", "FUNCTION:fn_Update_AO_Groups", errError, errVB, errDatabase, "")

    If Not ErrHandler Is Nothing Then Set ErrHandler = Nothing

    GoTo TidyUp:

End Function

谢谢, 毗婆尸

【问题讨论】:

  • 你知道函数fn_Update_AO_Groups的签名/声明吗?看起来像类型转换问题。
  • 函数签名为Public Function fn_Update_AO_Groups(vntAODict As Variant)
  • 变体应该没问题。能发一下函数的代码吗?也许只是使用 vntAODict 变量的相关行? (通过编辑将其添加到您的问题中)
  • 这里是整个函数
  • 请不要在评论中添加,点击问题下方的“编辑”链接并添加到那里。

标签: com asp-classic vb6 iis-7.5 windows-server-2008-r2


【解决方案1】:

评论太长了,所以虽然这不是完整的答案,但它可能会让你找到正确的方向。

首先,我注意到字段类型是整数,而您的字典键和值是字符串。所以首先尝试通过将函数中的代码更改为:

oADOCmd.Parameters("AO_ID").Value = CLng(vntKey)
oADOCmd.Parameters("Email_Group_ID").Value = CLng(vntAODict(vntKey))

如果仍然出现同样的错误,我需要知道当您将两个参数显式传递给函数而不是字典时,完全相同的代码是否可以正常工作?

想到的另一件事是您的错误处理可能有问题,尝试将其删除以进行调试,看看是否会收到更有意义的错误消息。

【讨论】:

  • 我尝试了 CLng 选项,但得到了同样的错误。我也添加了函数代码。已删除所有错误处理代码并调用代码,然后我也收到相同的错误权限被拒绝。
  • 很奇怪。尝试查看vntAODict 的类型并将其记录在某处,使用TypeName(vntAODict) 查看类型。你看到了什么?
  • TypeName(vntAODict) 返回字典
  • 那真的很奇怪。您能否在每行代码之后添加一些日志消息,看看它没有到达哪一行,这意味着哪一行导致了实际错误?
  • 尝试输出TypeName(vntAODict.Keys)的值 - 你得到了什么?
【解决方案2】:

使用不带括号的Call oUser.fn_Update_AO_Groups(oDictAOGroup)oUser.fn_Update_AO_Groups oDictAOGroup

【讨论】:

  • 尝试了您提到的两种替代方法,但仍然出现相同的错误
【解决方案3】:

试试这些签名:

Public Function fn_Update_AO_Groups(ByVal vntAODict As Variant) 

Public Function fn_Update_AO_Groups(ByVal vntAODict As Scripting.Dictionary)

如果您允许默认的ByRef 占上风,您需要更多的编组代码。还提供预期的显式类型也为编组代码提供了更多选项。这些更改可能足以实现您所期望的操作。

如果失败,我会重新考虑该方法,我更愿意将 XML 字符串传递到 SP。这提供了最大的灵活性,允许对 SQL 和 ASP 进行代码更改以实现新要求,而无需重新编译和部署新的二进制文件。

【讨论】:

  • 在尝试上述解决方案时,需要添加 Microsoft Scripting Runtime 的 scripting.dictionary 参考。此参考使用位于 system32 文件夹中的 scrrun.dll,我认为尝试访问 scrrun.dll 时代码可能会失败。因此需要在 scrrun.dll 上添加相应的权限
猜你喜欢
  • 1970-01-01
  • 2018-11-19
  • 2019-01-30
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多