【问题标题】:How can I debug a VB6 IIS Application on Windows 7 64-bit如何在 Windows 7 64 位上调试 VB6 IIS 应用程序
【发布时间】:2012-01-04 15:02:18
【问题描述】:

我需要能够在 Windows 7 64 位上调试 Visual Basic 6 IIS 应用程序。不仅针对单个问题,而且针对持续发展。

尝试调试会导致来自 WebClass 运行时的错误“发生未指定的错误”。

如果我不调试并简单地访问已编译的 webclass 页面加载就好了。因此,我不认为应用程序的注册/配置有任何问题,而是与 Windows 操作系统安全性阻止 VB6 IDE 连接到 IIS 并允许它进行调试有关。

以下是我尝试过的所有方法:

  1. 禁用用户帐户控制 (UAC) 并重新启动。
  2. 修改了机器调试管理器 (MDM) 的 DCOM 组件安全性,并分配了“所有人”启动和激活权限。
  3. 为“70F214BA-94E2-4bdf-8F30-32CB4A905E4D”手动添加了 DCOM 条目,这是 VB6 IDE,并分配了“所有人”启动和激活权限。
  4. 已禁用 Windows 防火墙
  5. 在 Windows XP SP3 的兼容模式下以管理员身份运行选项运行应用程序 (VB6.exe)。
  6. 创建了一个新的 IIS 应用程序池,其身份设置为管理员帐户。将应用管道模式设置为经典并启用 32 位旧版应用支持。

这耗尽了我丰富的尝试经验。如果我创建一个 VB6 Windows 应用程序或 ActiveX 控件,我可以轻松启动和调试。

我在 Windows Server 2003 上遇到过非常类似的问题,尽管全新安装的 W2K3 解决了这个问题。

在 Windows 系统事件查看器日志中,事件 ID 10004 有 2 个重复条目,如下所示:

DCOM 收到错误“1326”并且无法登录 DOMAIN\User 以运行服务器: {70F214BA-94E2-4BDF-8F30-32CB4A905E4D}

其中 DOMAIN\User 是我的域帐户,上面提到的 GUID 是我为 VB ASP 调试添加的 DCOM 条目。

我必须提供的唯一额外信息是,Windows 7 64 位正在 VM 中运行,尽管我在尝试调试时被远程连接到控制台。我在没有控制台连接的虚拟机上调试时遇到了问题。

如果有人可以提供任何进一步的尝试建议,我将不胜感激。

如果有人能解决这个问题并成功地在 Windows 7 操作系统上调试描述必要设置的 IIS Web 应用程序,我将提供当前 300 分的奖励!

【问题讨论】:

  • 嗨沃伦,我看到你又在这件事上悬赏了。我注意到一件事——你没有提到你正在使用的 VS6 的 SP。我知道这太简单了,但是你运行的是 SP6 吗?
  • Warren:另一条信息:我可以运行 -> 在没有 W3SVC 或 IISAdmin 服务的情况下启动。这意味着问题与 VB6 有关,而不是操作系统阻止与 IIS 通信。
  • 您是否尝试过使用 IIS Express 运行您的应用程序?这样您就可以在自己的用户上下文中运行 IIS(与 VB6 IDE/调试器运行的上下文相同)?
  • 最后的努力:如果您的应用程序事件日志已满,并且设置为不覆盖事件,您似乎会收到未指定的错误。尝试清除它,看看是否有什么不同。
  • 是的,事件日志中有相关错误。我已经更新了原始问题。但是,在我的第一次故障排除尝试中,我添加了 DCOM 条目以尝试解决启动 VB 调试器时出现的安全问题。这些信息可能还有帮助吗?

标签: windows-7 vb6 ide iis-7.5 iis-metabase


【解决方案1】:

我最近在我的 Windows 7 64 位机器上遇到了同样的问题。对我有用的解决方案是检查特定 DCOM 错误的 Windows 事件日志(系统)。这是我遇到的错误:

机器默认权限设置不授予具有 CLSID 的 COM 服务器应用程序的本地激活权限 {17C2D338-9569-4022-8AF2-52A3A124F22D} 和APPID {17C2D338-9569-4022-8AF2-52A3A124F22D} 从地址 LocalHost(使用 LRPC)到用户 NT AUTHORITY\IUSR SID (S-1-5-17)。可以使用组件服务管理工具修改此安全权限。

