65.9K
CodeProject 正在变化。 阅读更多。
Home

命令行Windows服务管理器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.69/5 (28投票s)

2003年6月1日

3分钟阅读

viewsIcon

245162

downloadIcon

8571

如何在本地或远程计算机上操作 Windows 服务。

引言

.NET Framework 提供了对服务控制管理器的轻松访问,用于操作 Windows 服务。在本文中,我将向您展示我使用这些功能开发的命令行服务管理器工具。

背景

关于管理 Windows 服务的主题在 MSDN 上有介绍,网址为 监视 Windows 服务。 CodeProject 的 Agus Kurniawan 的文章 Windows 服务管理 中也讨论了这个问题。

我的版本与 Agus 的版本在以下方面有所不同

  1. Agus 提供了一个 UI 解决方案,类似于服务控制面板,而我的是使用命令行。
  2. Agus 涵盖了服务管理的基础知识,包括启动和停止服务,而我的版本试图涵盖启动、停止、暂停、继续和重启服务等领域。
  3. 我的版本还试图解决管理 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 似乎没有提供这样的功能。

参考文献

历史

  • 06/24/2003
    • 文档已修改。
  • 05/24/2003
    • 文档已编写。
© . All rights reserved.