请原谅我,如果这是一个愚蠢的问题,我很擅长编写服务。我编写了一个运行计时器的服务,计时器代码运行一些检查以确保我们的系统正常运行。它是用 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编写)中使用它。 该服务作为本地系统帐户运行。我尝试启用与桌面的交互,但这没有帮助。我运行了Process Monitor,没有访问被拒绝的事件。我清空应用程序事件日志,仍然无法正常工作。没有其他事件可以帮助我在日志中。绝对使用应用程序的Release版本。 exe文件的权限是对System和Admins的完全控制。 任何人的想法?它必须是简单的东西,但如果我能搞清楚,我该死的! 提前谢谢。
@DavidHi,非常感谢你的建议。我不认为第一点是我的问题,部分是因为MS文章是关于停止或暂停服务,我的启动失败;但也因为服务没有超时,没有30秒等待,它立即失败。其次,当你说为服务启动添加异常处理程序时,你的意思是OnStart sub?我尝试在那里添加一个调试文件写入,但我会尝试添加一个事件日志。关于系统检查,它不可能是因为我创建的全新的空测试服务显示相同的行为,并且根本不做任何事情。你最后一点可能是关键。我的开发环境是32bit
。我会对corflags做一些研究,或者也许我可以构建一个64位的开发环境。非常感谢,至少你给了我一些新想法!
好的,找到了解决方法。我把我的exe文件放在System32
中。当我把它放在由我自己创建的不同文件夹中时,该服务运行了,尽管是短暂的。然后我不得不将ini文件和它读/写的日志文件移动到该文件夹,而不是System32,所有这些似乎都很好用。上帝知道为什么它不喜欢从System32运行,但至少它现在有效!谢谢你的帮助。
答案 0 :(得分:0)
1053错误是与服务控制管理器相关的超时,等待服务响应您的启动请求。有一篇知识库文章引用了与基于Framework 1.1的服务有关的托管服务停止请求问题,因此它并没有准确地描述您的问题,但它可能与您的情况有关。该链接仅供参考。
http://support.microsoft.com/kb/839174
我要进一步诊断问题的另一个建议是确定由于服务启动代码中发生“隐藏”异常而导致Start失败;启动调用不会看到异常,并且可能会让您认为它只是超时。
我建议你为你的服务启动添加一个异常处理程序,除了将一条消息记录到事件日志中之外,如果有一个异常的详细信息,它只会将消息记录到事件日志中。这至少可以让你知道服务中出现了什么问题,并提供了比现在更多的信息。
最后一个想法:服务是否通过网络连接检查您描述的系统?如果是这样,LocalSystem将没有足够的权限来执行网络访问。
祝你好运!编辑另一种可能性:
您的开发环境/可执行32位吗?你提到你的服务器是64位的,所以你可能需要使用强制32bit操作的“corflags”工具
corflags /32bit+ YourServiceExectubable.exe
此信息的来源是以下SO帖子: 32-bit Windows services in 64-bit environment
**不幸的是,看起来corflags仅适用于2.0程序集,并且专门针对此类问题而设计。 **
答案 1 :(得分:0)
这看起来非常类似于这个可能会帮助你的问题: Starting a windows service fails with error 1053
还有其他一些需要注意的事项:
确保已部署的服务中没有以下任何一种语句:
System.Diagnostics.Debugger.Launch
System.Diagnostics.Debugger.Break
您可能需要使用本地系统以外的帐户运行服务(具体取决于您的服务所需的权限)。