对我来说,关键是要授予 IUSR 内置帐户启动和激活权限。在尝试授予此用户对各个 DCOM 组件的权限但失败后,我决定将用户添加到机器的默认 DCOM 权限中。你可以这样做:

运行 dcomcnfg。右键单击控制台根目录/组件服务/计算机/我的电脑节点。选择属性。选择“COM 安全”选项卡。单击“访问权限”组下的“编辑默认值”。点击“添加”。输入您的事件日志中指定的用户(我的是 IUSR)。单击确定。对“启动和激活权限”组重复此操作。在所有对话框上选择确定。

我无需重新启动机器即可使这些设置生效。我使用与在 XP 上使用的相同方法来调试 VB6 dll,即在 VB6 下运行 dll(无人值守执行),设置断点,导航到访问 dll 的页面,然后等待断点被命中。希望这会有所帮助。

【讨论】:

  • 非常感谢您的建议。事实上,我确实在 Windows 系统事件日志中看到如下错误:DCOM 出现错误“1326”并且无法登录 DOMAIN\USERID 以运行服务器:{70F214BA-94E2-4BDF-8F30-32CB4A905E4D}。我在域中,错误消息包含真实域\用户名。但是,我已经到了将“所有人”添加到 DCOM 权限的地步,尝试调试时仍然在 IDE 中收到相同的错误,并且在事件日志中一遍又一遍地收到相同的错误。我搜索了注册表,列出的 GUID 实际上是 VB6。
  • 这个解决方案,对我有什么帮助。我不得不重新启动我的机器,在更改之后,它没有工作,但重新启动后,一切都开始像魅力一样工作。谢谢分享!
  • 我在故障排除过程中重启了我的机器几次,但没有任何运气。如果您能证明您确实成功地在 Windows 7 操作系统上调试了描述必要设置的 IIS Web 应用程序,我将提供我所有的声誉积分。此优惠适用于任何有相同条件的人。
  • @yuben 你确定你调试的是IIS Application,而不是ASP应用程序中使用的VB6组件吗? IIS Application 是一种特殊类型的 VB6 项目。
  • 谢谢你的回答,玉本。 2 个重要修改:1)我的错误消息是指 IWAM_machine 用户而不是 IUSR,所以我还必须授予该用户文件和 DCOM 启动权限。 2) 错误组件“机器调试管理器”被设置为使用自定义 DCOM 权限,因此单独修改默认值不会有帮助。我确实做了这些,但也将两个 I* 用户添加到该对象的特定权限。重新启动后,它可以工作! HTH 某人。
【解决方案2】:

不知道这是否对您有进一步帮助..我正在研究我自己使用的相同问题。

在甚至查看器中,我看到: 机器默认权限设置不授予 COM 服务器应用程序的本地激活权限

CLSID 
{08855658-7A0B-4EF9-99B2-0AF875B3E62A}

APPID 
{08855658-7A0B-4EF9-99B2-0AF875B3E62A}

从地址 LocalHost(使用 LRPC)到用户 NT AUTHORITY\IUSR SID (S-1-5-17)。可以使用组件服务管理工具修改此安全权限。

..所以我尝试将本地激活授予“每个人” - 只是想看看我是否可以让它消失。 -我不能。

然后我在组件服务/我的电脑(属性)COM 安全、启动和激活权限中默认授予本地激活

我仍然无法调试,但在事件查看器中不再出现错误。在浏览器中我得到

Server object error 'ASP 0178 : 80070005'

Server.CreateObject Access Error

/app.asp, line 4

检查权限时调用Server.CreateObject 失败。拒绝访问此对象。

上面的 CLSID 是我的 vb6 应用程序,但注册表指向 vb6debug.dll(看起来正确)。 progID 匹配等。

授予每个人对 vb6debug.dll 和其他文件的权限。

下一步是 procmon 或类似的东西,看看会发生什么。

