C#查询Windows服务

4
我一直在使用一个应用程序,查询远程服务器上运行的Windows服务,并将机器名称、服务名称和状态写入数据库。
我想尝试捕获启动类型(自动、手动、禁用),但是我的 Service Controller 没有任何启动类型选项,所以我开始查看使用 Management Class。这个类似乎具备我需要的一切,但我不知道如何针对我的远程服务器使用它。对于 Service Controller,我正在执行以下操作:
ServiceController[] services = ServiceController.GetServices(serverIP);

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

我在管理课上尝试了这个:

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");
}

当然它并没有起作用。有人知道我如何使用管理类获取远程计算机的服务吗?或者是否有其他方法使用服务控制器来获取启动类型?

我还尝试将它们两个结合起来,将管理类foreach语句放在服务控制器中,但它陷入了无限循环。


我认为通过这样做我已经搞定了:(@ "\" + serverIP + "\root\cimv2:Win32_Service")。我将继续测试,因为现在我找不到服务名称的属性。 - Matt
你的修复很有道理;你总是将远程计算机称为 \computername,而没有 @ 符号的 C# 会转义单个反斜杠。 - Andy
如果有人想知道Service Name的属性,那就是Name。 - Matt
2个回答

1

您所需要的信息可在 WMI 中找到。

用 PowerShell 撰写整个程序会比使用纯 C# 转写简单得多。C#(或 C++、VBScript)中的 WMI 代码很快就会变得非常混乱。此示例演示了从计算机列表获取数据的方法。要在 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

希望这可以帮到您,

谢谢您的回复。如果我从数据库表中提取我的服务器怎么办?我已经创建了一个SQL读取器,可以提取服务器IP。抱歉,我在示例中遗漏了这一点。 - Matt
然еҗҺдҪ еҸӘйңҖиҰҒд»ҺйӮЈдёӘж•°жҚ®еә“дёӯеЎ«е……$computerListгҖӮеңЁ.NETдёӯпјҢSqlClientзұ»еә”иҜҘжҳҜдҪ иҰҒжүҫзҡ„гҖӮдҪ еҸҜд»ҘдҪҝз”ЁNew-ObjectжқҘеҲӣе»әе®ғпјҲдёҖдәӣе…ідәҺPowerShell + SQLзҡ„зҪ‘з»ңжҗңзҙўе°ҶдјҡжҢҮеј•дҪ жӯЈзЎ®зҡ„ж–№еҗ‘пјүгҖӮ - Start-Automating

1
上面的代码是可以工作的。只需要将这个添加到管理类即可。
(@"\\" + serverIP + "\\root\\cimv2:Win32_Service")

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