如何在Windows 7 64位上调试VB6 IIS应用程序

9
我需要能够在Windows 7 64位系统上调试一个VB6 IIS应用程序,这不仅仅针对一个单一的问题,而是需要持续开发。尝试调试会导致WebClass运行时出现“发生未指定的错误”的错误。如果我不进行调试,只是访问编译后的webclass,则页面可以正常加载。因此,我认为应用程序的注册/配置没有问题,而是与Windows操作系统安全性有关,阻止了VB6 IDE从IIS中挂接并允许调试。我已经尝试过以下所有方法:
1.禁用用户帐户控制(UAC)并重新启动。
2.修改了机器调试管理器(MDM)的DCOM组件安全性,并分配了“Everyone”启动和激活权限。
3.手动添加了“70F214BA-94E2-4bdf-8F30-32CB4A905E4D”的DCOM条目,这是VB6 IDE,并分配了“Everyone”启动和激活权限。
4.禁用Windows防火墙。
5.以管理员身份在Windows XP SP3兼容模式下运行应用程序(VB6.exe)。
6.创建了一个新的IIS应用程序池,其标识设置为管理员帐户。将应用程序管道模式设置为classic,并启用32位遗留应用程序支持。
然而,这些都无法解决问题。如果我创建一个VB6 Windows应用程序或ActiveX控件,我可以轻松启动和调试。我也曾在Windows Server 2003上遇到类似的问题,不过重新安装W2K3后问题得以解决。在Windows系统事件查看器日志中,有两个重复的Event ID 10004条目,内容如下:DCOM收到错误“1326”,无法登录DOMAIN\User以运行服务器:{70F214BA-94E2-4BDF-8F30-32CB4A905E4D}。其中DOMAIN\User是我的域帐户,上述GUID是我为VB ASP调试添加的DCOM条目。额外提供的唯一信息是,Windows 7 64位正在运行VM,尽管在尝试调试时已经连接到了控制台,但仍然存在调试VM时遇到问题的情况。
如果有人能够提供进一步的建议或解决方案,则将不胜感激。如果有人能够找出这个问题并成功地在Windows 7操作系统上调试IIS Web应用程序,展示必要的设置,我将提供当前的300点赏金!

嗨,沃伦,我看到你再次对此进行悬赏。我注意到一件事——你没有提到你使用的VS6的SP版本。我知道这很简单,但是你是否正在运行SP6? - Lynn Crumbling
1
你尝试过使用IIS Express运行应用程序吗?这样你就可以在自己的用户上下文中运行IIS(与VB6 IDE / debugger运行的上下文相同)了。 - agent-j
最后一招:如果您的应用程序事件日志已满,并设置为不覆盖事件,则似乎会出现未指定的错误。尝试清除它,看看是否有任何不同。 - Lynn Crumbling
1
是的,事件日志中有相关错误。我已更新原问题。然而,在我的第一次故障排除尝试期间,我添加了DCOM条目,以尝试解决启动VB调试器时出现的安全问题。这些信息可能仍然有所帮助? - Warren Rox
谢谢,但这并没有解决问题。我早在 Windows Server 2003 的时候就知道这个问题了,在那种情况下它是可以工作的。然而,我现在具体在谈论的是 Windows 7。 - Warren Rox
显示剩余8条评论
9个回答

6
我最近在Windows 7 64位机器上遇到了同样的问题。对我有效的解决方案是检查Windows事件日志(系统)以查找特定的DCOM错误。这是我的错误信息:
“默认设置的机器权限不允许本地启动程序集CLSID为{17C2D338-9569-4022-8AF2-52A3A124F22D},APPID为 {17C2D338-9569-4022-8AF2-52A3A124F22D}的组件服务应用程序,对于来自地址LocalHost (Using LRPC)的用户NT AUTHORITY\IUSR SID (S-1-5-17)。可以使用组件服务管理工具修改此安全性权限。”
对我来说关键的一点是给内置帐户IUSR授予启动和激活权限。在尝试给该用户权限无法解决问题之后,我决定将该用户添加到默认DCOM权限中。您可以按以下步骤操作:
运行dcomcnfg。右键单击 Console Root/Component Services/Computers/My Computer 节点。选择属性。选择“COM Security”选项卡。在“Access Permissions”组下点击“Edit Default”。点击“Add”,输入事件日志中指示的用户(我的用户名为IUSR)。单击确定。对于“Launch and Activation Permissions”组,请重复以上步骤。在所有对话框中选择确定即可。
我没有重启计算机即可生效这些设置。我使用了与在XP上调试VB6 dll相同的方法,即在VB6下运行dll(无人操作),设置断点,导航到访问dll的页面,并等待断点触发。希望这可以帮到您。