【讨论】:

  • 感谢您提供的信息。但是,我已经为所有内容打开了“Evyerone”的 COM 安全设置。但是,我没有在事件查看器中记录任何表明安全问题的事件。我所看到的只是来自 VB IDE 的“拒绝访问”消息。我也尝试过 procmon,但没有任何问题。
  • 好吧,赏金已过期,我没有收到解决我问题的答案。但是,根据收到的 cmets,我不得不说您提供了最深入的尝试来确定潜在的安全问题。因此,我授予你赏金。但是,如果您最终自己解决问题并更新答案,请告诉我。谢谢!
  • @BoAndersen 你确定你调试的是IIS Application,而不是ASP应用程序中使用的VB6组件吗? IIS Application 是一种特殊类型的 VB6 项目。
【解决方案3】:

我相信在比 Windows XP 更新的任何 Windows 版本的 IDE 中调试 VB6 IIS Application 是不可能的(可能,Windows 的服务器风格的情况类似)。问题的根本原因似乎是 IIS 6 和 IIS 7+ 之间的主要差异。当然,目前还没有关于这个主题的官方文档,因此我将在下面详细介绍。

首先,回顾一下这个问题是有意义的。许多好人似乎忘记了IIS Application 在这种情况下是指特殊类型的VB6 项目的确切术语。我能够在 Win7 Ultimate x64 SP1、Win7 Ultimate x86 SP1 和 Vista Enterprise x86 SP2 上按照以下步骤重现错误:

  1. 安装 VB6 和 SP6。
  2. 新建IIS Application项目:
  3. 保存项目。
  4. 选择运行 -> 开始 (F5) 以调试项目。
  5. 在“调试”选项卡上选择任何选项,然后按“确定”:

VB6 IDE 中立即出现错误消息:

让我们看看在 Windows XP 上执行相同的场景时会发生什么。一开始调试VB6时IIS Application

  • VB6 IDE 启动 IIS 服务,如果它没有运行:

  • VB6 IDE 提示选择 IIS 虚拟目录:

这一切都发生在 Windows XP 上之前WebClass 被激活。在 Windows 7 上,进程未达到此阶段。

很明显,VB6 IDE 尝试在 IIS 中执行一些管理任务,以便能够调试WebClass。在Process MonitorAPI Monitor 的帮助下,可以更深入地研究。很明显,VB6.exe 依赖于 IIS Admin Service 的 COM 接口。坏消息是 IIS 7+ 与以前的版本不同,它不使用 Metabase,并且 IIS 7+ 中没有 IIS Admin Service。可以安装IIS Metabase and IIS6 compatibility 组件,理论上该组件应该使使用 Metabase 的应用程序能够继续使用 IIS 7+:

很遗憾,安装它并不能解决问题。

建议您的问题可能是由于 COM 组件的启动和激活权限不足造成的。恐怕所有这些建议都是徒劳的。此类错误总是伴随着系统事件日志中的相关错误事件。在这种情况下没有此类事件。

【讨论】:

  • 你应该因为答案而获得赏金,但我不确定赏金去了哪里?
【解决方案4】:

您是否考虑过编写日志文件?这非常简单,您可以从代码最有可能导致错误的地方开始。我建议创建一个带有一些参数的函数,例如 Sub/Function 名称、Err 对象和可选的额外字符串,以便您可以包含其他信息,例如您的代码所在的步骤。在您的错误处理程序中调用您的函数传递你的参数。

【讨论】:

  • 应用程序甚至会启动,因此无法写入日志文件。按 F5 开始调试后立即出现错误。无论代码如何,任何 IIS 应用程序都会出现此问题。
  • @WarrenRox 我建议在您的应用程序运行时使用日志记录,而不是在您尝试调试时使用。如果您需要这样做是因为您正在开发应用程序,请设置一个变量来打开和关闭日志记录,然后在开发时将变量值和函数结果正确写入您的日志,然后将其关闭以进行生产。如果这不适合你,那就把它当作一个疯狂的想法吹掉。
  • 我想我明白你的建议。您正在通过在运行时使用日志记录来提供调试特定问题的解决方案。然而,我的情况不是我需要调试一个特定的问题,而是这个产品正在进行积极的开发。因此,如果无法在调试模式下启动,它会使编写代码变得更加乏味/昂贵。
【解决方案5】:

