Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法使用.NET 3.5中的ServiceController停止服务_C#_.net_Service_Windows Services_Servicecontroller - Fatal编程技术网

C# 无法使用.NET 3.5中的ServiceController停止服务

C# 无法使用.NET 3.5中的ServiceController停止服务,c#,.net,service,windows-services,servicecontroller,C#,.net,Service,Windows Services,Servicecontroller,我在.NET3.5中工作,在使用ServiceController停止某些服务时遇到问题。我搜索了整个互联网,没有找到解决问题的方法;) 我是这样做的: using (ServiceController service = new ServiceController("Service")) { try { TimeSpan timeout = TimeSpan.FromSeconds(timeoutSeconds); service.Stop()

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

我是这样做的:

using (ServiceController service = new ServiceController("Service")) { try { TimeSpan timeout = TimeSpan.FromSeconds(timeoutSeconds); service.Stop(); service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } 使用(ServiceController服务=新ServiceController(“服务”)) { 尝试 { TimeSpan timeout=TimeSpan.FromSeconds(timeoutSeconds); 服务。停止(); service.WaitForStatus(ServiceControllerStatus.Stopped,超时); } 捕获(例外情况除外) { Console.WriteLine(例如ToString()); } } 我在等我的服务停止。然后我想替换它的库(更新它)。然后抛出异常:

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

我确信我有权访问此路径,因为我以管理员身份运行我的应用程序

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

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

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

谢谢你的帮助

致以最良好的祝愿,
皮特。

好的,我解决了我的问题

首先,我使用
Net Stop
Administrator命令提示符命令
停止
服务
,它工作了,但我开始想为什么。答案是花了很多时间!
ServiceController
实际上已经停止了它,但一些进程仍在使用它

 service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
还可以,因为它确实更改了服务的状态(这只是Windows服务列表中的一个更改),但是礼貌地关闭使用特定服务的所有线程需要一些时间:)


所以,您只需等待,然后再次检查它是否仍在运行。如果是,则使用
进程
类将其杀死。

可以使用
任务管理器
停止代码的原因是它已经有管理员令牌。为了让您的应用程序操作
服务
,您需要模拟或验证您的应用程序是否处于适当的管理员级别。这可以通过
Windows主体程序集
完成。您的另一个选项是启动
进程
,该进程将运行管理员命令提示符命令
Net Stop
,以停止
服务
。然后在完成任务后再次调用
进程
,重新启动。您没有使用任务管理器停止服务,而是将其终止。很大的不同。@Greg我考虑过了,但我也认为如果我们有像ServiceController这样的东西,我可以用它来控制我的服务,但在这种情况下,我必须按照你写的那样做,并使用“net stop”,谢谢你的回答@好吧,那么阻止它和杀死它有什么区别呢?哪些线程仍然使用此服务(或此服务的文件)?杀死它会突然停止它。停止可确保所有组件正确关闭。