非常感谢您的建议。实际上,我在Windows系统事件日志中看到以下错误:DCOM出现错误“1326”,无法登录DOMAIN\USERID以运行服务器: {70F214BA-94E2-4BDF-8F30-32CB4A905E4D}。我在域上,并且错误消息包括真实的域\用户名。但是,我已经添加了“Everyone”到DCOM权限,当我尝试调试时,仍然在IDE中收到相同的错误,并且在事件日志中一遍又一遍地收到相同的错误。我已经搜索了注册表,列出的GUID实际上是VB6。 - Warren Rox
这个解决方案对我很有帮助。在更改后,我必须重新启动我的机器,否则它就无法正常工作,但是重新启动后,一切都像魔术般地开始工作了。感谢您的分享! - Andrew Savinykh
我在故障排除过程中已经多次重启了我的机器,但是没有任何进展。如果你能够证明你确实成功地调试了一个运行在Windows 7操作系统上的IIS Web应用程序,并展示必要的设置,我将提供我所有声望点数的赏金。这个奖励也适用于任何能够做到同样事情的人。 - Warren Rox
@yuben 你确定你在调试“ IIS 应用程序”,而不是仅从 ASP 应用程序中使用的 VB6 组件?“ IIS 应用程序”是一种特殊类型的 VB6 项目。 - Ilya Kurnosov
谢谢您的回答,yuben。有两个重要的修改:1)我的错误消息是指IWAM_machine用户而不是IUSR,所以我必须同时授予该用户文件和DCOM启动权限。2)错误组件“Machine Debug Manager”被设置为使用自定义DCOM权限,因此仅修改默认设置是无法解决问题的。我确实进行了这些修改,但还将两个I*用户添加到该对象的特定权限中。重启后,它可以正常工作!希望对某人有所帮助。 - SilverSideDown

4

不知道这是否能对您有所帮助...我正在为自己的使用研究同样的问题。

在事件查看器中,我看到: 机器默认权限设置未授予与COM服务器应用程序相对应的本地激活权限

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

and

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

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

..所以我尝试授予"Everyone"本地激活权限-只是为了看看能否让它消失。-我做不到。

然后,在组件服务/我的计算机(属性)/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或类似工具查看发生了什么。


1
我很感激这些信息。然而,我已经将COM安全设置打开给了“每个人”,并且对于所有内容也是如此。但是,事件查看器中没有任何事件记录表明安全存在问题。我只看到来自VB IDE的“访问被拒绝”的消息。我也尝试过procmon,但没有什么异常情况。 - Warren Rox
赏金已经过期,我没有收到解决我的问题的答案。然而,基于收到的评论,我必须说你提供了最深入的尝试来识别潜在的安全问题。因此,我授予你这份赏金。但是,请让我知道如果最终你自己解决了这个问题并更新了答案。谢谢! - Warren Rox
@BoAndersen 你确定你在调试IIS应用程序而不是仅从ASP应用程序中使用的VB6组件吗? IIS应用程序是一种特殊类型的VB6项目。 - Ilya Kurnosov

3
我认为在任何比Windows XP更新的版本的Windows上(可能适用于Windows服务器版),都无法在IDE中调试VB6 IIS应用程序。问题的根本原因似乎是IIS 6和IIS 7+之间存在重大差异。当然,官方文档没有关于这个主题的说明,因此我将在下面更详细地介绍。
首先,回顾一下问题是有意义的。许多好心人似乎忘记了,在这种情况下,“IIS应用程序”是指特定类型的VB6项目。我能够在Win7 Ultimate x64 SP1、Win7 Ultimate x86 SP1和Vista Enterprise x86 SP2上按照以下步骤重现错误:
1. 安装VB6和SP6。 2. 创建新的“IIS应用程序”项目: enter image description here 3. 保存项目。 4. 选择“Run -> Start (F5)”来调试项目。 5. 选择调试选项并按OK: enter image description here

紧接着,在VB6 IDE中会出现错误消息:

enter image description here

让我们来看看在Windows XP上执行相同场景时会发生什么。当一个人开始调试VB6 IIS应用程序时:

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

enter image description here

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

enter image description here