哥们,我能同情一下吗?我在这上面花了将近 3 个工作日,仍然没有一个我非常满意的解决方案,但它确实有效,所以我“放弃”了寻找正确的解决方案,并继续这样做,因为我不能再浪费任何资源时间了。

在 IIS 管理器下,点击虚拟目录 -> 身份验证
- 禁用匿名身份验证
- 启用基本身份验证

浏览到应用程序,输入具有足够权限的域或工作站凭据,以根据为应用程序所在的文件系统安全性设置的内容使应用程序正常工作。

这实际上意味着我每次第一次开始调试时都必须向 virtdir 进行身份验证,但最终再次调试功能需要付出很小的代价。

【讨论】:

  • 这似乎不能解决问题。我可能误解了你的建议。虚拟目录需要身份验证,例如 Windows 或 Basic auth,因为它是调试工作的唯一方式。但是,当直接从 IIS 浏览到 Web 应用程序时,它不会从 VB 开始调试,当您尝试开始调试时也会出现同样的问题。
  • @WarrenRox 使用项目加载 VB IDE,单击开始。在默认页面的某处设置断点。浏览到 Web 应用程序,输入凭据。断点应该命中。
  • @WarrenRox 另外,您对虚拟目录指向的目录的权限是什么?我给予 INTERACTIVE、Authenticated Users、Users 和 SYSTEM 完全控制权。
  • 感谢您的 cmets,但是,如果您阅读了问题,您会看到我无法单击开始并调试应用程序。这会立即导致“发生未指定的错误”。我还提高了所有用户对虚拟目录的“完全控制”权限。仍然收到同样的错误。
  • 从上面:尝试调试会导致 WebClass 运行时出现错误“发生未指定的错误”。
【解决方案6】:

您能否将发送到应用程序的 VB6 部分的信息复制并从控制台进行测试?

我的意思是,这很糟糕,但我们谈论的是调试混合 IIS VB6 应用程序。

【讨论】:

  • 我不确定我是否理解您的建议。您的意思是运行诸如 procmon 之类的东西来识别 IDE 在启动时尝试执行的操作?
  • 不,我正在考虑将 Webclass 代码复制到您可以调试它的地方。当然,真正的答案很可能是:用 VB6 以外的东西重建应用程序。
  • 当然可以通过在 IIS 应用程序之外复制一些单独的方法来解决零碎的调试问题,尽管没有任何方法可以访问请求/响应/服务器对象实例 (或处理自定义 Web 项目中的标签或用户事件)。我的理论仍然是,必须有一种方法可以通过调整操作系统安全级别来简单地调试它。
【解决方案7】:

我认为您可以非常确定这不是 Microsoft 不希望它工作的问题,而只是它无法工作。你知道这个文件吗?:http://msdn.microsoft.com/en-us/vstudio/ms788708.aspx

它说:

Visual Basic 6.0 IDE 从未以本机 64 位提供 版本,64 位 Windows 上也不支持 32 位 IDE。 VB6 在 64 位 Windows 或任何本机架构上开发 32 位不支持,也不会支持。

我也尝试过但失败了,所以选择在 VM 中运行 32 位操作系统,然后它可以完美运行。我认为这是由于调试器如何挂钩到内核才能运行调试器。

【讨论】:

  • 我完全理解不支持。但是,我希望找到足够聪明的人来理解潜在问题并提出可行的解决方法。除了 IIS Web 应用程序之外的所有东西似乎都可以正常工作/调试。暂时我实际上已经在 VM 中运行了 VB IDE,尽管如果我可以使用我的主桌面,我发现在 VM 中运行开发环境不太理想。 IE。不想错过 MSN 消息、电子邮件或通常使用多个监视器等。尽管如此,您的评论是有效的和赞赏。
【解决方案8】:

我在 2012 年 9 月 14 日今天遇到了这个问题,并设法以最简单的方式解决了它,我有调试 dll 我需要使用 XP 的 Visual Basic 6.0 我没有问题,但我将其更改为 Windows 7 并且出现了问题使用iis7,我在许多论坛和博客中阅读,但我什么都没有,即使我做了这个博客,也没有,最后我解决了如下问题:组件服务->计算机->右键单击属性->然后单击安全选项卡COM->部分启动和激活权限->编辑默认值->然后添加本地服务帐户并授予所有权限。我澄清一下,对我来说,它可以在本地调试 Visual Basic 6.0 中的 dll,但如果它是好的或唯一的解决方案,我认为我做得很好,这应该超过他们在其他论坛上所说的,现在很好Microsoft http://support.microsoft.com/kb/899965/es 页面说了同样的话,但说像我一样添加网络服务帐户,并且我为我命令事件查看器的错误工作是:

