除非使用管理员帐户,否则Windows服务不会启动OnStart

时间:2012-11-27 22:24:17

标签: c# .net service windows-services privileges

服务安装正确,但在尝试通过net start或从服务窗口启动时,它根本无法启动,甚至没有到达OnStart处理程序。

如果我使用管理员帐户,该服务将启动并正常运行。这似乎表明服务中的某些东西需要管理员权限,但这纯粹是一种按需式服务,在请求之前没有任何执行。使用这种类型的服务,我认为至少应该启动,然后在向它发出需要管理员权限的请求时失败?

调试是不可能的,因为我甚至无法启动它,除了指示服务已停止的信息日志之外,事件日志上没有任何内容出现。服务中的代码太多了,无法在此处添加所有内容,但入口点是相当标准的Unity样式服务:

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();
    }
}

出于商业原因,我不能只是使用管理员的用户帐户,所以我很感激有关如何解决此问题的任何建议。

3 个答案:

答案 0 :(得分:2)

确保您的用户帐户具有“作为服务登录”权限。如果没有它,这将无法工作,并且默认情况下它不会对用户开启,尽管它适用于管理员。说明here

答案 1 :(得分:2)

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

答案 2 :(得分:2)

运行Visual Studio调试器并附加到服务,然后您可以单步调试它,看看发生了什么。

您可以在initializecomponent()之前添加此项,并在服务控制面板的“开始参数”文本框中为您的服务添加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 Process Monitor(https://technet.microsoft.com/en-us/sysinternals/bb896645)可以告诉你它正在被清除。