首页 > 解决方案 > 将 Windows 服务作为依赖项添加到 .Net 应用程序

问题描述

Windows 服务可以指定它依赖于另一个第二服务。当系统将尝试启动(第一个)服务时,它会看到它依赖于第二个并首先启动它(第二个)。

可以为应用程序做同样的事情吗?我希望系统在我的应用程序启动时启动某个服务(如果它尚未启动)。

我不能只从我的应用程序调用它,因为我的应用程序在没有管理员权限的情况下运行,而服务作为本地系统运行。该服务已安装在计算机上。

(我知道我可以让系统自动启动服务。不幸的是,.net Services存在问题。它们只能通过延迟启动可靠地启动,并且我的应用程序需要立即可用。)

标签: c#.netwindows-services

解决方案


当您的应用启动时,只需检查服务是否已启动

服务控制器类

表示 Windows 服务,并允许您连接到正在运行或已停止的服务、操作它或获取有关它的信息。

一个完全未经测试的例子

// Check whether the service is started.
ServiceController sc  = new ServiceController();
sc.ServiceName = "MyAwesomeService";
Console.WriteLine("The MyAwesomeService status is currently set to {0}", 
                   sc.Status.ToString());

if (sc.Status == ServiceControllerStatus.Stopped)
{
   // Start the service if the current status is stopped.
   Console.WriteLine("Starting MyAwesomeService...");
   try 
   {
      // Start the service, and wait until its status is "Running".
      sc.Start();
      sc.WaitForStatus(ServiceControllerStatus.Running);

      // Display the current service status.
      Console.WriteLine("The MyAwesomeService is now set to {0}.", 
                         sc.Status.ToString());
   }
   catch (InvalidOperationException)
   {
      Console.WriteLine("Could not start the MyAwesomeService.");
   }
}

更新

ServiceController 将使用当前线程的主体来进行注册表和服务控制管理器调用,如果要操作服务,您必须确保将其设置为管理员用户。

您可以模拟用户,或添加更多细粒度权限以让您的使用启动和停止它,或强制您的应用以管理员权限启动

授予用户启动/停止一项服务的权限

WindowsIdentity.Impersonate 方法


推荐阅读