Цикл Foreach Не удается преобразовать символ в System.Management.ManagementObject? - PullRequest
0 голосов
/ 07 июня 2019

У меня есть цикл foreach, который перебирает все сервисы WMI, который ищет только определенные сервисы, которые содержат определенные ключевые слова для включения и исключения. Поэтому вы можете остановить определенные службы, которые содержат включенные и исключенные слова. К сожалению, я получаю эту ошибку в цикле foreach, в котором говорится, что невозможно преобразовать тип 'char' в 'System.Management.ManagementObject'. Надеюсь, вы, ребята, знаете. Спасибо за помощь.

public static void Test()
{
    string include = "SQL";
    string exclude = "EXPRESS, Writer";
    string[] includeArray = include.Split(',');
    string[] excludeArray = exclude.Split(',');

    ConnectionOptions options = new ConnectionOptions();

    //Scope that will connect to the default root for WMI
    ManagementScope theScope = new ManagementScope(@"root\cimv2");

    //Path created to the services with the default options
    ObjectGetOptions option = new ObjectGetOptions(null, TimeSpan.MaxValue, true);
    ManagementPath spoolerPath = new ManagementPath("Win32_Service");
    ManagementClass servicesManager = new ManagementClass(theScope, spoolerPath, option);
    using (ManagementObjectCollection services = servicesManager.GetInstances())
    {
        foreach (ManagementObject item in services.ToString().Where(x => includeArray.ToList().Any(a => x.ToString().Contains(a)) && !excludeArray.Any(a => x.ToString().Contains(a))))
        {
            if (item["Started"].Equals(true))
            {
                item.InvokeMethod("StopService", null);
            }
        }
    }
}

Ответы [ 2 ]

1 голос
/ 07 июня 2019

Вы не можете использовать Linq для таких объектов WMI.

То, что вы можете сделать, это зациклить службы и проверить имя: заметьте также, что я удалил лишний пробел в переменной exclude.

void Main()
{
    string include = "SQL";
    string exclude = "EXPRESS,Writer";
    string[] includeArray = include.Split(',');
    string[] excludeArray = exclude.Split(',');

    ConnectionOptions options = new ConnectionOptions();

    //Scope that will connect to the default root for WMI
    ManagementScope theScope = new ManagementScope(@"root\cimv2");

    //Path created to the services with the default options
    ObjectGetOptions option = new ObjectGetOptions(null, TimeSpan.MaxValue, true);
    ManagementPath spoolerPath = new ManagementPath("Win32_Service");
    ManagementClass servicesManager = new ManagementClass(theScope, spoolerPath, option);
    using (ManagementObjectCollection services = servicesManager.GetInstances())
    {
        foreach (ManagementObject item in services)
        {
            var serviceName = item["Name"];
            if (includeArray.Any(a => serviceName.ToString().Contains(a)) && !excludeArray.Any(a => serviceName.ToString().Contains(a)))
            {
                if (item["Started"].Equals(true))
                {
                    item.InvokeMethod("StopService", null);
                }
            }
        }
    }
}
0 голосов
/ 19 июня 2019

Если вы хотите работать с коллекциями, чтобы вы могли легко использовать Linq, вы можете использовать ORMi

var list = helper.Query("select * from Win32_Service").ToList().Where(p => p.Contains("reserverWord"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...