如何在 C# mvc 中停止或启动 Windows 服务?

Posted

技术标签:

【中文标题】如何在 C# mvc 中停止或启动 Windows 服务?【英文标题】:How to stop or start Windows Service in C# mvc? 【发布时间】:2016-04-29 10:39:59 【问题描述】:

我试过了 System.ServiceProcess.ServiceController System.Diagnostics.Process;

在我的 Web 表单中控制 Windows 服务。 使用System.ServiceProcess.ServiceController,我收到拒绝访问异常。

System.Diagnostics.Process 我什么也得不到。如何使用我的 Web 表单启动/停止 Windows 服务,知道吗?

【问题讨论】:

要控制服务,您必须以提升的权限运行。默认情况下,Web 应用程序不会这样做。 我怎样才能获得这些权限? 如果我记得是通过将应用程序池标识设置为系统(或计划更好的用户级别)。我 对于所有建议以具有管理权限的用户身份运行应用程序池的人:不要这样做。 【参考方案1】:

以下是要完成的重点:

1 您需要添加 应用程序中的 System.ServiceProcess 引用。这个命名空间 持有ServiceController类来访问窗口服务。

2 你需要在你之前检查窗口服务的状态 明确启动或停止它。

3 默认情况下,IIS 应用程序在 ASP.NET 帐户下运行 没有窗口服务的访问权限。非常非常 解决方案的重要部分是:模仿。你需要 使用用户凭据模拟应用程序/部分代码 具有访问窗口的适当权限和权限 服务。

请参阅来自asp.net 的此博客条目 还有看看这个https://***.com/a/17497084/1641556

【讨论】:

此解决方案需要在您的站点上进行 Windows 身份验证。如果没问题,这是一个不错且安全的解决方案。 现场如何实现windows认证?你能解释一下吗? @AlicanUzun 查看本教程codeproject.com/KB/cs/svcmgr.aspx?display=Print @CodeCaster 我正在搜索 4 小时! @AlicanUzun 您是否尝试将应用程序池身份设置为管理员?【参考方案2】:

Knelis 是正确的,我认为您只需要另一个过程来做到这一点。可能是你自己的windows服务,运行在本地系统下,提供wcf服务来控制windows服务,你的web应用可以调用wcf服务。

【讨论】:

是的,将两者解耦是最好的解决方案。这是安全方面的最佳选择。 根据目标受众,确保将可以启动或停止的服务列入白名单。 @AlicanUzun 这是一个很好的解决方案。此示例演示 WCF 服务教程 msdn.microsoft.com/en-us/library/ms733069%28v=vs.110%29.aspx 并将该教程转换为控制 Windows 服务,然后使用您的 Web 应用程序访问该服务【参考方案3】:

按照以下步骤启动/停止窗口服务:

1) 要访问 windows 服务,您需要在控制器中添加以下命名空间:

using System.ServiceProcess;

如果在添加上述命名空间时出现“找不到命名空间名称‘ServiceController’”的错误,则需要使用“添加引用”进行添加。有关详细信息,请参阅我的博客这里

2) 将以下代码添加到您的控制器:

ServiceController service = new ServiceController("Test Windows Service");
service.Start();

它将启动您的服务。 来源:http://sforsuresh.in/starting-windows-services-c-mvc-4/

【讨论】:

感谢您的回答,但我的问题是使用 System.ServiceProcess 时访问被拒绝异常;和服务控制器。 这不是解决方案,您必须冒充用户。请写下您尝试过的答案,或者您知道它有效

以上是关于如何在 C# mvc 中停止或启动 Windows 服务?的主要内容,如果未能解决你的问题,请参考以下文章

强制 c# windows 服务始终作为系统运行,并且不允许非特权用户停止/启动

是否可以在没有管理员权限的情况下安装、启动和停止 Windows 服务?

如何从C#启动/停止Windows服务

Windows 服务(托管 WCF 服务)在启动时立即停止

C# 定时自动执行程序

如何在 C# 中重新启动任务?或如何重新启动 Thread.Sleep()?