服务安装正确,但在尝试通过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();
}
}
出于商业原因,我不能只是使用管理员的用户帐户,所以我很感激有关如何解决此问题的任何建议。
答案 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)可以告诉你它正在被清除。