我最近继承几个作为Windows服务运行的应用程序,并且我与他们都提供了一个图形用户界面(从系统托盘上下文菜单访问)有问题。
为什么我们需要一个图形用户界面的Windows服务的原因是为了能够重新配置,而不诉诸停止/重新启动的Windows服务(S)的行为。
我的代码工作在调试模式很好,我也得到上下文菜单上来,一切行为正确等。
当我通过安装服务“installutil”使用命名的帐户(即没有本地系统账户),该服务运行良好,但不显示在系统托盘中的图标(我知道这是正常的行为,因为我不知道有“交互与桌面”选项)。
这里的问题是,虽然 - 当我选择了“LocalSystemAccount”选项,并选中“交互与桌面”选项,该服务需要年龄启动没有明显的理由,我只是不断收到
无法启动本地计算机上...服务。
错误1053:服务没有及时启动或控制请求。
顺便说一句,我从默认30秒通过注册表破解(见增加了窗口服务超时2分钟http://support.microsoft.com/kb/824344 ,在第3节中搜索TimeoutPeriod),但该服务启动后,仍超时。
我的第一个问题是 - 为什么会在“本地系统账户”登陆时间比当服务日志SOOOOO更长的时间与非LocalSystemAccount,导致Windows服务超时? 的可能的区别是什么这两者之间造成在这样不同的行为启动?
第二 - 退后一步,所有我试图实现,只是一个窗口服务,提供用于配置的GUI - 我会很乐意使用非本地系统帐户(名为用户/密码)运行,如果我能得到与桌面交互的服务(即,具有可从系统托盘上下文菜单)。 这是可能的,如果是的话怎么办?
对上述问题的任何指针将不胜感激!
Answer 1:
战斗此消息天后,一个朋友告诉我,你必须使用发布版本。 当我InstallUtil调试版本,它提供了此消息。 发布版本开始罚款。
Answer 2:
如果继续下跌的努力使您的服务与用户的桌面直接交互的路上,你会失去:即使在最好的情况下(即“Vista之前”),这是非常棘手。
视窗内部管理几个窗口站 ,每一个都有自己的桌面。 分配给指定帐户下运行的服务的窗口站是从登录的交互式用户的窗口站完全不同。 交叉窗口站访问一直是令人难以接受的,因为它是一个安全风险,但而以前的Windows版本允许一些例外,这些已经基本消除在Vista和更高版本的操作系统。
最可能的原因为您服务是挂在启动,是因为它试图用一个不存在的桌面交互(或假定浏览器是系统的用户会话,这也并非如此内运行),或者从一个不可见的桌面等待输入。
针对这些问题的可靠的解决办法是消除您服务的所有用户界面代码,并将其移动到交互式用户会话(可执行文件可以使用全球启动组启动,例如)中运行一个独立的可执行文件。
你的UI代码和服务之间的通信可以使用任何RPC机制实现:命名管道工作,特别用于这一目的。 如果您的通讯需求的最小化,使用应用程序定义的服务控制管理器的命令也可能做的伎俩。
这将需要一些努力来实现UI和服务代码之间的这种分离:但是,这是唯一的办法把事情可靠地工作,而且会有助于你在未来。
附录2010年4月:由于这个问题仍然很受欢迎,这里的修复,导致另一种常见的情形的方式“服务没有响应......”的错误,涉及.NET服务,不要试图像与桌面交互的任何有趣的东西,但使用验证码签名的组件: 在装载时关闭,以便在验证码签名的验证创建出版商证据 ,通过添加以下内容到你的.exe.config文件与:
<configuration>
<runtime>
<generatePublisherEvidence enabled="false"/>
</runtime>
</configuration>
出版商的证据是一个很少使用的代码访问安全(CAS)功能:仅在您的服务实际上依赖于PublisherMembershipCondition将禁用它引起的问题不太可能发生。 在其他情况下,就会使永久或间歇性启动故障消失,不再要求运行时做昂贵的检查证书(包括吊销列表查找)。
Answer 3:
我面临着因为上运行我的服务箱丢失的框架这一问题。 这个盒子有.NET 4.0和服务是写在.NET 4.5之上。
我装在盒子下面的下载,重新启动,该服务启动罚款: http://www.microsoft.com/en-us/download/details.aspx?id=30653
Answer 4:
要调试服务的启动,添加以下到顶部OnStart()
服务的方法:
while(!System.Diagnostics.Debugger.IsAttached) Thread.Sleep(100);
这将停止该服务,直到您手动调试使用附加Visual Studio调试器 - >附加到进程...
注:在一般情况下,如果你需要一个用户与您的服务进行交互,这是更好的GUI组件分成运行,当用户登录一个单独的Windows应用程序,然后你使用类似命名管道或IPC的一些其他形式。建立GUI应用程序和服务之间的通信。 这是事实,这是可能在Windows Vista中的唯一途径。
Answer 5:
我在这里盲目射击,但是我经常发现,在服务初创公司长期拖延直接或间接地通过网络功能超时造成的,attemting联系域控制器时常常仰望帐户SID时 - 这恰好经常间接地通过GetMachineAccountSid()
你是否意识到这一点,因为该功能是由RPC子系统调用。
有关如何在这种情况下调试示例,请参阅该进程启动延迟的情况马克Russinovich的博客。
Answer 6:
在OnStart方法中的服务类不做巨大的操作,OS期望的时间来运行服务,使用线程启动运行你的方法很短量:
protected override void OnStart(string[] args)
{
Thread t = new Thead(new ThreadStart(MethodName)); // e.g.
t.Start();
}
Answer 7:
如果你在你的服务为使用如下调试代码可能出现问题。
#if(!DEBUG)
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new EmailService()
};
ServiceBase.Run(ServicesToRun);
#else
//direct call function what you need to run
#endif
为了解决这个问题,当你建立你的Windows服务中删除的#if条件,因为它没有工作,因为它是。
请使用参数调试模式,而不是下面。
if (args != null && args.Length > 0)
{
_isDebug = args[0].ToLower().Contains("debug");
}
Answer 8:
我跑与服务我正在写一个类似的问题。 它工作得很好,然后有一天,我开始变得对启动错误超时。 这事发生在一个和/或发布和调试取决于发生了什么事情。 我已经从实例化一个System.Diagnostics程序事件记录,但无论错误我所看到的一定是发生了记录器能够写之前...
如果你不知道哪里来查找事件日志时,在VS你可以到你的机器的服务器资源管理器下。 我开始在一些除了那些为我服务的其他事件日志时的闲逛。 在应用程序 - .NETRuntime我发现了错误日志有关在启动时的错误。 基本上,在我服务的构造有些例外(一个竟然是在EventLog实例设置一个例外 - 这解释了为什么我看不到我的服务事件日志的任何日志)。 在以前的版本显然曾有过其他错误(这造成了我,使导致事件日志错误的更改设置)。
长话短说 - 在超时的原因可能是由于各种异常/错误,但使用的运行事件日志时可能只是帮助你弄清楚是怎么回事(尤其是在情况下,其中一个生成的作品,但另一个不)。
希望这可以帮助!
Answer 9:
在我的情况下,问题是缺少版本.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>
Answer 10:
安装服务的调试版本和调试器附加到服务,看看发生了什么。
Answer 11:
我想在这里呼应MDB的意见。 不要走这条路。 您的服务是不应该有一个用户界面...“无需用户交互”,就像是一个服务的definining功能。
如果您需要配置您的服务,写编辑该服务在启动时读取相同的配置另一个应用程序。 但要成为一个独特的工具 - 当你想启动该服务,您启动该服务。 当您想配置,您运行配置工具。
现在,如果你需要的服务的实时监控,那么这是一个有点麻烦(当然是我一直希望与服务)。 现在,你在谈论不必使用进程间通信和其他头痛。
最糟糕的是,如果你需要用户交互,那么你有一个真正的脱节在这里,因为服务不与用户交互。
在你的鞋我会退后一步,问为什么这需要一个服务 ? 为什么它需要用户交互 ?
这两个要求是相当不兼容的,这应该发出警报。
Answer 12:
复制释放DLL或得到释放模式,而不是调试模式下的dll并粘贴到安装文件夹,,它应该工作
Answer 13:
我有这个问题,它驱使我坚果两天......如果类似地雷您的问题:
我有设置“用户设置”在我的Windows服务,所以服务可以做到自我维护,无需停止和启动该服务。 那么,问题出在“用户设置”,在这些设置的配置文件是谁是服务的exe文件版本下运行的Windows服务的用户的用户配置文件下保存一个文件夹中。
此文件夹由于某种原因被损坏。 我删除的文件夹和服务的开工再次愉快地像往常一样...
Answer 14:
我有这个问题,花了大约一天的时间来修复。 对我来说,问题是,我的代码跳过了“主要内容”,有效地跑了几行,然后结束。 而这造成的错误我。 这是一个C#控制台应用程序,它会安装一个Windows服务,只要它试图与ServiceController的运行(sc.Run()),那么它将给这个错误我。
之后,我固定的代码去的主要内容,它会运行预期的代码:
ServiceBase.Run(new ServiceHost());
然后,它就不来了。
由于很多人已经说过,错误可以是任何东西,而人们提供解决方案,可能会或可能不会解决这个问题。 如果他们不解决这个问题(如发布,而不是调试,加入generatePublisherEvidence =假入你的配置,等等),那么很有可能,这个问题是用自己的代码。
试图让你的代码,而无需使用sc.Run运行()(即作出这样的sc.Run()将执行的代码运行)。
Answer 15:
通常,当有一定的参考缺少的组件,通常绑定失败在运行时会出现此问题。
调试放Thread.Sleep(1000)
中main()
并把一个破发点中执行的下一行。
然后启动过程和调试器附加到该进程正在启动一段时间。 按F5它击中了破发点之后。 它会抛出丢失的组装或引用除外。
希望这将解决此错误。
Answer 16:
一旦尝试运行exe文件。 我有同样的问题,但是当我跑它通过在exe文件双击直接的,我有一个关于.NET Framework版本的消息,因为我被释放与它没有目标机器上安装了框架服务项目。
Answer 17:
添加127.0.0.1 crl.microsoft.com的“hosts”文件解决了我们的问题。
Answer 18:
我花了时间,应该看到事件查看器get_AppSettings()。
在应用程序配置的变化,导致的问题。
Answer 19:
我的问题是由于在目标窗口服务配置提及框架是
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6"/>
</startup>
和我的服务器中,我试图安装Windows服务不支持此.NET版本。
改变这,我能解决这个问题。
Answer 20:
我也有这个问题。 我把它通过改变登录账户本地系统账户工作。 在项目中,我有它设置为本地服务帐户运行。 所以,当我安装了它,默认情况下它使用本地服务。 我使用.NET 2.0和VS 2005。所以在安装.NET 1.1 SP1不会有帮助。
Answer 21:
本地系统帐户和本地服务将不适合我,然后我将其设置为网络服务,这工作得很好。
Answer 22:
就我而言,我有这个麻烦,由于是真正的错误。 该服务的构造函数被调用之前,成员变量的一个静态构造函数是失败的:
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版本存在的。 安装正确的数据库解决了这个问题。
Answer 23:
我也面临类似的问题,发现有问题装载组件。 我试图启动服务时,立即收到此错误。
要快速调试问题,请尝试使用通过命令ProcDump提示符下运行服务的可执行http://technet.microsoft.com/en-us/sysinternals/dd996900 。 它应提供有关确切的错误足够的暗示。
http://bytes.com/topic/net/answers/637227-1053-error-trying-start-my-net-windows-service帮了我不少。
Answer 24:
这为我工作。 基本上确保用户登录被设置为正确的。 但是这取决于该账户基础设施的设置。 在我的例子它使用AD帐户的用户凭据。
在开始菜单的搜索框搜索“服务” - 在服务找到所需要的服务 - 右单击并选择登录选项卡 - 选择“此帐户”并输入所需的内容/凭证-ok,并启动服务照常
Answer 25:
如果您有用于测试Windows窗体,确保启动对象仍然是服务,而不是Windows窗体
Answer 26:
我们log4net的配置为登录到数据库表。 该表已经过于庞大,服务是超时尝试登录的消息。
Answer 27:
打开服务窗口以管理员身份,然后尝试启动service.That为我工作。
Answer 28:
发行版本并没有为我工作,但是,我通过我的事件查看器和应用程序日志看,只见那Windows服务被扔一个安全异常,当它试图创建一个事件日志。 余通过与管理访问手动添加事件源固定这一点。
我跟着微软本指南:
- 打开注册表编辑器,运行 - >注册表编辑器
- 找到以下注册表子项:HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \服务\事件日志\应用程序
- 右键单击应用程序子项,指向新建,然后单击项。
- 在你的Windows服务所使用的键名类型的事件源名称。
- 关闭注册表编辑器。
Answer 29:
在我的情况下,它是在AD 用户帐户权限。 正确设置它后,它可以完美运行。
Answer 30:
我有这个类似的问题,停止我也跟着
- 把Debugger.Launch()在windows服务构造
- 步步紧跟,看看它被卡住
我的问题是不是由于任何错误。 我在路上,有一个BlockingCollection.GetConsumingEnumerable()。 这引起了窗口服务等。
文章来源: Error 1053: the service did not respond to the start or control request in a timely fashion