所有这些都发生在Windows XP上,在激活WebClass之前。在Windows 7上,进程无法达到这个阶段。
很明显,VB6 IDE试图执行一些管理任务以便能够调试WebClass。可以通过Process MonitorAPI Monitor深入挖掘一下。然后清楚地看到,VB6.exe依赖于IIS Admin Service的COM接口。坏消息是,与之前版本不同,IIS 7+不使用元数据存储,并且在IIS 7+中没有IIS Admin Service。可以安装IIS Metabase and IIS6 compatibility组件,理论上应该使使用Metabase的应用程序继续与IIS 7+一起工作。

enter image description here

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

有人建议你的问题可能是由于COM组件启动和激活权限不足引起的。恐怕所有这些建议都是徒劳的。这种错误通常会在系统事件日志中伴随相关的错误事件。但在这种情况下,没有这样的事件。


你应该因为回答问题而获得悬赏,但我不确定悬赏去了哪里? - Warren Rox

2

你有没有考虑记录日志?这很简单,你可以从代码最可能引起错误的地方开始。我建议创建一个函数,它需要一些参数,比如子/函数名称、Err对象和一个可选的额外字符串,以便你可以包含其他信息,比如你的代码是在哪个步骤中出错的。在错误处理程序中调用你的函数并传递参数。


应用程序甚至无法启动,因此无法编写日志文件。在按下F5开始调试后立即出现错误。无论代码如何,该问题都会出现在任何IIS应用程序中。 - Warren Rox
@WarrenRox,我建议你在运行应用程序时使用日志记录,而不是在调试时使用。如果你需要这样做是因为你正在开发应用程序,那么请设置一个变量来打开和关闭日志记录,然后在开发过程中将变量值和函数结果写入日志,生产环境时则关闭它。如果这不适合你,那么就把它当作疯子的想法吧。 - jac
2
我认为我理解了你的建议。你提供了一种在运行时使用日志记录来调试特定问题的解决方案。然而,我的情况并不是需要调试特定问题,而是因为这个产品正在进行活跃的开发。因此,如果没有能够以调试模式启动的能力,编写代码会变得更加繁琐/昂贵,你可以想象。 - Warren Rox

2

我能理解你的苦衷。我花了近3个工作日来解决这个问题,虽然我还没有找到一个完美的解决方案,但它确实可以工作,所以我放弃了寻找正确的解决方案,选择了这种方法,因为我不能再浪费更多的资源时间。

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

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

这意味着每次我第一次开始调试时都必须对虚拟目录进行身份验证,但这是为了最终重新获得调试功能而付出的小代价。


@WarrenRox 载入带有项目的 VB IDE,点击启动。在默认页面中的某处设置一个断点。浏览到 Web 应用程序,输入凭据。断点应该被命中。 - Lynn Crumbling
1
我感谢您的评论,但是如果您仔细阅读问题,您会发现我无法单击“开始”并调试应用程序。这会立即导致出现“发生未指定错误”的错误。我已将虚拟目录的权限提升到“完全控制”以供所有用户使用。仍然收到相同的错误。 - Warren Rox
嗯...我刚刚重新阅读了问题,以确保自己没有疯,但是并没有看到任何提到您“无法点击开始”(因此与收到消息有关)的内容。从您的措辞来看,您的帖子似乎表明您在浏览器中(从IIS)收到了此错误,而不是在IDE中。 - Lynn Crumbling
1
从上面可以看出:尝试调试导致WebClass运行时出现“发生未指定的错误”的错误。 - Warren Rox
@LynnCrumbling,你确定你在调试“ IIS应用程序”,而不是仅从ASP应用程序中使用的VB6组件?“ IIS应用程序”是一种特殊类型的VB6项目。 - Ilya Kurnosov
显示剩余2条评论

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

在您的计算机上设置默认权限不会授予CLSID {95D14525-F934-4D4F-9B33-2CE753FAF3B0}和APPID {95D14525-F934-4D4F-9B33-2CE753FAF3B0}的COM服务器应用程序本地激活权限,该权限由SID(S-1-5-19)为NT AUTHORITY \ LOCAL SERVICE的用户在地址LocalHost(使用LRPC)。

此安全权限可以使用组件服务管理工具进行修改。

您可以看到NT \ AUTHORITY \ NETWORK SERVICE LOCAL SERVICE帐户。

好的,就这些。


