2010-02-11 159 views
2

我有一个Windows服务和一个MSI安装程序(安装项目)。安装项目具有用于分别安装和卸载args/install和/ uninstall的自定义操作。安装时自动启动Windows服务

我希望服务在安装后立即启动。我所有的服务都是开始一个过程。当服务停止时,它确实是process.Close();

我曾尝试做

var sc = new ServiceController("MyProcess"); 
sc.Start(); 

的过程开始,但该事件日志消息说该服务已启动不显示。停止时,我得到错误Error stopping process: System.InvalidOperationException: No process is associated with this object.

如果我不使用服务控制器来启动并使用Services.msc,而是在停止时按预期工作。

是否有办法让程序立即启动并让我的启动/停止方法按预期工作?

+1

可能的重复[自动启动Windows服务安装](http://stackoverflow.com/questions/1036713/automatically-start-a-windows-service-on-install) – ChrisF 2010-05-11 12:50:58

回答

0

我最终采取了一种不同的方法,只是获取正在运行的过程,而不是试图坚持之前开始的过程。停止进程然后工作就好了,OnStart/OnStop方法无关紧要,因为我的内部进程正在按照我的需要启动/停止。

1

你不说你正在使用什么操作系统,但我记得去年开发安装程序时遇到了这个问题。我相信这是Windows 7,Server 2003/2008和Vista中的安全限制,因为安装程序无法启动它安装的任何应用程序。如果您将服务设置为自动启动,则应在下次系统重新启动时启动。

+0

这是在Windows 7上。如果你是对的,这是有道理的。 – 2010-02-11 21:47:18

+0

虽然它确实启动服务,但不正确。我的代码位于服务类的OnStart和OnStop方法中。 – 2010-02-11 21:49:09

0

我想你所说的是有两个问题在这里进行。第一个问题是该服务在安装后不会启动。第二个是该服务无法启动该过程。我对吗?

当我通过安装项目安装服务时,我总是从安装程序类的Commit方法启动服务,这样我就知道所有东西都已正确安装。我对此并不十分确定,但在安装完成之前,您可能无法启动服务。它看起来像你的自定义操作设置正确,所以不应该有任何问题与调用的方法(你有提交包括在自定义操作,对吗?)下面是一个从一个提交方法的例子我的项目:

public override void Commit(IDictionary savedState) 
{ 
    base.Commit(savedState); 

    try 
    { 
     var serviceController = new ServiceController("<Insert Service Name>"); 
     serviceController.Start(); 
    } 
    catch 
    { 
     MessageBox.Show(
      "There was an error starting the <Insert Service Name> Service. Please manually start it, or restart the computer."); 
    } 
} 

通过显示消息框给用户,如果出现错误的服务开始,至少将通知用户该服务需要手动启动。在调试安装问题时,您可以在消息框中包含异常,以获取有关正在进行的更多详细信息。

我很好奇 - 您在ServiceProcessInstaller中使用了哪个帐户?此用户是否有权启动该计算机?该流程是否有任何特定的UAC要求?我怀疑访问控制是什么阻止你的过程开始。

+0

我正在使用LocalSystem帐户。使用ServiceController启动服务时,我启动的进程启动,但事件日志中通常会显示一条消息,说明服务已成功启动。我保存流程实例,所以当调用OnStop时,我可以执行'process.Close()',但是流程无效。 – 2010-02-12 15:17:30

+0

我甚至无法立即启动新流程。我昨天工作正常,但我在不同的网络上。也许这是你说的UAC问题。如果是这样,我可以在安装程序中做些什么来使服务能够启动这个显然需要额外权限的进程?我启动的进程是mongod.exe,它是MondoDB进程,所以它至少绑定到一个端口。我试过关闭防火墙,但这没有什么区别。 – 2010-02-12 17:08:41

+0

此外,我有一个尝试/捕捉周围的过程开始,是一个事件记录在捕获。如果这个过程没有开始,为什么它不会失败呢?它必须默默地失败。 – 2010-02-12 17:14:09

相关问题