2015-04-09 3 views
2

ОК, так что это заставляет меня гайки.Использование ManagementObjectSearcher для запроса Win32_PnPEntity возвращается пустым

Код ниже работал отлично в Windows 7 с .NET 3.5. В Windows 8.1 и .NET 4.5.1 я получаю пустой результат, но с помощью WMI Code Creator могу получить результаты.

Я ничего не могу найти об этом в Интернете.

Я хочу получить дружественные имена любых COM-портов, например. «Порт связи (COM1)».

Просто используя System.IO.Ports.SerialPort.GetPortNames() не делайте.

Я действительно надеюсь, что кто-то знает, как это сделать. Благодаря!

using System; 
using System.Collections.Generic; 
using System.Management; 

namespace OakHub 
{ 
    public class SerialMgmt 
    { 
     static public List<String> GetCOMDevices() 
     { 
      List<String> list = new List<String>(); 

      ManagementScope scope = new ManagementScope(@"\\" + Environment.MachineName + @"\root\CIMV2"); 
      SelectQuery sq = new SelectQuery("SELECT Caption FROM Win32_PnPEntity"); 
      ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, sq); 
      ManagementObjectCollection moc = searcher.Get(); 

      foreach (ManagementObject mo in moc) 
      { 
       String name = mo.ToString(); 
       if (name.ToString().Contains("(COM")) 
       { 
        list.Add(name); 
       } 
      } 
      return list; 
     } 
    } 
} 

ответ

1

Прежде всего, я не знаю, почему этот код работает даже для вас (с .Net 3.5).

  1. Вы только что выбрали недвижимость Caption. (Используйте *, чтобы выбрать все, если это необходимо)
  2. Я думаю, что вы хотите, чтобы имя из Win32_PnPEntity-устройств, вы косяк получить его с этой строки кода

    String name = mo.ToString();

    Поскольку зовут недвижимость. Вы должны сначала загрузить свойство с WMI-String:

    SELECT Name,Caption FROM Win32_PnPEntity // Получить имя и подпись Свойство

    или

    SELECT * FROM Win32_PnPEntity // Загрузить все Propertys этого WMI-Obj

И чем вы должны проверить, если значение равно нулю еще -> возвращает значение

Код:

public List<String> GetLocalCOMDevices() 
     { 
      List<String> list = new List<String>(); 

      ManagementScope scope = new ManagementScope(@"\\" + Environment.MachineName + @"\root\CIMV2"); 
      SelectQuery sq = new SelectQuery("SELECT Name,Caption FROM Win32_PnPEntity"); 
      ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, sq); 
      ManagementObjectCollection moc = searcher.Get(); 

      foreach (ManagementObject mo in moc) 
      { 
       object propName = mo.Properties["Name"].Value; 
       if (propName == null) { continue; } 

       list.Add(propName.ToString()); 
      } 
      return list; 
     } 
+0

Это решение работает отлично! Спасибо manuchao! – greatwhitehat

+0

Np. Но я бы сделал IEnumerable <> Method. Вы знаете, как это сделать? – C0d1ngJammer

+0

Nopes, это в моем списке дел. К сожалению, моя новая роль дает мне меньше времени для кодирования. – greatwhitehat

Смежные вопросы