错误1053:服务没有及时响应启动或控制请求

我最近inheritance了几个作为Windows服务运行的应用程序,并且我提供了一个gui(可以从系统托盘中的上下文菜单中访问),它们都有问题。

为什么我们需要一个窗口服务的GUI是为了能够重新configuration窗口服务的行为,而不诉诸停止/重新启动。

我的代码在debugging模式下工作正常,我得到的上下文菜单出现,一切正常行为等

当我通过“installutil”使用指定帐户(即不是本地系统帐户)安装服务时,服务运行正常,但不显示系统托盘中的图标(我知道这是正常行为,因为我不有“与桌面交互”选项)。

这里是问题 – 当我select“LocalSystemAccount”选项,并检查“与桌面交互”选项,该服务需要AGES启动没有明显的原因,我只是不断

无法在本地计算机上启动…服务。

错误1053:服务没有及时响应启动或控制请求。

顺便说一句,我通过registry黑客(从http://support.microsoft.com/kb/824344 ,在第3节中searchTimeoutPeriod)将Windows服务超时从默认的30秒增加到2分钟,但服务仍然启动超时。

我的第一个问题是:为什么“本地系统帐户”login比服务使用非LocalSystemAccountlogin需要花费的SOOOOO多久,导致Windows服务超时? 这两者之间有什么区别可以引起这种不同的行为呢?

其次 – 退后一步,我试图实现的只是一个提供configurationGUI的Windows服务 – 我非常乐意使用非本地系统帐户(使用命名用户/ pwd)运行,如果我可以得到服务与桌面进行交互(也就是说,从系统托盘中有一个上下文菜单)。 这是可能的,如果是的话如何?

任何指针上述问题将不胜感激!

在与这个消息交战几天之后,一个朋友告诉我必须使用Release版本。 当我安装使用debugging版本,它给出了这个消息。 发布版本开始正常。

如果你继续努力让自己的服务直接与用户的桌面进行交互,那么即使在最好的情况下(即“在Vista之前”),这也是非常棘手的。

Windows内部pipe理多个窗口工作站 ,每个工作站都有自己的桌面。 分配给在给定帐户下运行的服务的窗口站与login的交互式用户的窗口站完全不同。 跨窗口站访问一直被忽视,因为这是一个安全风险,但以前的Windows版本允许一些例外,这些在Vista和更高版本的操作系统中已经大部分被淘汰。

您的服务在启动时挂起的最可能的原因是因为它试图与不存在的桌面进行交互(或者假定资源pipe理器正在系统用户会话中运行,情况并非如此),或者等待来自不可见桌面的input。

对于这些问题唯一可靠的解决方法是从您的服务中删除所有UI代码,并将其移动到在交互式用户会话中运行的单独可执行文件(例如,可以使用全局启动组来启动可执行文件)。

您的UI代码和您的服务之间的通信可以使用任何RPC机制实现:命名pipe道为此目的特别好。 如果您的通信需求很less,那么使用应用程序定义的服务控制pipe理器命令也可能有用。

实现用户界面和服务代码之间的这种分离需要一些努力:但是,这是让事情可靠运行的唯一方法,并且将在未来为您提供良好的服务。

附录,2010年4月:由于这个问题仍然相当受欢迎,这里有一个方法来解决导致“服务没有响应…”错误的另一个常见的情况,涉及的.NET服务,不要尝试任何有趣的东西,如与桌面交互但是使用Authenticode签名的程序集: 在加载时禁用Authenticode签名的validation,以便创buildPublisher证据 ,方法是将以下元素添加到.exe.config文件中:

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

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

我面临这个问题,因为运行我的服务的框架上缺less框架。 盒子有.NET 4.0,服务是在.NET 4.5之上编写的。

我在盒子上安装了以下下载,重新启动,服务启动正常: http : //www.microsoft.com/en-us/download/details.aspx?id=30653

要debugging服务的启动,请将以下内容添加到服务的OnStart()方法的顶部:

  while(!System.Diagnostics.Debugger.IsAttached) Thread.Sleep(100); 

这将停止服务,直到您手动附加Visual Studiodebugging器使用debugging – >附加到进程…

注意:一般情况下,如果您需要用户与您的服务进行交互,最好将GUI组件分割成一个单独的Windows应用程序,该应用程序在用户login时运行。然后使用命名pipe道或某种其他forms的IPC在GUI应用程序和您的服务之间build立通信。 这实际上是在Windows Vista中这是可能的唯一方法。

我在这里拍摄盲人,但我经常发现,服务创业公司的长时间延迟是由networkingfunction超时直接或间接造成的,通常在查找帐户SID时尝试与域控制器联系 – 通常经由间接GetMachineAccountSid()是否意识到,因为该函数是由RPC子系统调用的。

有关如何在这种情况下进行debugging的示例,请参阅Mark Russinovich博客上的“stream程启动延迟案例” 。

在OnStart方法的服务类中不要做大的操作,OS期望运行服务的时间短,使用线程启动运行你的方法:

 protected override void OnStart(string[] args) { Thread t = new Thead(new ThreadStart(MethodName)); // egtStart(); } 

如果您在服务中使用以下debugging代码,则可能会出现问题。

 #if(!DEBUG) ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { new EmailService() }; ServiceBase.Run(ServicesToRun); #else //direct call function what you need to run #endif 

为了解决这个问题,当你build立你的windows服务时,请删除#if条件,因为它不能正常工作。

请使用参数debugging模式,而不是如下。

 if (args != null && args.Length > 0) { _isDebug = args[0].ToLower().Contains("debug"); } 

安装该服务的debugging版本,并将debugging器附加到该服务以查看发生了什么。

我想在这里回应mdb的评论。 不要走这条路。 你的服务不应该有一个UI …“没有用户交互”就像服务的定义function。

如果您需要configuration服务,请编写另一个应用程序,用于编辑服务在启动时读取的相同configuration。 但把它作为一个独特的工具 – 当你想启动服务,你启动服务。 当你想configuration它,你运行configuration工具。

现在,如果你需要对服务进行实时监控,那么这有点棘手(当然,我也希望服务)。 现在你正在谈论使用进程间通信和其他令人头痛的问题。

最糟糕的是,如果你需要用户交互,那么你在这里有一个真正的断开,因为服务不与用户交互。

在你的鞋子里,我会退后一步,问为什么这需要一个服务为什么它需要用户交互

这两个要求是非常不相容的,而且会引发警报。

复制发行DLL或从发布模式,而不是debugging模式,并将其粘贴到安装文件夹,它应该工作

我有这个问题,它驱使我疯了两天…如果你的问题类似于我的:

我在我的Windows服务中设置了“用户设置”,所以服务可以自我维护,而无需停止和启动服务。 那么,问题出在“用户设置”,这些设置的configuration文件保存在service-exe文件版本下正在运行windows服务的用户的用户configuration文件下的文件夹中。

由于某种原因,此文件夹已损坏。 我删除了文件夹和服务开始像往常一样愉快地工作回来…

我正在写一个服务,遇到类似的问题。 它工作得很好,然后有一天我开始得到启动错误超时。 它发生在一个版本和debugging版本中,具体取决于发生了什么。 我已经从System.Diagnostics实例化了一个EventLogger,但无论我看到的任何错误都必须在Logger能够写入之前发生。

如果您不知道在哪里查找事件日志,那么在VS中,您可以通过服务器浏览器访问您的计算机。 除了我的服务之外,我开始在其他一些EventLog中进行探究。 在Application – .NETRuntime下,我find了与启动时的错误相关的错误日志。 基本上,在我的服务的构造函数中有一些exception(其中一个是事件日志实例设置中的exception – 这解释了为什么我在服务事件日志中看不到任何日志)。 在以前的版本显然还有其他的错误(这导致我做的更改导致EventLog中的错误设置)。

长话短说 – 超时的原因可能是由于各种exception/错误,但使用运行时事件日志可能只是帮助你弄清楚发生了什么(特别是在一个构build工作,但另一个不工作的情况下)。

希望这可以帮助!

我有这个问题,大概需要一天的时间来解决。 对于我来说,问题是我的代码跳过了“主要内容”,并有效地运行了几行,然后完成。 这导致了我的错误。 它是一个安装Windows服务的C#控制台应用程序,只要它试图用ServiceController(sc.Run())运行它,那么它会给我这个错误。

在我将代码固定到主内容之后,它将运行预期的代码:

ServiceBase.Run(new ServiceHost());

然后它停止显示。

正如很多人已经说过的,错误可能是任何东西,人们提供的解决scheme可能解决或不解决。 如果他们没有解决它(比如释放而不是debugging,将generatePublisherEvidence = false添加到你的configuration等等),那么问题出在你自己的代码上。

试着让你的代码在不使用sc.Run()的情况下运行(例如,让代码运行sc.Run()将会执行)。

当您的程序集中缺less某些引用时,通常会发生此问题,并且通常绑定在运行时失败。

debugging把Thread.Sleep(1000)放在main() 。 并在下一行执行中放置一个断点。

然后启动进程并在启动时将debugging器附加到进程。 按f5到达中断点后。 它会抛出缺lessassembly或参考的例外。

希望这将解决这个错误。

在我的情况下,这个问题是缺less.net framework版本。

我的服务使用

 <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> 

.net Framework版本的服务器是4,所以通过修改4.5到4修正了这个问题:

 <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" /> </startup> 

我也有这个问题。 我通过将login帐户更改为本地系统帐户来使其工作。 在我的项目中,我将它设置为以本地服务帐户运行。 所以,当我安装它,默认情况下,它使用本地服务。 我使用.net 2.0和VS 2005.所以安装.net 1.1 SP1没有帮助。

本地系统帐户和本地服务都不能为我工作,然后我把它设置为networking服务,这工作正常。

就我而言,由于真正的错误,我遇到了这个麻烦。 在调用服务构造函数之前,成员variables的一个静态构造函数失败:

  private static OracleCommand cmd; static SchedTasks() { try { cmd = new OracleCommand("select * from change_notification"); } catch (Exception e) { Log(e.Message); // "The provider is not compatible with the version of Oracle client" } } 

通过添加try-catch块,我发现由于错误的oracle版本而发生exception。 安装正确的数据库解决了问题。

我也面临类似的问题,发现有问题加载程序集。 试图启动服务时,我立即收到此错误。

要快速debugging问题,请尝试使用ProcDump通过命令提示符运行服务可执行文件http://technet.microsoft.com/zh-cn/sysinternals/dd996900 。 它应该提供关于确切的错误的足够的提示。

http://bytes.com/topic/net/answers/637227-1053-error-trying-start-my-net-windows-service帮了我不less。;

将127.0.0.1 crl.microsoft.com添加到“主机”文件解决了我们的问题。

这对我有效。 基本上确保login用户设置为正确的。 但是,这取决于如何设置帐户基础结构。 在我的例子中,它使用AD帐户用户凭据。

在启动菜单search框search“服务” – 在服务中find所需的服务 – 右键点击并selectlogin选项卡 – select“此帐户”,并input所需的内容/凭据 – 像往常一样启动服务

在这里输入图像说明

如果你有一个Windows窗体用于testing,确保启动对象仍然是服务,而不是Windows窗体

我们将Log4Netconfiguration为login到数据库表。 桌子已经变得如此之大,服务正在试图logging消息。

以pipe理员身份打开服务窗口,然后尝试启动服务。这对我有效。

一旦尝试运行你的exe文件。 我有同样的问题,但是当我通过双击exe文件直接运行它,我得到了关于.Net框架版本的消息,因为我发布了一个框架,它没有安装在目标机器上的服务项目。

发布版本不适合我,但是,我查看了我的事件查看器和应用程序日志,发现Windows服务在尝试创build事件日志时正在抛出安全exception。 我通过pipe理访问手动添加事件源来解决这个问题。

我遵循了微软的这个指南:

  • 打开registry编辑器,运行 – > regedit
  • find以下registry子项: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Eventlog \ Application
  • 用鼠标右键单击应用程序子项,指向新build,然后再单击项。
  • 键入您的Windows服务中使用的密钥名称的事件源名称。
  • closuresregistry编辑器

在这里输入图像说明

花了我几个小时,应该看到事件查看器get_AppSettings()

应用程序configuration的变化,导致了这个问题。

我的问题是由于Windows服务configuration中提到的目标框架

 <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6"/> </startup> 

和我试图安装Windows服务的服务器不支持这个.Net版本。

改变这个,我可以解决这个问题。

  1. 在发布模式下构build项目。
  2. 将所有发布文件夹文件复制到源path。
  3. 在pipe理访问中使用命令提示符窗口执行窗口服务。
  4. 切勿从源path中删除文件。

至less这对我有用。