0

我正在尝试确定远程 PC 上的某个服务是否正在运行并确定其启动类型。

使用 ServiceController 我可以成功地在远程机器上看到预期的服务,但是当切换到使用 WMI 进行更深入的钻取时,该服务不再出现。

这是我的代码:

    public static void Main()
    {
        var ctl = ServiceController.GetServices("[Name]");
        List<string> namelist = new List<string>();

        foreach (var x in ctl)
        {
            if (x.DisplayName == "NHS Card Checker")
            {
                Console.WriteLine(string.Format("NHS Card checker found on MPC - Status: {0}", x.Status));

                ConnectionOptions options = new ConnectionOptions();
                options.Impersonation = System.Management.ImpersonationLevel.Impersonate;
                ManagementScope scope = new ManagementScope(@"[Name]\root\cimv2");
                scope.Connect();

                string wmiQuery = string.Format("Select * from Win32_Service", x.DisplayName);

                ManagementObjectSearcher wmi = new ManagementObjectSearcher(wmiQuery);
                ManagementObjectCollection coll = wmi.Get();

                foreach (var service in coll)
                {
                    Console.WriteLine(string.Format("{0} - {1}", service["Name"].ToString(), service["StartMode"].ToString()) );
                }
            }
        }

        Console.ReadKey();
    }
4

1 回答 1

0

大部分看起来都不错。我会在你的机器名称前用“\\”引导范围。此外,如果您只是在寻找一项特定服务,请在查询中添加 WHERE 子句。

public static void Main()
{
    string MachineName = "[Name]";

    var ctl = ServiceController.GetServices(MachineName);
    List<string> namelist = new List<string>();

    foreach (var x in ctl)
    {
        if (x.DisplayName == "NHS Card Checker")
        {
            Console.WriteLine(string.Format("NHS Card checker found on MPC - Status: {0}", x.Status));

            ConnectionOptions options = new ConnectionOptions();
            options.Impersonation = System.Management.ImpersonationLevel.Impersonate;
            ManagementScope scope = new ManagementScope(String.Format(@"\\{0}\root\cimv2", MachineName));
            scope.Connect();

            string wmiQuery = string.Format("Select * from Win32_Service WHERE DisplayName='{0}'" , x.DisplayName);

            ManagementObjectSearcher wmi = new ManagementObjectSearcher(wmiQuery);
            ManagementObjectCollection coll = wmi.Get();

            foreach (var service in coll)
            {
                Console.WriteLine(string.Format("{0} - {1}", service["Name"].ToString(), service["StartMode"].ToString()));
            }
        }
    }

    Console.ReadKey();
}

或者可能将其简化为仅使用 WMI 之类的...

string MachineName = "[Name]";
            string TargetService = "NHS Card Checker";

            {
                ConnectionOptions options = new ConnectionOptions();
                    options.Impersonation = System.Management.ImpersonationLevel.Impersonate;
                    ManagementScope scope = new ManagementScope(String.Format(@"\\{0}\root\cimv2", MachineName));
                    scope.Connect();

                    string wmiQuery = String.Format("Select * from Win32_Service WHERE DisplayName='{0}'", TargetService);

                    ManagementObjectSearcher wmi = new ManagementObjectSearcher(wmiQuery);
                    ManagementObjectCollection coll = wmi.Get();

                    if (coll.Count > 0)
                    {

                        foreach (var service in coll)
                        {
                            Console.WriteLine(string.Format("NHS Card checker found on MPC - Status: {0}", service["Status"].ToString()));
                            Console.WriteLine(string.Format("{0} - {1}", service["Name"].ToString(), service["StartMode"].ToString()));
                        }
                    }
                    else
                    {
                        Console.WriteLine(string.Format("{0} Service was not found", TargetService));
                    }

                }
            }

此外,在 C# 的较新实现中,您可以使用更简单的字符串插值变化。代替...

string.format("{0} is your value", VariableName");

您可以使用

$"{VariableName} is your value";
于 2018-12-08T23:42:41.070 回答