首先,非常感谢您为这个问题提供了一个推荐解决方案!我尝试了您的建议,添加了“本地服务”帐户并授予启动和激活权限,但是当我尝试启动任何IIS应用程序进行调试时,仍然收到“发生未指定的错误”的消息。您的解决方案还有什么我遗漏的吗? - Warren Rox
此外,您还需要按照此页面http://support.microsoft.com/kb/259725/en-us上的说明进行操作。 - Raúl
我曾尝试将VB ASP调试添加到DCOM,并采用适当的安全性来解决原始问题。但这并没有解决它。 - Warren Rox
@Raúl 你确定你在调试 IIS 应用程序 而不是仅从 ASP 应用程序中使用的 VB6 组件?IIS 应用程序 是一种特殊类型的 VB6 项目。 - Ilya Kurnosov

1

你能把发送的信息复制到应用程序的VB6部分,并从控制台测试吗?

我的意思是,这很恶心,但我们正在讨论调试混合IIS VB6应用程序。


我不确定我理解你的建议。你是指运行像procmon这样的东西来识别IDE在启动时尝试做什么吗? - Warren Rox
不,我在考虑只是复制Webclass代码到某个可以调试的地方。当然,真正的答案可能是:用VB6之外的其他东西重建应用程序。 - Code Silverback
1
当然,可以通过复制某些单个方法到IIS应用程序之外的方式来逐步解决调试问题,尽管没有办法访问请求/响应/服务器对象实例(或处理标记或自定义Web项中的用户事件)。我的理论仍然是,必须有一种方法来通过操作系统安全级别的微调来简单地调试它。 - Warren Rox

1

我认为你可以相当确定,这不是微软不想让它工作的问题,而只是它无法工作。你是否知道这份文档?: http://msdn.microsoft.com/en-us/vstudio/ms788708.aspx

它声明:

Visual Basic 6.0 IDE 从未以本机 64 位版本提供,也没有支持在 64 位 Windows 上运行 32 位 IDE。在 64 位 Windows 或任何其他本机架构上开发 VB6 不受支持,也将不会得到支持。

我也尝试过失败,所以选择在虚拟机中运行 32 位操作系统,然后它可以完美运行。我认为这是由于调试器如何钩入内核以便能够运行调试器。


1
我完全理解它不受支持。但是,我希望能找到聪明的人理解潜在问题并提出可行的解决方法。除了IIS Web应用程序之外,其他所有内容似乎都可以正常工作/调试。目前我实际上正在VM中运行VB IDE,尽管我发现在VM中运行开发环境不太理想,如果我可以使用我的主要桌面,我就不想错过MSN消息、电子邮件或通常使用多个监视器等。尽管如此,您的评论是有效的并且受到赞赏。 - Warren Rox

0

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

已经很久没有在VB6中进行开发了,所以一些细节可能有点模糊,但我记得调试COM服务器需要一些技巧,其中一个解决方案是运行VB的单独实例作为COM进程外服务器主机。


感谢您的反馈。但是,正如我所说,我希望调试IIS应用程序,但它无法在调试模式下启动。我相信我可以在VB6 IDE中启动一个简单的COM DLL,并在IIS应用程序调用它时进入代码。但问题是,我需要能够调试实际的IIS应用程序,而它无法以上述通用错误启动。 - Warren Rox
Warren,我找到了一篇与调试VB6 WebClass应用程序有关的知识库文章,该文章专门涉及此类应用程序可能出现的问题。您可能已经执行过这些步骤,但为了参考,我在此处发布链接,以防它包含先前未获得的信息:http://support.microsoft.com/default.aspx?scid=kb;EN-US;259725 - David W
谢谢。我几年前在Windows 2000和XP时代读过那篇文章,它对这些操作系统非常相关。然而,Windows 7中的安全模型似乎完全不同,由于VB6不再有MS支持,因此将永远不会有新的类似KB文章适用于Windows 7。唉,这取决于专注于VB6的粉丝们坚持不懈地努力,直到有人找到解决方案。谢谢。 - Warren Rox
我认为这可能与Win7的安全性不同有关(虽然它在UAC方面确实如此),但更多的是IIS7.x及其架构、应用程序池、托管处理程序等现在完全不同。我对你感到同情!我曾经在VB6应用程序中拥有许多年的高效生产,并从中挤取了最后一分能力。 - David W
1
你说得完全正确。我确保安装了IIS 7.5中的IIS 6兼容选项。这使我能够为ASP应用程序设置32位支持等。因此,在IIS 7.5和Windows 7的某个深处存在一个安全问题,阻止调试器的启动。 - Warren Rox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接