C#查询Windows服务

我一直在使用查询在远程服务器上运行的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语句放在服务控制器中,但它陷入了无限循环。

您正在寻找的信息可在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 

希望这可以帮助,

上面的代码相同。 只需将其添加到Management Class即可

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