WMI не возвращает ожидаемый сервис, ServiceController определяет ОК - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь определить, работает ли определенная служба на удаленном ПК или нет, и определить тип ее запуска.

Используя 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();
    }

1 Ответ

0 голосов
/ 09 декабря 2018

выглядит хорошо по большей части.Я бы привел область с "\\" перед именем вашей машины.Кроме того, если вы просто ищете одну конкретную службу, добавьте предложение 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";
...