我使用C#控制台应用程序安装并启动服务。
使用WinAPI安装服务:
try
{
//Open sc manager
IntPtr sc_handle = OpenSCManager(null, null, SC_MANAGER_CREATE_SERVICE);
if (sc_handle.ToInt32() != 0)
{
//Create service
IntPtr sv_handle = CreateService(sc_handle, svcName, svcDispName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, svcPath, null, 0, null, null, null);
//If failed
if (sv_handle.ToInt32() == 0)
{
CloseServiceHandle(sc_handle);
return false;
}
else //If succeeded
{
CloseServiceHandle(sv_handle);
CloseServiceHandle(sc_handle);
return true;
}
}
else
return false;
}
catch (Exception e)
{
throw e;
}
启动服务:
//Start the newly installed service
try
{
System.ServiceProcess.ServiceController newService = GetService(application.StartupName);
//If service is stopped or stopping
if (newService.Status == System.ServiceProcess.ServiceControllerStatus.StopPending ||
newService.Status == System.ServiceProcess.ServiceControllerStatus.Stopped)
{
newService.Start();
newService.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running, TimeSpan.FromMilliseconds(300.0));
}
return true;
}
catch (Exception e)
{
return false;
}
设置服务时,我会安装并启动它。
当我为一个非常简单的服务(除了将其事件记录到文本文件之外什么都不做)这样做时,它在尝试启动服务时第一次失败。
对WaitForStatus的调用失败(超时错误)。
如果我卸载了该服务(sc delete servicename),删除它所记录的文件,并以相同的OR或不同的名称再次安装/启动该服务,每次都可以正常工作。
如果我卸载服务并在注册表中搜索服务名称,则没有结果。
我在3台不同的机器(Windows 8和Windows 7)上尝试过这种故障排除方式。我没有其他机器可以测试,无法重现问题。我甚至在第一次安装/启动服务之前将系统还原到了一个点,它仍然可以正常工作。
有人有任何想法吗?