C# 无法通过ManagementObjectCollection进行foreach,";此方法不在任何类中实现;抛出异常

C# 无法通过ManagementObjectCollection进行foreach,";此方法不在任何类中实现;抛出异常,c#,windows-10,wmi,system.management,bitdefender,C#,Windows 10,Wmi,System.management,Bitdefender,我正在尝试使用system.management中的WMI查询本地计算机,以获取有关windows安全中不同服务(如windows defender和防火墙)状态的信息。出于测试目的,我在一个控制台项目中工作,我只是尝试访问MSFT\MpComputerStatus和属性,如amservicenabled,但无论我做什么,在尝试通过集合进行访问时都会引发异常 我是WMI的新手,所以我可能错过了一些东西,但我已经尝试了几天了。通过搜索,我发现了一些不同的代码示例,展示了如何访问类的属性,例如: (

我正在尝试使用
system.management
中的WMI查询本地计算机,以获取有关windows安全中不同服务(如windows defender和防火墙)状态的信息。出于测试目的,我在一个控制台项目中工作,我只是尝试访问
MSFT\MpComputerStatus
和属性,如
amservicenabled
,但无论我做什么,在尝试通过集合进行访问时都会引发异常

我是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获取我需要的信息

编辑: 在进一步搜索之后,我还发现
MSFT\MpComputerStatus
也存在于
root\\Microsoft\\protectionManagement
中,但使用此命名空间会产生相同的结果

编辑2: 这是一个设置问题。在3台公司开发pc和1台非开发pc上测试了上述代码,代码在非开发pc上运行良好。如果我发现罪魁祸首是什么,将在此处发布

编辑3: 问题的根源是我们的反病毒系统(bitdefender)。正在寻找解决办法(如有)

编辑4:
查看我自己的anwser。

当windows defender完全禁用时(大多数AV软件在安装时似乎都会这样做),对该类的访问将丢失,但仍然可见。要获取windows安全性的状态,通常必须使用其他方法,例如SecurityCenter 2命名空间(不受官方支持)、wscapi(c++)或通过一些powershell命令。

您的代码很好(也在win 10机器上测试过)。请检查您是否满足本课程的最低要求。从MSDN最低支持客户端Windows 8.1[仅限桌面应用]最低支持服务器Windows server 2012 R2[仅限桌面应用]嘿@styx,我的电脑正在运行Windows 10 Enterprise V 1809。控制台应用程序的目标是.NET Framework 4.6.1,我正在Visual studio 2017中开发(以管理员身份运行)。您是否更改了此计算机上的任何Defender属性?您可以使用WMI代码创建者查看计算机上可用的命名空间/类等,您可以通过浏览此计算机上的名称空间并检查所需名称空间是否正确来执行此操作there@styx什么都没有。这台机器还不到一个月的历史,所以我几乎没有定制过这台机器。然而,这是一台工作pc,所以当他们第一次安装机器时,可能已经改变了一些东西。您是否有任何可能导致我出现问题的设置?