3

我正在尝试使用来自system.management. 出于测试目的,我正在一个控制台项目中工作,我只是试图访问MSFT_MpComputerStatus和属性AMServiceEnabled,但无论我做什么,当尝试遍历集合时都会抛出异常。

我是 WMI 的新手,所以它可能只是我错过的东西,但我已经尝试让它工作了几天。通过我的搜索,我发现了一些不同的代码示例,展示了如何访问类的属性,例如:(用于查找类中的所有内容

用于访问特定 ManagementObject 实例的属性

这里建议使用 WMI 代码创建工具

root\\Microsoft\\Windows\\Defender我使用 namespace:和 class:尝试了所有这些,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;
        }

这应该返回一些布尔值,指示服务是打开还是关闭,但是一旦到达 foreach 循环,就会抛出此异常“System.Management.ManagementException:此方法未在任何类中实现”。我在这里错过了什么吗?有没有其他方法可以使用 WMI 获取我需要的信息?

编辑: 经过更多搜索后,我还发现它MSFT_MpComputerStatus也存在于 中root\\Microsoft\\protectionManagement,但使用此命名空间会产生相同的结果。

编辑2: 这是一个设置问题。在 3 台公司开发电脑和一台非开发电脑上测试了上述代码,代码在非开发电脑上运行良好。如果我发现罪魁祸首是什么,我会把它贴在这里。

编辑3: 问题的根源在于我们的防病毒系统(bitdefender)。努力寻找解决方法(如果有)。

编辑 4: 查看我自己的答案。

4

1 回答 1

1

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

于 2019-04-03T07:40:01.110 回答