【发布时间】:2013-01-26 02:51:29
【问题描述】:
我在查询 WMI 时遇到问题,这让我完全困惑。我正在构建的应用程序利用作为 VMware View Agent 的一部分安装到 VDI 桌面中的 WMI 计数器。计数器提供有关远程显示协议 PCoIP 的信息。
我有工作代码来查询计数器:
ManagementObjectSearcher searcher = new ManagementObjectSearcher();
ObjectQuery generalQuery = new ObjectQuery("SELECT * FROM Win32_PerfRawData_TeradiciPerf_PCoIPSessionGeneralStatistics");
// Many other queries...
searcher.Query = generalQuery;
foreach (ManagementObject obj in searcher.Get())
{
// Total session duration
ulong sessionDurationSec = Convert.ToUInt64(obj["SessionDurationSeconds"]);
// Get other items...
}
此代码来自现有的、正在运行的 .NET 3.5 应用程序。我现在创建了一个新的 .NET 4.0 应用程序,并且我使用的是完全相同的代码 - 每次都会失败并出现“无效类”ManagementException。
我已验证应用程序权限是正确的,我还尝试在新的 .NET 4.0 应用程序中查询其他项目,如“Win32_Process”,它可以正常工作。
令人费解的是,计数器在 perfmon 和 wmic 中出现并且工作正常:
http://hirstius.com/media/stackoverflow/perfmon.png
但来自 WMI CIM Studio 或 WMI Code Creator - 没有:
http://hirstius.com/media/stackoverflow/WMI_code_creator.png
在我能想到的所有方面,应用程序都是相同的——在 app.manifest 中具有相同的权限,以相同的方式(通过计时器)调用完全相同的代码。唯一的区别是 .NET 3.5 与 4.0 - 但很明显,计数器存在,因为多个应用程序可以看到它们,但数量相同却不能。
有谁知道 .NET 3.5 和 4.0 之间可能存在的差异会导致这种情况吗?或者,为什么计数器可能对某些应用程序可见,而对其他应用程序不可见? .NET 4.0 是否需要一些我缺少的环境设置?目前我不知道去哪里进一步解决这个问题。
【问题讨论】:
-
我还对机器运行了 WMIDiag,它还报告 PCoIP 性能计数器存在。它们在机器上,但某些应用程序似乎找不到它们。
-
我的水晶球说“将 EXE 项目的平台目标设置从 x86 更改为 AnyCPU”。
-
就是这样。虚幻。我猜这意味着计数器只有 64 位?它还将解释为什么某些应用程序可以或看不到它们 - 基于它们的目标平台。谢谢楼主!
标签: c# .net wmi vmware wmi-query