【问题标题】:Cannot stop the service using ServiceController in .NET 3.5无法在 .NET 3.5 中使用 ServiceController 停止服务
【发布时间】:2013-02-09 00:05:45
【问题描述】:

我在 .NET 3.5 中工作,但在使用 ServiceController 停止某些服务时遇到了问题。我搜索了整个互联网,但没有找到解决问题的方法;)

我是这样做的:

使用(服务控制器服务=新服务控制器(“服务”))
{
    尝试
    {
        TimeSpan 超时 = TimeSpan.FromSeconds(timeoutSeconds);

        服务.停止();
        service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
    }
    捕捉(例外前)
    {
        Console.WriteLine(ex.ToString());
    }
}

我正在等到我的服务停止。然后我想替换它的库(更新它)。并抛出异常:

未授权访问异常 异常详细信息:System.UnauthorizedAccessException:对路径“blablabla”的访问被拒绝。

我确定我可以访问此路径,因为我以管理员身份运行我的应用程序。

有趣的是,当这段代码执行时,该服务从当前服务列表中消失(在任务管理器中)。所以它实际上停止了它,但是一些线程仍然必须使用它,所以我不能移动任何服务的文件。即使我尝试自己移动文件(我转到服务目录并尝试使用鼠标移动其文件)我也做不到。但是当我手动停止服务(任务管理器和“结束任务”)时,我可以对它的文件做任何我想做的事情。那么从 C# 代码(使用 ServiceController)停止它和使用任务管理器停止它有什么区别?

我不知道这是否重要,但我在 Virtual Box 的 Windows Server 2008 上运行此应用程序(和此服务)。 (我需要在其他机器上运行它,然后是我的电脑)。

有什么想法可以解决这个问题吗? ;)

感谢您的帮助。

最好的祝愿, 皮特。

【问题讨论】:

  • 您可以使用Task Manager 停止代码的原因是它已经有一个管理员令牌。为了让您的应用程序能够操纵Service,您需要模拟或验证您的应用程序处于适当的管理员级别。这可以通过Windows Principal Assembly 完成。您的另一种选择是启动Process,它将运行Net Stop 的管理员命令提示符命令以停止Service。然后在完成任务后再次调用Process 重新开始。
  • 你没有用任务管理器停止服务,你杀死了它。大不同。
  • @Greg 我考虑过,但我也认为如果我们有类似 ServiceController 的东西,我将能够用它来控制我的服务,但在这种情况下,我必须按照你写的那样做使用'net stop' 感谢所有的答案!
  • @HansPassant 好的,那么阻止它和杀死它有什么区别?哪些线程仍在使用此服务(或此服务的文件)?
  • 突然杀死它会阻止它。停止可确保所有组件正确关闭。

标签: c# .net service windows-services servicecontroller


【解决方案1】:

好的,我的问题解决了。

首先,我使用Net Stop 中的Administrator Command-Prompt Command 来阻止Service,它有效,但我开始想知道为什么。答案是花了很多时间! ServiceController 实际上停止了它,但一些进程仍在使用它。

 service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);

也工作得很好,因为它立即更改了服务的状态(这只是Windows Services 列表中的一项更改),但是使用某些服务礼貌地关闭所有线程需要一些时间:)

所以您需要做的就是等待,然后再次检查它是否仍在运行。如果是,则使用Process 类将其杀死。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    相关资源
    最近更新 更多