在C#中,如何查询Windows服务器上正在运行的服务列表?

28

我希望查询远程机器上以特定用户身份运行的服务列表,并检查每个服务的状态。我正在构建自定义控制台。

4个回答

46
ServiceController.GetServices("machineName")返回一个包含指定机器的ServiceController对象数组。

这段代码:

namespace AtYourService
{
    using System;
    using System.ServiceProcess;

    class Program
    {
        static void Main(string[] args)
        {
            ServiceController[] services = ServiceController.GetServices();

            foreach (ServiceController service in services)
            {
                Console.WriteLine(
                    "The {0} service is currently {1}.",
                    service.DisplayName,
                    service.Status);
            }

            Console.Read();
        }
    }
}

产生:

The Application Experience service is currently Running.

The Andrea ST Filters Service service is currently Running.

The Application Layer Gateway Service service is currently Stopped.

The Application Information service is currently Running.

etc...

当然,我使用无参版本在我的计算机上获取服务。


24
要使用 ServiceController 方法,我建议查看这个之前的问题中所实现的模拟用户解决方案:.Net 2.0 ServiceController.GetServices() 顺便提一下,以下是使用 C#/WMI 的方法,需要明确指定主机、用户名和密码:
using System.Management;

static void EnumServices(string host, string username, string password)
{
    string ns = @"root\cimv2";
    string query = "select * from Win32_Service";

    ConnectionOptions options = new ConnectionOptions();
    if (!string.IsNullOrEmpty(username))
    {
        options.Username = username;
        options.Password = password;
    }

    ManagementScope scope = 
        new ManagementScope(string.Format(@"\\{0}\{1}", host, ns), options);
    scope.Connect();

    ManagementObjectSearcher searcher = 
        new ManagementObjectSearcher(scope, new ObjectQuery(query));
    ManagementObjectCollection retObjectCollection = searcher.Get();
    foreach (ManagementObject mo in retObjectCollection)
    {
        Console.WriteLine(mo.GetText(TextFormat.Mof));
    }
}

谢谢。所有的回答都帮助我指向了WMI和System.Management。我喜欢这个查询,并使用了这个片段。 再次感谢。 -k2 - kkelly18

5
你可以使用wmi(System.Management)来实现此功能。你也可以使用ServiceController.GetServices()

3
这将检查您系统上的服务名称是否与您在参数中提到的期望服务名称相同。
namespace ServiceName
{
using System;
using System.ServiceProcess;

class Service
{

public static bool IsServiceInstalled(string serviceName)
{

 ServiceController[] services = ServiceController.GetServices();

 foreach (ServiceController service in services)
 {
   if (service.ServiceName == serviceName)
     return true;
 }
 return false;
   }
 }
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接