C# 查询 Windows 服务

标签 c# windows-services servicecontroller

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

但是,我也想 try catch 启动类型(自动、手动、禁用)。我使用的是没有任何启动类型选项的服务 Controller ,所以我开始考虑使用管理类。这个类看起来有我需要的一切,但我不知道如何在我的远程服务器上使用它。对于服务 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");
}

但是当然没有用。有人知道如何使用管理类从远程机器获取服务吗?或者有其他方法使用服务 Controller 获取启动类型吗?

我也尝试将它们结合起来,并将管理类的 foreach 语句放入服务 Controller 中,但它陷入了无限循环。

最佳答案

您要查找的信息在 WMI 中可用。

在 PowerShell 中编写整个内容比在纯 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

希望对您有所帮助,

关于C# 查询 Windows 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6711726/

相关文章:

c# - 将 XML 中的 HTML 实体转换为 C# 中的等效 Unicode

c# - 设置自定义异常的消息而不将其传递给基本构造函数

c# - Windows 7 中的 ServiceController 权限

.net - 按名称选择特定打印机 VB

batch-file - 暂停批处理文件直到服务停止完成?

c# - 使用 C# 密码保护 PDF

c# - 是否有 LINQ 扩展或(一组合理/高效的 LINQ 扩展)确定集合是否至少有 'x' 个元素?

c#-4.0 - 你如何读取windows服务的控制台输出?

c# - MSMQ:MessageQueue.Close() 在 .EndReceive() 处抛出异常 -1073741536

Delphi 和 Windows 登录事件