2012-11-27 101 views
2

服务安装正确,但尝试通过net start或从服务窗口启动服务时,服务无法启动,甚至无法访问OnStart处理程序。除非使用管理员帐户,否则Windows服务不会启动OnStart

如果我使用管理员帐户,服务启动并正常工作。这似乎表明服务中的某些内容需要管理员权限,但这纯粹是一种随需应变式服务,在请求之前不会执行任何操作。对于这种类型的服务,我认为至少应该启动,然后在发出请求需要管理员权限的请求时失败。

调试是不可能的,因为我甚至无法启动它,除了信息日志指出服务已停止外,没有任何事件显示在事件日志中。有太多的代码在服务这里要补充这一切,但入口点是一个相当标准的统一式服务:

partial class MyServiceHost : UnityServiceBase 
{ 
    private Bootstrapper _bootstrapper; 

    public MyServiceHost() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
     TextWriter tw = new StreamWriter("ServiceTestLog.txt"); 
     tw.Write("Date: " + DateTime.Now + "\n"); 

     try 
     { 
      base.OnStart(args); 

      _bootstrapper = new Bootstrapper(UnityContainer); 
      _bootstrapper.Run(); 
     } 
     catch (Exception ex) 
     { 
      tw.Write(ex.ToString()); 
     } 

     tw.Close(); 
    } 

    protected override void OnStop() 
    { 
     _bootstrapper.Teardown(); 
     base.OnStop(); 
    } 
} 

出于商业考虑,我不能只让用户帐户它使用的是管理员,所以我” d感谢有关如何解决此问题的任何建议。

+0

请参阅Steve Townsend的答案,但为什么它需要成为一项服务?它做了什么,它不能像正常的分离过程那样运行? –

+0

@CareyGregory这只是我们代码库整个服务导向架构的一小部分。没有包括为什么它必须是服务的所有细节,我只是说我在这件事上没有选择! – peacemaker

+0

运行sysinternals processmonitor(https://technet.microsoft.com/en-us/sysinternals/bb896645)并查看失败情况。它可能会在所需的依赖项上获得“拒绝访问”。 –

回答

2

写入“ServiceTestLog.txt”可能需要本地管理员权限。

+0

这可能是一个次要问题,但请注意,执行甚至不会根据q文本达到'OnStart' –

+0

这取决于OP如何确定它未达到OnStart。 – Maate

+0

我尝试的第一件事就是写出注释写入日志,但它不起作用。不过,我这次再次尝试,实际卸载并重新安装服务,它的工作!多么尴尬,但谢谢你指出这一点,让我再试一次。 – peacemaker

2

确保您的用户帐户具有“作为服务登录”权限。如果没有这个功能,这将无法正常工作,并且它对用户而言并不是默认开启的,尽管它将用于管理员。说明here

+0

作为帐户启用服务登录,但仍然无法正常工作 – peacemaker

+0

不知道这对于托管代码有多好,但ProcessDumper可以在进程退出时生成事后调试转储。它可能会给你提示失败服务退出的提示。逐步添加诊断输出,直到缩小失败的位置,现在和以后都应该有用。 –

+0

感谢史蒂夫,我不知道ProcessDumper将在未来派上用场。 – peacemaker

2

运行Visual Studio Debugger并附加到该服务,然后您可以逐步查看并查看发生了什么。

您可以在initializecomponent()之前添加此项,并在Service Control Panel的“Start parameters”文本框中为您的服务添加WAITFORDEBUGGER。

C#:

foreach (string arg in args) { 
    if (arg == "WAITFORDEBUGGER") { 
     while (!Debugger.IsAttached) { 
      Threading.Thread.Sleep(1000); 
     } 
    } 
} 

VB.Net:

For Each arg As String In args 
    If arg = "WAITFORDEBUGGER" Then 
     While Not Debugger.IsAttached 
      Threading.Thread.Sleep(1000) 
     End While 
    End If 
Next 

然后该服务将等待你火了Visual Studio和附加调试器,此时您可以通过整个跟踪初始化和运行顺序,看看有什么损坏。

如果它从未遇到WAITFORDEBUGGER代码,它可能无法加载依赖关系,在这种情况下,Sysinternals进程监视器(https://technet.microsoft.com/en-us/sysinternals/bb896645)可以告诉你它正在受到什么影响。

相关问题