Com 尝试使用脚本时出现权限被拒绝错误。字典

Com 尝试使用脚本时出现权限被拒绝错误。字典,com,asp-classic,vb6,iis-7.5,windows-server-2008-r2,Com,Asp Classic,Vb6,Iis 7.5,Windows Server 2008 R2,我正在使用windows server 2008 R2 64位和IIS 7.5,托管一个经典的asp(32位)网站,并调用COM服务器上的COM组件(也有windows server 2008 R2 64位)。但获取错误“权限被拒绝”,错误代码为800A0046 Set oDictAOGroup = CreateObject("Scripting.Dictionary") oDictAOGroup.Add "1000", "5" oUser.fn_Update_AO_Groups(oDictAO

我正在使用windows server 2008 R2 64位和IIS 7.5,托管一个经典的asp(32位)网站,并调用COM服务器上的COM组件(也有windows server 2008 R2 64位)。但获取错误“权限被拒绝”,错误代码为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")
但当尝试传递sciting.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
公共功能fn\u更新组(vntAODict作为变体)
关于错误转到错误处理程序
Dim oADOConnect作为AMLCONNECT\u V2.clsConnect
作为ADODB.连接的Dim oADOConn
Dim oADOCmd作为ADODB.Command
Dim vntKey作为变型
如果不是objContext,那么什么都不是
设置oADOConnect=objContext.CreateInstance(“AMLCONNECT_V2.clsConnect”)
设置oADOCmd=objContext.CreateInstance(“ADODB.Command”)
其他的
设置oADOConnect=新CLSCONECT
Set oADOCmd=New ADODB.Command
如果结束
如果是IsObject(vntAODict),则
如果是oADOConnect.OpenADOConnection(oADOConn),则
用oADOCmd
.CommandText=“Sp_Upd_AOGroups”
.CommandType=adCmdStoredProc
.Parameters.Append.CreateParameter(“AO_ID”,adInteger,adParamInput)
.Parameters.Append.CreateParameter(“电子邮件组ID”,adInteger,adParamInput)
Set.ActiveConnection=oadocon
以
'为字典中的每个项执行存储过程
对于vntAODict.Keys中的每个vntKey
oADOCmd.Parameters(“AO_ID”).Value=vntKey
oADOCmd.Parameters(“Email\u Group\u ID”).Value=vntAODict(vntKey)
oADOCmd.Execute
下一个
如果结束
如果结束
TidyUp:
设置oADOConn=无
设置oADOCmd=Nothing
设置oADOConnect=Nothing
退出功能
错误处理程序:
作为AMLCONNECT_V2.clsConnect的Dim ErrHandler
如果不是objContext,那么什么都不是
设置ErrHandler=objContext.CreateInstance(“AMLCONNECT_V2.clsConnect”)
其他的
设置ErrHandler=New AMLCONNECT\u V2.clsConnect
如果结束
m_sErrorMessage=“错误号:”+CStr(Err.Number)+“
”+”说明:“+ErrHandler.LogError(Err.Number,Err.Description,“模块:AMLADMIN\u V2.clsUsers”,“函数:fn\u更新\u AO\u组”,errerrerrerrerrerrerror,errVB,errDatabase,”) 如果Not ErrHandler为Nothing,则设置ErrHandler=Nothing GoTo TidyUp: 端函数
有人能提出补救办法吗

函数接受字符串的代码

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\u Update\u AO\u Groups\u Test1(strKey作为字符串,strValue作为字符串)
关于错误转到错误处理程序
Dim oADOConnect作为AMLCONNECT\u V2.clsConnect
作为ADODB.连接的Dim oADOConn
Dim oADOCmd作为ADODB.Command
Dim vntKey作为变型
Dim ERRhandler测试为AMLCONNECT\u V2.clsConnect
如果不是objContext,那么什么都不是
设置oADOConnect=objContext.CreateInstance(“AMLCONNECT_V2.clsConnect”)
设置oADOCmd=objContext.CreateInstance(“ADODB.Command”)
其他的
设置oADOConnect=新CLSCONECT
Set oADOCmd=New ADODB.Command
如果结束
如果是oADOConnect.OpenADOConnection(oADOConn),则
用oADOCmd
.CommandText=“Sp_Upd_AOGroups”
.CommandType=adCmdStoredProc
.Parameters.Append.CreateParameter(“AO_ID”,adInteger,adParamInput)
.Parameters.Append.CreateParameter(“电子邮件组ID”,adInteger,adParamInput)
Set.ActiveConnection=oadocon
以
'为字典中的每个项执行存储过程
oADOCmd.参数(“AO_ID”).值=strKey
oADOCmd.Parameters(“Email\u Group\u ID”)。值=标准值
oADOCmd.Execute
如果结束
TidyUp:
设置oADOConn=无
设置oADOCmd=Nothing
设置oADOConnect=Nothing
退出功能
错误处理程序:
作为AMLCONNECT_V2.clsConnect的Dim ErrHandler
如果不是objContext,那么什么都不是
设置ErrHandler=objContext.CreateInstance(“AMLCONNECT_V2.clsConnect”)
其他的
设置ErrHandler=New AMLCONNECT\u V2.clsConnect
如果结束
m_sErrorMessage=“错误号:”+CStr(Err.Number)+“
”+”说明:“+ErrHandler.LogError(Err.Number,Err.Description,“模块:AMLADMIN\u V2.clsUsers”,“函数:fn\u更新\u AO\u组”,errerrerrerrerrerrerror,errVB,errDatabase,”) 如果Not ErrHandler为Nothing,则设置ErrHandler=Nothing GoTo TidyUp: 端函数
谢谢,
Vaibhav发表评论的时间太长,所以虽然这不是完整的答案,但它可能会让你走上正确的方向

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

oADOCmd.Parameters("AO_ID").Value = CLng(vntKey)
oADOCmd.Parameters("Email_Group_ID").Value = CLng(vntAODict(vntKey))
如果仍然是相同的错误,我需要知道当您显式地将两个参数传递给函数而不是字典时,完全相同的代码是否可以正常工作


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

或者使用
调用oUser.fn\u Update\u AO\u Groups(odictogroup)
oUser.fn\u更新不带括号的AO\u组oDictAOGroup

尝试以下签名:

Public Function fn_Update_AO_Groups(ByVal vntAODict As Variant) 

如果允许默认的
ByRef
占上风,则需要更多的编组代码。同时提供预期的explict类型也为编组代码提供了更多选项。这些更改可能足以允许您预期的操作

如果失败的话,我会重新考虑这个方法
Public Function fn_Update_AO_Groups(ByVal vntAODict As Scripting.Dictionary)