【问题标题】:Get Windows service dependencies using C#使用 C# 获取 Windows 服务依赖项
【发布时间】:2012-06-05 20:41:52
【问题描述】:

我可以使用 PowerShell 相当轻松地做到这一点,但我正在寻找一种 C# 方法来做到这一点。使用 PS,我可以使用 Get-Service 遍历集合并检查其中称为 DependentServices 和 RequiredServices 的集合,以获取给定服务的依赖和必需服务的列表。

我已经使用查询“Select * from Win32_Service”查看了 WMI 模型,但这会返回一个 Win32_Service 对象的集合,这些对象似乎没有我感兴趣的集合。我觉得我错过了这里有东西。我环顾四周并尝试了各种搜索,但我没有找到以 C# 为中心的方法。

我想查询给定的服务并取回上面提到的集合(DependentServices 和 RequiredServices)。对不起,如果我错过了明显的,但我真的无法找到相关的主题。

【问题讨论】:

  • 我发现一个特定的 Windows 服务有一个奇怪的行为,我觉得值得分享。我的笔记本电脑上的 NetMsmqActivator 服务(已禁用)在 services.msc 接口中显示没有服务依赖关系。但是,当使用 ServiceController 类获取 ServicesDependedOn 集合时,您会在该集合中获得 2 个项目,当您尝试访问它们的属性时会引发 InvalidOperationException。很奇怪,但值得一提。我不知道修复会是什么,所以,现在,我正在吃异常。
  • 我发现的另一个有趣且可能令人沮丧的异常是在我笔记本电脑上的联想“ThinkVantage System Update”包中。此安装似乎已损坏,并在迭代集合时会导致问题。例如,我不知道如果没有为 MSI 设置制造商属性,安装是否会成功,但 ThinkVantage System Update 似乎就是这样做的。仍在充实这一点,但我已删除并重新安装了电视系统更新包,结果相同。

标签: c# windows-services wmi


【解决方案1】:

您可以使用ServiceController 类:

StringBuilder sb = new System.Text.StringBuilder();
foreach (var svc in System.ServiceProcess.ServiceController.GetServices())
{
    sb.AppendLine("============================");
    sb.AppendLine(svc.DisplayName);
    foreach (var dep in svc.DependentServices)
    {
        sb.AppendFormat("\t{0}", dep.DisplayName);
        sb.AppendLine();
    }
}

MessageBox.Show(sb.ToString());

【讨论】:

    【解决方案2】:

    您可以使用Win32_DependentService WMI 类和Associators of 语句来检索相关服务。

    试试这个示例

    using System;
    using System.Collections.Generic;
    using System.Management;
    using System.Text;
    
    namespace GetWMI_Info
    {
        class Program
        {
    
            static void Main(string[] args)
            {
                try
                {
                    string ComputerName = "localhost";
                    ManagementScope Scope;                   
                    Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), null);
    
                    Scope.Connect();
                    ObjectQuery Query = new ObjectQuery("Associators of {Win32_Service.Name='NetMan'} Where AssocClass=Win32_DependentService ResultClass=Win32_Service");
                    ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Scope, Query);
    
                    foreach (ManagementObject WmiObject in Searcher.Get())
                    {
                        Console.WriteLine("{0,-35} {1,-40}","Name",WmiObject["Name"]);// String
    
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(String.Format("Exception {0} Trace {1}",e.Message,e.StackTrace));
                }
                Console.WriteLine("Press Enter to exit");
                Console.Read();
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用此属性 - http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.dependentservices.aspx

      ServiceController sc =  new ServiceController("Event Log");
               ServiceController[] scServices = sc.DependentServices;
      
               // Display the list of services dependent on the Event Log service.
               if (scServices.Length == 0)
               {
                  Console.WriteLine("There are no services dependent on {0}", 
                                     sc.ServiceName);
               }
               else 
               {
                  Console.WriteLine("Services dependent on {0}:",
                                     sc.ServiceName);
      
                  foreach (ServiceController scTemp in scServices)
                  {
                     Console.WriteLine(" {0}", scTemp.DisplayName);
                  }
               }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-06
        • 2011-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多