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