.net - 签名的程序集阻止我的服务启动

标签 .net service code-signing

当我使用 Verisign signtool.exe 对我的服务中的程序集进行签名时,它在运行 Windows 2003 Server 的计算机上启动时无法启动。事件日志有两个事件:

“超时(30000 毫秒)等待 xxx 服务服务连接。”

“由于以下错误,xxx Service 服务无法启动:
该服务没有及时响应启动或控制请求。”

一旦机器运行,它就可以正常启动。它在 XP 和 Vista 中启动良好。当程序集未签名时,它开始正常。

最佳答案

此问题对于签名的 .NET 服务可执行文件非常常见:该服务在启动时无法启动,但在之后手动启动时运行良好。是否使用 ServiceBase.RequestAdditionalTime 无关紧要:实际上,在服务启动请求超时之前根本没有执行任何用户代码。这种影响在没有 Internet 连接的机器上更为明显:在这种情况下,即使从 SCM 手动启动服务也会失败。

要解决此问题,disable the verification of the Authenticode signature at load time in order to create Publisher evidence ,通过将以下元素添加到您的 .exe.config 文件中:

<configuration>
    <runtime>
        <generatePublisherEvidence enabled="false"/>
    </runtime>
</configuration>

发布者证据是一个很少使用的代码访问安全 (CAS) 功能:只有当您的服务依赖 PublisherMembershipCondition 时,禁用它才会导致问题。在所有其他情况下,它将不再需要运行时进行昂贵的证书检查(包括吊销列表查找),从而消除永久性或间歇性启动失败。

编辑,2010 年 7 月:对于使用 .NET Framework 4.0 版的应用程序,不再需要此解决方法。

关于.net - 签名的程序集阻止我的服务启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/554688/

相关文章:

c# - 未使用的方法和属性对库或可执行文件的影响

java - 如何在服务类中使用融合位置提供程序?

c++ - 使用文件 I/O 正确创建和运行 win32 服务

iOS:何时在构建配置中使用哪个代码签名标识?

java - 如何对 jar 进行签名并添加用于读、写的 list 属性?

c# - C# 应用程序中串行数据未传输

c# - .NET 字典作为属性

java - 如何启动/停止/重新启动 Linux 服务以及如何从 Java 程序更新它们的配置文件

open-source - 个人开源项目的代码签名

c# - 只有一位小数的字符串格式?