(重新)从我的c#代码启动Windows服务不工作

本文关键字:Windows 启动 服务 工作 代码 重新 我的 | 更新日期: 2023-09-27 18:05:06

为了更新我自己编写的Windows Service,我编写了一个c#程序来停止服务,复制新的dll,然后重新启动它。

我的第一个方法是:

ServiceController service = new ServiceController(serviceName);
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
// (...) copy the dll files
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running, timeout);   

停止服务工作时,启动方法产生以下错误:

Cannot start service FOVEA Service Debug on computer '.'.   
at System.ServiceProcess.ServiceController.Start(String[] args)    at
System.ServiceProcess.ServiceController.Start()

以管理员身份运行更新程序没有什么区别。

所以我试着通过net start/stop service在命令行中启动/停止服务,它工作得很好,我把我的c#程序改成了以下内容:

Process p = Process.Start("net", "stop '"" + serviceName + "'"");
p.WaitForExit();
p = Process.Start("net", "start '"" + serviceName + "'"");
p.WaitForExit(); 

和之前一样,停止服务有效。然而net start service的调用输出

The service is not responding to the control function
more help is available by typing NET HELPMSG 2186

该服务是为本地登录用户(管理员)安装的,但我不明白为什么net start从命令行而不是从代码中工作。我还尝试了以下操作:

  • 为用户NETWORK SERVICE设置我的更新程序的完全权限
  • 使用p.StartInfo.Verb = "runas"
  • 启动进程
  • p.StartInfo.WorkingDirectory更改为Environment.SystemDirectory
  • p.MachineName更改为Environment.MachineName
  • 让线程在停止服务后休眠5秒

但似乎没有任何影响。

你知道怎么得到我想要的吗?谢谢你的帮助。

(重新)从我的c#代码启动Windows服务不工作

试试:

ServiceController sc = new ServiceController(svr_name);
if (sc.Status != ServiceControllerStatus.Stopped)
{
    sc.Stop();
    sc.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(30));
}