C#查询Windows服务

时间:2011-07-15 18:40:52

标签: c# windows-services servicecontroller

我一直在使用查询在远程服务器上运行的Windows服务的应用程序,并将计算机名称,服务名称和状态写入数据库。

但是,我想尝试捕获启动类型(自动,手动,禁用)。我使用的服务控制器没有启动类型的任何选项,因此我开始考虑使用管理类。这个类看起来像我有我需要的一切,但我不知道如何使用它对我的遥控器服务器。对于服务控制器,我这样做:

ServiceController[] services = ServiceController.GetServices(serverIP);

foreach (ServiceController service in services)
{
   var machine = service.MachineName;
   var displayName = service.DisplayName;
   var status = service.Status;
}

我为Management类尝试了这个:

ManagementClass class1 = new ManagementClass(serverIP + "\\" + "Win32_Service");

foreach (ManagementObject ob in class1.GetInstances())
{
   var machine = serverIP;
   var displayName = ob.GetPropertyValue("Description");
   var name = ob.GetPropertyValue("PathName");
   var startMode = ob.GetPropertyValue("StartMode");
   var status = ob.GetPropertyValue("State");
}

但当然它不起作用。任何人都知道如何使用管理类从远程计算机获取服务?或者是否有另一种方法使用服务控制器来获取启动类型?

我还尝试将它们组合在一起,并将Management Class foreach语句放在服务控制器中,但它陷入了无限循环。

2 个答案:

答案 0 :(得分:1)

您正在寻找的信息可在WMI中找到。

在PowerShell中编写这一切比在Pure C#中编写更容易。 WMI代码在C#(或C ++,或VBScript)中变得非常混乱,非常快。此代码段演示了如何从计算机列表中获取数据。要嵌入C#,只需使用System.Management.Automation,然后添加PowerShell.Create()。AddScript(...)。Invoke()

$computerList = "a","b","c"
Get-WmiObject -computerName $computerList -asjob
    | Wait-job
    | receive-job
    | Select-Object DisplayName, Description, StartMode, State

希望这有帮助,

答案 1 :(得分:0)

上面的代码相同。只需将其添加到管理类

即可
(@"\\" + serverIP + "\\root\\cimv2:Win32_Service")