命令行Windows服务管理器






4.69/5 (28投票s)
2003年6月1日
3分钟阅读

245162

8571
如何在本地或远程计算机上操作 Windows 服务。
引言
.NET Framework 提供了对服务控制管理器的轻松访问,用于操作 Windows 服务。在本文中,我将向您展示我使用这些功能开发的命令行服务管理器工具。
背景
关于管理 Windows 服务的主题在 MSDN 上有介绍,网址为 监视 Windows 服务。 CodeProject 的 Agus Kurniawan 的文章 Windows 服务管理 中也讨论了这个问题。
我的版本与 Agus 的版本在以下方面有所不同
- Agus 提供了一个 UI 解决方案,类似于服务控制面板,而我的是使用命令行。
- Agus 涵盖了服务管理的基础知识,包括启动和停止服务,而我的版本试图涵盖启动、停止、暂停、继续和重启服务等领域。
- 我的版本还试图解决管理 Windows 服务时的超时和模拟问题。
Windows 服务管理基础知识
在 .NET 中,Windows 服务管理是通过 System.ServiceProcess.ServiceController
实现的。以下代码演示了如何列出机器 srv2 上的所有服务
using System.ServiceProcess;
public class SvcMgr {
public static void Main( string[] args ) {
ServiceController[] services =
ServiceController.GetServices( "srv2" );
foreach( ServiceController service in services ) {
Console.WriteLine( string.Format( "{0} [ {1} ]",
service.ServiceName, service.Status.ToString() ) );
}
}
}
如何处理超时
超时是通过调用服务控制器上的 WaitForStatus
方法来处理的。以下代码演示了如何使用 10 秒超时在 srv2 上启动 "IISADMIN" 服务
//...
ServiceController service =
new ServiceController( "IISADMIN", "srv2" );
service.Start();
TimeSpan t = TimeSpan.FromSeconds( "10" );
service.WaitForStatus(
ServiceControllerStatus.Running, t );
//...
发生超时时,将抛出 System.ServiceProcess.TimeoutException
。我开发的命令行工具通过以下方式处理这种情况
如何在管理服务时处理模拟
您用于管理 Windows 服务的帐户需要有权访问目标计算机上的服务控制管理器;否则,您将收到一个包装在 System.SystemException
中的 System.InvalidOperationException
,指出“无法在计算机 'srv3' 上打开服务控制管理器。此操作可能需要其他权限。”
注意:此异常表示无法访问目标计算机上的服务控制管理器。 这可能意味着您使用的当前帐户没有足够的权限,或者只是计算机处于脱机状态。
这就是模拟发挥作用的地方。通过模拟具有访问服务控制管理器权限的其他 Windows 登录,我们可以继续操作,而无需以其他用户身份登录。请参阅此命令行服务管理器中模拟的工作方式
注意:您尝试模拟的帐户必须同时位于本地系统和目标计算机中,否则程序将不知道要模拟谁。要查看在此工具中如何实现模拟,请参阅源代码中的文件 SvcMgr.cs。
有关什么是模拟以及模拟如何工作的更多信息,请参阅 MSDN 上的 在 ASP.NET 应用程序中实现模拟。
整合所有内容
此命令行服务管理器实用程序将上述所有主题放在一起,并且是管理本地或远程计算机上的 Windows 服务的有用工具。
缺失的功能
此命令行工具没有更改服务的默认启动类型的功能。 如果有人有兴趣进一步研究,我建议朝这个方向深入研究,尽管 ServiceController
似乎没有提供这样的功能。
参考文献
- 监视 Windows 服务,MSDN。
- 在 ASP.NET 应用程序中实现模拟,MSDN。
- Windows 服务管理,Agus Kurniawan。
历史
- 06/24/2003
- 文档已修改。
- 05/24/2003
- 文档已编写。