【问题标题】:windows service works on XP but fails with error 1053 on w2k3 64 bitWindows 服务在 XP 上工作,但在 w2k3 64 位上失败并出现错误 1053
【发布时间】:2012-09-19 14:13:01
【问题描述】:

如果这是一个愚蠢的问题,请原谅我,我对编写服务还很陌生。我编写了一个运行计时器的服务,计时器代码运行一些检查以确保我们的系统正常运行。它是用 VB.Net,框架 1.1 编写的。然后我使用“sc create”安装服务。该服务在我正在开发的 XP Pro 机器上运行良好。但是,当我在 64 位 Windows 2003 服务器上安装该服务时,该服务会立即以error 1053 失败。我在 OnStart 函数的第一行代码中进行了一些调试以写入文本文件,但即使这样也没有运行,因此程序启动时一定有问题。最后无奈之下,我在 Visual Studio 2003 的新 VB 项目中创建了一个全新的 Windows 服务,并编译了一个空服务,该服务仅在 OnStart 函数中声明和设置字符串变量的值,如下所示:

Dim strTmp As String
strTmp = "hello"

即使在 W2K3 服务器 上失败了,但在 XP 开发机器上工作正常。 服务器已安装并运行 .Net Framework 1.1,我们在 CMS 中使用它(用 ASP.Net 1.1 编写)。 该服务作为本地系统帐户运行。我尝试启用与桌面的交互,但这没有帮助。我运行了进程监视器并且没有拒绝访问事件。我清空了应用程序事件日志,仍然不起作用。日志中没有其他事件可以帮助我。绝对使用应用程序的发布版本。对 exe 文件的权限由系统和管理员完全控制。 有什么想法吗?这一定很简单,但如果我能弄清楚,我该死的! 提前致谢。

@DavidHi,非常感谢您的建议。我不认为第一点是我的问题,部分原因是 MS 文章是关于停止或暂停服务,我的启动失败;也是因为服务没有超时,没有30秒的等待,立即失败。其次,当您说向服务启动添加异常处理程序时,您是指 OnStart 子吗?我尝试在那里添加一个调试文件写入,但我会尝试添加一个事件日志。关于系统检查,不可能是因为我创建的全新空测试服务显示了相同的行为并且根本没有做任何事情。你最后一点可能是关键。我的开发环境是32bit。我会对 corflags 做一些研究,或者我可以构建一个 64 位开发环境。再次非常感谢,您至少给了我一些新的思考!

好的,找到了解决方法。我将我的 exe 文件放在System32 中。当我将它放在我自己创建的另一个文件夹中时,服务运行了,尽管时间很短。然后我不得不将 ini 文件和它读取/写入的日志文件也移动到该文件夹​​,而不是 System32,并且一切似乎都运行良好。天知道为什么它不喜欢从 System32 运行,但至少它现在可以工作了!谢谢大家的帮助。

【问题讨论】:

  • 在你的项目属性 > 编译 > 高级编译选项 > 目标 CPU,你是否将它设置为 x86、x64 或 AnyCPU?
  • 不要认为 Framework 1.1 有任何 64 位编译的概念......它是在 32 位世界 IIRC
  • 您能否将您的服务重新定位到 Framework 2.0?
  • @steven - 在此版本的 Visual Studio (2003) 中似乎没有任何高级编译或目标 CPU 选项。
  • @david - 不确定你所说的重定向是什么意思。安装 .Net v2.0,然后使用该框架在 VS2003 中重新创建项目?

标签: vb.net service


【解决方案1】:

这看起来与此问题非常相似,可能会对您有所帮助: Starting a windows service fails with error 1053

还有一些需要注意的事项:

  • 确保您部署的服务中没有以下任一语句:

    System.Diagnostics.Debugger.Launch

    System.Diagnostics.Debugger.Break

  • 您可能需要使用本地系统以外的帐户运行服务(取决于您的服务所需的权限)。

【讨论】:

  • 没有这些代码行的迹象,但是,权限可能是一个关键点,因为我认为我刚刚修复了它,上面的详细信息......
【解决方案2】:

1053 错误是与服务控制管理器等待服务响应您的启动请求有关的超时。有一篇知识库文章提到了与基于 Framework 1.1 的服务特别相关的托管服务停止请求问题,因此它没有准确描述您的问题,但它可能与您的情况相关。该链接供您参考。

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

我要进一步诊断问题的另一个建议是确定启动是否由于服务的启动代码中发生“隐藏”异常而失败; start 调用不会看到异常,可能会让您认为它只是超时。

我建议您在服务启动中添加一个异常处理程序,它只会在事件日志中记录一条消息,其中包含异常的详细信息(如果捕获到异常)。这至少会让您知道服务中出现了问题,并为您提供比现在更多的信息。

最后一个想法:服务是否通过网络连接检查您描述的系统?如果是这样,LocalSystem 将没有足够的权限来执行网络访问。

祝你好运!

编辑另一种可能性:

您的开发环境/可执行文件是 32 位的吗?您提到您的服务器是 64 位的,因此您可能需要使用强制执行 32 位操作的“corflags”工具

corflags /32bit+ YourServiceExectubable.exe

此信息的来源是以下 SO 帖子: 32-bit Windows services in 64-bit environment

**不幸的是,corflags 似乎仅适用于 2.0 程序集,并且专为此类问题而设计。 **

【讨论】:

    猜你喜欢
    • 2011-09-10
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多