(重新)从我的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秒
但似乎没有任何影响。
你知道怎么得到我想要的吗?谢谢你的帮助。
试试:
ServiceController sc = new ServiceController(svr_name);
if (sc.Status != ServiceControllerStatus.Stopped)
{
sc.Stop();
sc.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(30));
}