C # - Получить COM-порты с их дружественным именем, используя WMI - PullRequest
0 голосов
/ 24 января 2019

Я разрабатываю решение на C # и хочу получить COM-порты, описание и friendlyName (если они Bluetooth).

После небольшого исследования я обнаружил, что могу получить COM-порты, используя WMI / CIMV2 / Win32_PnPEntity , выполнив поиск по значениям Name и Description .

Чтобы найти понятное имя, мне нужно найти на Win32_PnPSignedDriver и принять значение FriendlyName

Есть ли способ сопоставить их, чтобы получить такой список?

  • COM56 - устройство Bluetooth - MyBTHDeviceName1
  • COM76 - устройство Bluetooth - MyBTHDeviceName2
  • COM5 - Последовательное устройство -

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

// Method to retrieve the list of all COM ports.
        public static List<PortInfo> FindComPorts()
        {
            List<PortInfo> portList = new List<PortInfo>();
            ConnectionOptions options = PrepareOptions();
            ManagementScope scope = PrepareScope(Environment.MachineName, options, @"\root\CIMV2");

            // Prepare the query and searcher objects.
            ObjectQuery objectQuery = new ObjectQuery("SELECT * FROM Win32_PnPEntity WHERE ConfigManagerErrorCode = 0");
            ManagementObjectSearcher portSearcher = new ManagementObjectSearcher(scope, objectQuery);

            using (portSearcher)
            {
                string caption = null;
                // Invoke the searcher and search through each management object for a COM port.
                foreach (ManagementObject currentObject in portSearcher.Get())
                {
                    if (currentObject != null)
                    {
                        object currentObjectCaption = currentObject["Caption"];
                        if (currentObjectCaption != null)
                        {
                            caption = currentObjectCaption.ToString();
                            if (caption.Contains("(COM"))
                            {
                                PortInfo portInfo = new PortInfo();
                                portInfo.Name = caption.Substring(caption.LastIndexOf("(COM")).Replace("(", string.Empty).Replace(")", string.Empty);
                                portInfo.Description = caption;
                                portList.Add(portInfo);
                            }
                        }
                    }
                }
            }
            return portList;
        }

Заранее спасибо.

1 Ответ

0 голосов
/ 24 января 2019

«Дружественное имя», которое вы ищете, подходит только тогда, когда COM-порты являются виртуальными (как я полагаю, они на вашем примере).Я думаю, что вы можете просто получить необходимую информацию для поиска свойства name в классе Win32_PnPEntity.Нет необходимости искать дополнительную информацию на COM-портах, так как вы получите всю информацию уже по Win32_PnPEntity классу.

. Вы также можете попробовать использовать ORMi и использовать строго типизированные объекты для этого..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...