如何从 C# 代码中跟踪连接失败的原因?

Posted

技术标签:

【中文标题】如何从 C# 代码中跟踪连接失败的原因?【英文标题】:how to trace connection failure reasons from C# code? 【发布时间】:2013-07-16 15:00:19 【问题描述】:

我有两段相同的 C# 代码远程连接到另一台服务器:一段来自控制台,另一段来自 Web 应用程序:

var mgr = ServerManager.OpenRemote(myServer) 

控制台工作正常。然而,另一个失败并出现以下异常:

System.UnAuthorizedAccessException with this com-message: "Retrieve the COM class factory for remote component with CLSID 2B72133B-3F5B-4602-8952-803546CE3344 from machine failed because of the following error: 80070005 ."

我已禁用两台服务器上的防火墙并重新启动它们。

有没有一种方法或工具可以帮助我了解每个连接是如何进行的:两个服务器发送和接收的登录和访问权限是什么?

我的尝试没有被困在 IIS 日志和事件查看器中。

我试图让提琴手听,但它也没有找到任何东西。

【问题讨论】:

是身份的区别吗?在控制台的情况下,我认为身份将是你,可能是两个盒子上的管理员。但在网页代码的情况下,身份可能较弱。错误信息是什么?? 错误是:System.UnAuthorizedAccessException with this com-message: "Retrieving the COM class factory for remote component with CLSID 2B72133B-3F5B-4602-8952-803546CE3344 from machine failed由于以下错误:80070005 。”正是这条消息的丑陋让我提出了这个问题。 【参考方案1】:

您收到该异常的原因是应用程序池标识没有足够的权限。要使用 Microsoft.Web.Administration 托管 API,您需要是管理员。

此外,当您使用ServerManager.OpenRemote() 时,您的网站运行所用的帐户(无论是应用程序池身份还是其他帐户)都需要是具有足够权限的有效域帐户。

顺便提一下,CLSID“2B72133B-3F5B-4602-8952-803546CE3344”是Microsoft.ApplicationHost.WritableAdminManager COM 组件的类 ID,它支持 ServerManager 托管 API。

【讨论】:

【参考方案2】:

我建议您使用 SysInternals 的 Process Monitor 来观察 Web 进程在做什么。诀窍是过滤信息的消防水带! 顺便说一句,我怀疑这是应用程序池标识或 DCOM 权限问题。

【讨论】:

以上是关于如何从 C# 代码中跟踪连接失败的原因?的主要内容,如果未能解决你的问题,请参考以下文章

C#怎么判断数据库是不是连接成功?

在 C# 中使用 ADSI 进行 LDAP 绑定错误代码

ODBC数据库连接SQL Server失败?啥原因啊!~~

如何在 Socket.IO 中模拟连接失败

远程桌面调用失败rad_001

远程桌面连接失败有哪些原因,如何避免?