【问题标题】:Server.CreateObject( ) failure with 32 bit Windows and IIS 732 位 Windows 和 IIS 7 的 Server.CreateObject() 失败
【发布时间】:2012-12-11 14:55:25
【问题描述】:

Windows 7 32 位,IIS 7.5.760016385

我在 Visual Basic 6.0 中创建了一个 DLL,并尝试在经典 ASP 代码中使用它:

set obj = Server.CreateObject("a.b")

我收到以下错误:

006 ASP 0178
Server.CreateObject 访问错误
检查权限时调用 Server.CreateObject 失败。拒绝访问此对象。
err.number = -2147024891

我已尝试创建 iusr_cmpname 用户并在此 ASP 页面的默认网站和虚拟目录中为其授予权限。我已经对 dll 进行了 REGSVR32。

我已转到“打开和关闭 Windows 功能”并选择了 IIS/万维网服务/应用程序开发功能,然后检查了 ASP、ASP.net、ISAPI 扩展和 ISAPI 文件管理器。

我在不同的新闻组中跟踪了许多线索,但我可以解决这个问题。 去年,一年零 1/2 年前,我们尝试过这个,并且遇到了同样的问题。由于我们无法克服这个问题,我们又回到了 Windows NT。我们在 NT 上从来没有遇到过这个问题。

现在我们再次尝试克服这个问题,以便我们可以再次迁移到 Windows 7。似乎很多人都有这个问题,但他们找到并发布的任何解决方案似乎都不是我需要的。

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 您从 IIS 收到的错误消息是什么?
  • Err.description 为“006~ASP 0178~Server.CreateObject 访问错误~在检查权限时调用 Server.CreateObject 失败。访问被拒绝。” err.number = -2147024891
  • 您是否尝试过让 apppool 用户/iusr 成为本地管理员?只是为了测试...或使用另一个 Windows 用户作为 appool 和 Web 应用程序等待...您是否尝试添加 Web 应用程序而不是虚拟目录?
  • 感谢您的建议。授予 iusr_xxx 和“网络服务”的管理员权限并没有帮助。我不知道如何为应用程序池设置另一个用户,我在 IIS 管理员的应用程序池中看不到安全选项卡。我已经尝试过,正如您建议的将虚拟目录更改为应用程序,但页面根本没有打开;它只是挂起。所以我把它改回了一个虚拟目录。感谢您的想法。
  • 在 IIS7 中 iusr 是不可见的,但您仍然可以添加权限。在您选择用户或组的请求者中,只需键入:IIS APPPOOL\{应用程序池名称},然后单击“检查名称”。不能解决您的问题,但它可能会让您更接近解决方案...

标签: windows-7 com asp-classic createobject


【解决方案1】:

我强烈建议使用Procmon 来查找访问冲突。几年前我有一个类似的问题,这是唯一解决它的方法。在那种情况下,原来是缺少系统临时文件夹的权限。

如果您发布 Procmon 的结果,我可能会修改此答案以提供更多帮助。

【讨论】:

  • 嗨大卫,我添加了进程监视器。当我尝试运行这个 ASP 页面 PRL.asp 时,它说进程名称是 w3wp.exe ...操作是 QueryAllInformationFile ...路径:d:\xxx\PRL.asp ...结果:溢出缓冲区 .. . ...下一行说:进程名称是w3wp.exe ...操作是QueryOpen ...路径:d:\ xxx \ prl.asp \ web.config ...结果:找不到路径。 - - - - - - - 谢谢你。有什么想法吗?
  • 听起来你只是没有 web.config 文件——还有其他错误吗?
  • 这是一个旧的 ASP 应用程序,我们有一个 GLOBAL.asa 并且不需要 web.config。其他错误:RegQueryValue 和 RegQueryKey 说 Name Not found。有些条目说缓冲区太小或缓冲区溢出。
  • web.config 是一个 IIS 的东西,也是一个 .NET 的东西,所以 IIS 仍然会寻找它。
  • 这很奇怪。我会检查两件事。 (1) 在 procmon 中,您应该看到请求的访问权限与 RegOpenKey 在同一行。看看它是否要求不寻常的权利。 (2) 如果没有,请检查您的安全设置。应用程序是否使用模拟级别安全性?如果是这样,那么应用程序的用户也需要访问该密钥。您可以为“所有人”添加必要的权限。请注意,您可能需要更改 TypeLib 和 Interface 下的其他键。 (可能需要与 procmon 进行多次会话才能找到所有内容。)
