Невозможно выполнить foreach с помощью ManagementObjectCollection. Возникло исключение «Этот метод не реализован ни в одном классе». - PullRequest
2 голосов
/ 27 марта 2019

Я пытаюсь запросить у локального компьютера информацию о состоянии различных служб безопасности Windows, таких как Windows Defender и Firewall, используя WMI из system.management. В целях тестирования я работаю в консольном проекте, и я просто пытаюсь получить доступ к MSFT_MpComputerStatus и таким свойствам, как AMServiceEnabled, но независимо от того, что я делаю, исключение выдается при попытке выполнить поиск через коллекцию.

Я очень новичок в WMI, так что, может быть, я что-то упустил, но я пытался заставить это работать несколько дней. В процессе поиска я нашел несколько различных примеров кода, показывающих, как получить доступ к свойствам. классов, таких как: ( Для нахождения всего в классе )

( Для доступа к свойствам в конкретном экземпляре ManagementObject )

( Использование инструмента создания кода WMI было предложено здесь )

Я пробовал все это, используя пространство имен: root\\Microsoft\\Windows\\Defender и класс: MSFT_MpComputerStatus, но ничего не получалось.

Ниже приведен код, созданный инструментом, и даже это не работает как в моем консольном приложении, так и в самом инструменте.

        try
        {
            ManagementObjectSearcher searcher =
                new ManagementObjectSearcher("root\\Microsoft\\Windows\\Defender",
                    "SELECT * FROM MSFT_MpComputerStatus");

            foreach (ManagementObject queryObj in searcher.Get())
            {
                Console.WriteLine("-----------------------------------");
                Console.WriteLine("MSFT_MpComputerStatus instance");
                Console.WriteLine("-----------------------------------");
                Console.WriteLine("AMServiceEnabled: {0}", queryObj["AMServiceEnabled"]);
                Console.WriteLine("AntispywareEnabled: {0}", queryObj["AntispywareEnabled"]);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }

При этом должны возвращаться некоторые значения bool, указывающие, включены ли службы или нет, но как только он достигает цикла foreach, выдается исключение «System.Management.ManagementException: этот метод не реализован ни в одном классе». Я что-то здесь упускаю? Есть ли какой-то другой способ получения необходимой мне информации с помощью WMI?

Edit: После еще нескольких поисков я также обнаружил, что MSFT_MpComputerStatus также существует в root\\Microsoft\\protectionManagement, но использование этого пространства имен дает тот же результат.

Редактировать 2: Это проблема настроек. Протестировал приведенный выше код на 3 компьютерах разработки компании и одном компьютере, не предназначенном для разработки, и этот код отлично работал на компьютере, не предназначенном для разработки. Если я найду виновника, опубликую это здесь.

Редактировать 3: Именно наша антивирусная система (bitdefender) является корнем проблемы. Работаем над поиском обходного пути, если есть.

Редактировать 4: Смотрите мой собственный ответ.

1 Ответ

0 голосов
/ 03 апреля 2019

Когда защитник Windows полностью отключен (что, по-видимому, делает большинство программ AV при его установке), доступ к этому классу теряется, но он все еще виден.Чтобы получить статус безопасности Windows в целом, необходимо использовать другие методы, такие как пространство имен SecurityCenter2 (официально не поддерживается), wscapi (c ++) или некоторые команды powershell.

...