“在您的计算机上设置默认设置的权限不会向 CLSID {95D14525-F934-4D4F-9B33-2CE753FAF3B0} 和 APPID {95D14525-F934-4D4F-9B33-2CE753FAF3B0} 的 COM 服务器应用程序授予本地激活权限用户 NT AUTHORITY \ LOCAL SERVICE 在地址 LocalHost(使用 LRPC)中具有 SID(S-1-5-19)。 可以使用组件服务管理工具修改此安全权限“

你看到说 NT\AUTHORITY\NETWORK SERVICE LOCAL SERVICE 帐号骨架。

就是这样。

【讨论】:

  • 首先,非常感谢您提供此问题的推荐解决方案!我尝试了添加具有启动和激活权限的“本地服务”帐户的建议,但在尝试启动任何 IIS 应用程序进行调试时,我仍然收到“发生未指定的错误”。您的解决方案还缺少什么吗?
  • 此外,您还必须按照此页面上的说明进行操作support.microsoft.com/kb/259725/en-us
  • 当我遇到原始问题时,我曾尝试以适当的安全性将 VB ASP 调试添加到 DCOM。这不能解决它。
  • @Raúl 你确定你在调试IIS Application,而不是ASP应用程序中使用的VB6组件吗? IIS Application 是一种特殊类型的 VB6 项目。
【解决方案9】:

听起来您希望在创建应用程序实例时在调试器中触发 VB6 IDE,但这是失败的。您是否尝试过在调试模式下启动 VB6 IDE 来托管您的 COM 组件,在源代码中设置断点,然后查看访问使用该组件的页面是否会导致调试器中的断点被命中?也就是说,将 VB6 IDE 的激活排除在循环之外 - 让它运行只会导致应用程序的 CLSID 指向作为 COM 主机的 IDE 的运行时实例。

自从我在 VB6 中进行开发以来已经很长时间了,所以有些细节可能很粗略,但我确实记得调试 COM 服务器需要一些体操,其中一个解决方案是运行一个单独的 VB 实例作为COM 进程外服务器主机。

【讨论】:

  • 感谢您的反馈。但是,如前所述,我希望调试 IIS 应用程序,它不会在调试模式下启动。我相信我可以在 VB6 IDE 中启动一个简单的 COM DLL,并在 IIS 应用程序调用它时单步执行代码。但问题是我需要能够调试实际的 IIS 应用程序,它不会启动并出现上述一般错误。
  • Warren,我遇到了这篇知识库文章,该文章专门讨论了调试 VB6 WebClass 应用程序所产生的问题以及由此产生的问题。您可能已经完成了这些步骤,但我会在此处发布链接以供参考,以防它包含您以前可能没有的信息:support.microsoft.com/default.aspx?scid=kb;EN-US;259725
  • 谢谢。几年前,我在 Windows 2000 和 XP 时代读过那篇文章,它与那些操作系统非常相关。但是,Windows 7 中的安全模型似乎完全不同,并且由于 VB6 不再支持 MS,因此永远不会有新的类似的 Windows 7 知识库文章。唉,这取决于专门的 VB6 粉丝来解决这个问题直到有人找到解决方案。谢谢。
  • 我认为与 IIS7.x 及其架构、应用程序池、托管处理程序等完全不同,Win7 的安全性不同(尽管它与 UAC 不同)可能最终会更少现在的野兽。我对你有感觉!我在 VB6 应用程序中度过了很多很多年,并从中榨取了最后一点能力。
  • 你是绝对正确的。我确定的一件事是在 IIS 7.5 中安装 IIS 6 兼容性选项。这使我可以为 ASP 应用程序等设置 32 位支持。因此,在 IIS 7.5 和 Windows 7 的内部,存在一个安全问题,无法启动调试器。
猜你喜欢
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
相关资源
最近更新 更多