【解决方案2】:

问题似乎与 IIS 无法访问文件系统上的自定义 VB6 Active X dll 有关。 我在与默认 Web 应用程序相同的目录中注册了一个我创建的自定义 dll,并且能够让 ASP 创建对象。

这就是我所做的:

  • 干净安装 Windows 7 Professional 64 位 SP1。

  • 启用 Windows ASP 功能

  • 此步骤仅适用于 64 位 Windows - 使用 IIS 管理器,为默认应用程序池启用 32 位应用程序。

  • 创建一个简单的 VB6 Active X dll(类名为“CXUtils.Utils”),将两个输入数字相加并返回结果。

Utils.cls:

Public Function Sum(ByVal a As Integer, ByVal b As Integer) As Integer     
    Sum = a + b
End Function
  • 这是重要的一步 - 在管理命令提示符下,在默认 Web 应用程序位置注册 Vb6 Active X dll: C:\inetpub\wwwroot

  • 创建并安装一个简单的 asp 页面,从上面实例化 dll。安装位置是默认的 Web 应用程序位置 C:\inetpub\wwwroot

默认.asp:

<%@ Language=VBScript %>
<%
Option Explicit
Response.Expires = 0
Response.Expiresabsolute = Now() - 1 
Response.AddHeader "pragma","no-cache" 
Response.AddHeader "cache-control","private" 
Response.CacheControl = "no-cache" 

Function Sum(a, b)
    Sum = a + b
End Function

Function Sum2(a, b)
    Dim adder
    set adder = Server.CreateObject("CXUtils.Utils")
    Sum2 = adder.Sum(a, b)
    set adder = nothing
End Function
%>
<html>
    <head>
        <title>Add</title>
    </head>
    <body>
    <b>2 + 3</b> = <%= Sum(2,3) %><br />
    <b>3 + 4</b> = <%= Sum2(3,4) %>
    </body>
</html>
  • 浏览到网络应用并查看结果

如果这不能全部编译,我深表歉意 - 需要进行大量编辑才能使格式正确显示。

【讨论】:

  • 感谢 Chue,在我的旧 XP 机器上,即使没有在组件管理器或 REGSVR32 中注册 COM 对象,它也能正常工作。但在新的 Windows 7 机器上,它在 createObject 行上失败。我将尝试以一种或两种方式注册它。也许这么简单的事情会导致更好地理解这个问题。
  • 嘿 Chue,我只是在 regsvr32 上注册了它并且它工作。我将尝试取消注册,然后使用组件管理器。然后两个。谢谢你的帮助。我将尝试增加这个简单 COM 对象的复杂性,直到它像一个总是失败的对象。那应该让我更好地理解。谢谢你的帮助。 --- 道格
【解决方案3】:

此页面表明问题可能是分配给 VB 运行时的访问权限。尝试为每个人分配 Msvbvm60.dll 的读取和执行权限。

http://support.microsoft.com/kb/278013

【讨论】:

  • 谢谢彼得,我之前试过了。我为“所有人”、“iusr_comp_name”、“网络服务”添加了运行和执行权限
【解决方案4】:

我想我遇到了类似的问题。我试图从经典的 ASP 应用程序在 VB6 IDE 中运行的 VB6 DLL 中交互式调试代码。当应用程序执行 Server.CreateObject 语句时,它返回以下错误:

服务器对象:006~ASP 0178~Server.CreateObject 访问错误~在检查权限时调用 Server.CreateObject 失败。拒绝访问此对象。

顺便说一句,我在 Windows 7 环境中运行 IIS 7.5。我终于找到了一篇 Microsoft 文章,说问题是由于 DCOM 中缺少 VB ASP 调试的注册表项和/或 DCOM 权限不足,而不是 IIS。文章的 URL 是http://support.microsoft.com/kb/q259725。我实施了围绕 #1 的工作。一次重新启动后,我可以从 ASP 进入 VB DLL 代码。为微软加油,我不常这么说:-)

【讨论】:

    【解决方案5】:

    另一种可行的方法是将 DLL 作为 DCOM 应用程序安装在 dcomcnfg 上。它将在不同的凭据下运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-19
      • 2013-02-22
      • 2015-12-12
      • 2014-07-09
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多