3

该服务安装正确,但是当尝试通过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();
    }
}

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

4

3 回答 3

2

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

于 2012-11-27T22:26:48.743 回答
2

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

于 2012-11-27T22:30:57.573 回答
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 ) 可以告诉您它正在处理什么。

于 2016-07-28T14:33:12.573 回答