C#以编程方式启动Windows服务
我正在创build一个应用程序的问题。 我试图通过我的C#应用程序启动一个Windows服务。 当我点击我的开始button,它看起来像一切都经过,但是当我login到服务器,该服务仍然不显示它正在运行。 但是,第二次运行它,我得到一个exception,说服务的实例已经运行。 再次login到服务器时,服务似乎停止。 有没有人见过这个?
这是我的代码。
try { while (reader.Read()) { int timeoutMilliseconds = 1000; string serviceName = reader["ServiceName"].ToString(); string permission = reader["Permission"].ToString(); if (permission == "E") { lblServStartSuccess.Visible = true; ServiceController service = new ServiceController(serviceName); TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); service.Start(); service.WaitForStatus(ServiceControllerStatus.Running, timeout); } else { lblServErrorStart.Visible = true; } } } catch (Exception ex) { Response.Write(ex.ToString()); }
编辑:这是我收到的一个服务的exception:
System.InvalidOperationException:在计算机'。'上未find服务逻辑磁盘pipe理器pipe理服务。 —> System.ComponentModel.Win32Exception:指定的服务不作为已安装的服务存在—内部exception堆栈跟踪结束—
我知道服务存在。 我需要在服务前添加什么东西来告诉它要查看哪个服务器?
如果你显示的代码是在不同的机器上执行的,那么你需要在ServiceController构造器中提供机器名。 是否有可能成功启动服务,但不是在您认为的机器上? 这将符合你描述的症状。
ServiceController service = new ServiceController(serviceName, serverName);
http://msdn.microsoft.com/en-us/library/aa331793%28v=VS.71%29.aspx
这里是我在一个窗口服务负责停止启动运行在同一台服务器上的其他服务的代码。
ServiceController controller = new ServiceController(serviceName); if (controller.Status==ServiceControllerStatus.Running) controller.Stop(); if (controller.Status==ServiceControllerStatus.Stopped) controller.Start();
这是一个古老的线程,但谷歌让我在这里。 我的服务,即使成功启动后,仍然会回到停止状态。 如果你添加
service.Refresh();
它将查询实际的当前状态而不是先前查询的存储状态。 我不知道它为什么这样工作,但它确实如此。
PS:我加了一分钟时间,仍然得到了一个服务停止响应没有刷新。
public static void StartService(string serviceName, int timeoutMilliseconds) { ServiceController service = new ServiceController(serviceName); try { int millisec1 = 0; TimeSpan timeout; // count the rest of the timeout int millisec2 = Environment.TickCount; timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec1)); service.Start(); service.WaitForStatus(ServiceControllerStatus.Running, timeout); } catch (Exception e) { Trace.WriteLine(e.Message); } } public static void StopService(string serviceName, int timeoutMilliseconds) { ServiceController service = new ServiceController(serviceName); try { int millisec1 = 0; TimeSpan timeout; if (service.Status == ServiceControllerStatus.Running) { millisec1 = Environment.TickCount; timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); service.Stop(); service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); } } catch (Exception e) { Trace.WriteLine(e.Message); } } public static void RestartService(string serviceName, int timeoutMilliseconds) { ServiceController service = new ServiceController(serviceName); try { int millisec1 = 0; TimeSpan timeout; if (service.Status == ServiceControllerStatus.Running) { millisec1 = Environment.TickCount; timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); service.Stop(); service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); } // count the rest of the timeout int millisec2 = Environment.TickCount; timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2 - millisec1)); service.Start(); service.WaitForStatus(ServiceControllerStatus.Running, timeout); } catch (Exception e) { Trace.WriteLine(e.Message); } }
不要忘记使用System.ServiceProcess添加ServiceProcess作为参考;
试试service.Start(); 没有超时或waitforstatus和挂钩事件,看看发生了什么。