2011-07-12 148 views
40

我遇到了一个我正在创建的应用程序的问题。我试图通过我的C#应用​​程序启动一个Windows服务。当我点击我的开始按钮时,它看起来像一切都经过,但是当我登录到服务器时,该服务仍然不显示它正在运行。但是,第二次运行它时,我收到一个异常,表示服务的实例已在运行。再次登录到服务器时,服务似乎停止。有没有人见过这个?以编程方式启动Windows服务

这是我的代码。

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()); 
} 

编辑:这是我的一个服务接收到异常:

System.InvalidOperationException:服务逻辑磁盘管理器管理服务没有在计算机发现“”。 ---> System.ComponentModel.Win32Exception:指定的服务不存在作为已安装的服务---内部异常堆栈跟踪结束---

我知道服务存在。我需要在服务前添加什么东西来告诉它要查看哪个服务器?

+1

你确定服务没有卡在起始状态?我记得服务控制面板对于显示(至少是某些windows版本以前)并不是很出色( – Rup

+0

)“当我登录到服务器时”意味着什么 - 您是否试图在不同的机器上使用SCM? – BrokenGlass

+0

是的,我正在从远程服务器运行Web服务。我正在使用具有管理员权限的帐户。我不确定它是否卡住。我的超时时间是否会太短而超时? – Matt

回答

31

如果您显示的代码在不同于应该运行服务的机器上运行(如果情况确实如此,我不清楚您的注释),那么您需要提供机器名称ServiceController构造器。是否有可能成功启动该服务,但不是您认为的机器上?这将符合你描述的症状。

ServiceController service = new ServiceController(serviceName, serverName); 

http://msdn.microsoft.com/en-us/library/aa331793%28v=VS.71%29.aspx

+0

我已编辑以显示使用远程服务器名称的构造函数。 – hatchet

+0

我认为你是正确的,因为现在我得到一个错误,说需要其他权限来执行此操作。 – Matt

+0

如果我作为模拟用户登录到源服务器,我可以拉起目标服务器的服务管理器并远程启动和停止服务。我只是不能从网络应用程序中完成。 – Matt

0

Just try service.Start();没有超时或waitforstatus和挂钩事件看看发生了什么。

+0

看起来一切正常。它只是不显示服务正在运行。 – Matt

14

这里是代码,我有责任停止启动同一台服务器上运行的其他服务窗口服务。

ServiceController controller = new ServiceController(serviceName); 
if (controller.Status==ServiceControllerStatus.Running) 
    controller.Stop(); 

if (controller.Status==ServiceControllerStatus.Stopped) 
    controller.Start(); 
2
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); 
     } 
    } 

不要忘记ServiceProcess添加作为全球化志愿服务青年 使用System.ServiceProcess;

+0

这是否会在问题中的代码中添加任何内容? – Rup

3

这是一个古老的线程,但谷歌让我在这里。即使在成功启动后,我的服务仍会回到停止状态。 如果添加

service.Refresh(); 

它将查询实际的当前状态,而不是从以前的查询所存储的状态。我不知道它为什么会这样,但它确实如此。

P.S .:我增加了一分钟时间,仍然得到一个服务停止响应没有刷新。

相关问题