2016-03-16 5 views
1

Мне нужно получить настройки мощности для машины с использованием WMI. Я использую MSDN Link для получения требуемых значений. Мне нужны конкретные значения из возвращаемого списка. Следующий код C# выполняет следующие действия:Получение культуры (локали) независимого свойства WMI

string NamespacePath = @"root\cimv2\power"; 
string powerPlanClass = "Win32_powerplan"; 
string powerSettingClass = "Win32_PowerSettingDataIndex"; 

ManagementClass powerPlanManagementClass = new ManagementClass(NamespacePath + ":" + powerPlanClass); 
ManagementObject powerPlanManagementObject = null; 
foreach (ManagementObject managementObject in powerPlanManagementClass.GetInstances()) 
{ 
    if (managementObject["IsActive"] != null && Boolean.Parse(managementObject["IsActive"].ToString())) 
    { 
     powerPlanManagementObject = managementObject; 
    } 
} 

Dictionary<string, PowerSetting> powerItems = new Dictionary<string, PowerSetting>() 
    { 
     {"AC", new PowerSetting() }, 
     {"DC", new PowerSetting() } 
    }; 


foreach (ManagementObject oObject in powerPlanManagementObject.GetRelated(powerSettingClass)) 
     { 
      var instanceId = oObject["instanceId"]; 
      string[] powerSourceSettings = instanceId.ToString().Split(new string[] { @"\" }, StringSplitOptions.RemoveEmptyEntries); 
      var powerSourceType = powerSourceSettings[2]; 
      ManagementObjectCollection managementObjects = oObject.GetRelated("Win32_PowerSetting"); 
      var elementName = string.Empty; 
      foreach (var managementObject in managementObjects) 
      { 
       elementName = managementObject["ElementName"].ToString(); 
      } 
      var indexValue = uint.Parse(oObject["settingindexvalue"].ToString()); 

      if (elementName.Equals("Hibernate after",StringComparison.OrdinalIgnoreCase)) 
      {      
       if (powerSourceType.Equals("AC", StringComparison.Ordinal)) 
       { 
        powerItems["AC"].HibernateAfter = indexValue; 
       }      
      } 
     } 

Обратите внимание на соответствие со строкой «Спящий режим после». Это работает на машине с локалью en-us, но не работает с другим языком. Есть ли другой способ получить свойство WMI независимо от локали машины?

+0

Сообщение полный код. Я могу догадаться, но точно не знаю, о чем вы говорите. – emoacht

+1

Не сравнивайте с жестко закодированной строкой - вместо этого используйте «Hibernate after» в файлах ресурсов, специфичных для культуры, и выполните сравнение с его строкой ресурса. – slugster

ответ

2

Возможно, вы можете использовать GUID в InstanceID класса Win32_PowerSetting вместо ElementName. В моей машине это Microsoft:PowerSetting\{9d7815a6-7ee4-497e-8888-515a05f02364}. Хотя я не мог найти официальный документ, этот GUID, 9d7815a6-7ee4-497e-8888-515a05f02364, кажется, является общим для некоторых версий Windows и локалей как идентификатор для «спящего режима после» или «спящего режима бездействия».

+0

Проверено на нескольких машинах и, похоже, одинаково. Будет использовать этот GUID для поиска настройки. –