Имам проблем със заявката за WMI, който ме обърка напълно. Приложението, което създавам, използва WMI броячи, които са инсталирани като част от VMware View Agent в VDI работен плот. Броячите предоставят информация за протокола за отдалечен дисплей 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.
Проверих, че разрешенията за приложението са правилни, опитах също така да направя заявка за други елементи като „Win32_Process“ в новото приложение .NET 4.0 и то работи без проблем.
Озадачаващото е, че броячите се появяват и работят добре в 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? В момента не знам къде да отида за допълнително отстраняване на проблема.