На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> select * from Win32_???? , помогите найти WMI клас
    ищу WMI клас, хранящий информацию о диагностических портах оборудования (USB)

    нашол модемы и сериал порт
    ExpandedWrap disabled
      Модемы в системе:
       ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_POTSModem");
      Физические порты(COM ports):
       searcher = new ManagementObjectSearcher("select * from Win32_SerialPort");


    гдето в этих класах(WMI) есть инфа о диагностических ЮСБ портах...

    в Win32_USBControler точно нету, а вот вроде как есть чтото интересное в Win32_USBControlerDevice... но я не понимаю как пользоваться информацией предоставляемой этим класом :( для модемов все понятно, для компорта тоже, а вот для этого бред какойто - мне собственно нужно узнать к какому физпорту(КОМ) приатачено ЮСБ устройство...
      Цитата Fox @
      в Win32_USBControler точно нету



      A в Win32_USBHub? :huh:
        информации о номере компорта там не нашол
          попросту говоря мне нужно сделать чтото типа окна
          "Управление компьютером"-"Диспечер устройств"-"Порты КОМ и ЛПТ" :(

          :wall:
            Цитата Fox @
            информации о номере компорта там не нашол


            Это все, что оттуда вытянул на скорую руку.


            ExpandedWrap disabled
              ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_USBHub");
               
                          foreach (ManagementObject mo in searcher.Get())
                          {
                              Console.WriteLine(mo["Name"]);
                              Console.WriteLine(mo["DeviceID"]);
                              Console.WriteLine(mo["Status"]);
                          }



            Пустые порты выдают типа

            USB-mainhub
            USB\ROOT_HUB\4&14C69700&0
            OK

            После подключения ЮСБ мемори-стик изменилось на


            USB-storage device
            USB\VID_1043&PID_8006\200506090855
            OK

            Добавлено
            Win32_USBController выдает примерно то же самое:


            ExpandedWrap disabled
              ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_USBController");
                          foreach (ManagementObject queryObj in searcher.Get())  
                              {  
                                  Console.WriteLine("-----------------------------------");  
                                  Console.WriteLine("Win32_USBController instance");  
                                  Console.WriteLine("-----------------------------------");    
                                  Console.WriteLine(queryObj["Caption"]);  
                                  Console.WriteLine(queryObj["ConfigManagerUserConfig"]);  
                                  Console.WriteLine(queryObj["DeviceID"]);
                                  Console.WriteLine(queryObj["Manufacturer"]);  
                                  Console.WriteLine(queryObj["ProtocolSupported"]);  
                                  Console.WriteLine(queryObj["Status"]);  
                
                              }


            Добавлено
            Вот все пропертиз класса Win32_USBControllerDevice , других там нету


            ExpandedWrap disabled
              ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_USBControllerDevice");
                          foreach (ManagementObject queryObj in searcher.Get())
                          {
                              Console.WriteLine("-----------------------------------");
                              Console.WriteLine("Win32_USBControllerDevice instance");
                              Console.WriteLine("-----------------------------------");
                              Console.WriteLine(queryObj["AccessState"]);
                              Console.WriteLine(queryObj["Antecedent"]);
                              Console.WriteLine(queryObj["Dependent"]);
                              Console.WriteLine(queryObj["NegotiatedDataWidth"]);
                              Console.WriteLine(queryObj["NegotiatedSpeed"]);
                              Console.WriteLine(queryObj["NumberOfHardResets"]);
                              Console.WriteLine(queryObj["NumberOfSoftResets"]);
               
                          }
              это все понятно, но проблема в том, что я ищу именно имя порта, а весь остальной набор веселых параметров безсловно полезен и интересен но мне абсолютно не нужен.

              перебор свойств ВМИ класов, в именах которых вствречается "юсб", "ком" или "порт", я уже давно сделал, но нихрена не нашол.
                Цитата Fox @
                я ищу именно имя порта,


                А в каком виде имя должно быть записано?
                  в таком чтобы можно было получить доступ к порту. в таком как он отображается в менеджере устройств винды.

                  COM2 например :) или СОМ50 или СОМ100 :) ну короче СОМ

                  и именно через ВМИ класы. искать в реестре и т д не предлагать.
                  Сообщение отредактировано: Fox -
                    Цитата Fox @
                    COM2 например




                    Так значит нужен меппинг USB и виртуальных COM портов? Неслабая задачка... :yes-sad:

                    Добавлено
                    У меня на машине их вообще нет:

                    ExpandedWrap disabled
                      ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_SerialPort");
                      Console.WriteLine(searcher.Get().Count);


                    Возвращает 0 :no-sad:

                    Добавлено
                    Во, вроде есть утилити, чтобы жизнь облегчить:

                    http://www.microsoft.com/downloads/details.aspx?familyid=2CC30A64-EA15-4661-8DA4-55BBC145C30E&displaylang=en

                    Добавлено
                    WMI классы находятся в root\CIMV2 неймспейсе
                      Win32_SerialPort отдает только железные порты
                      а у тебя ноут скорее всего потому их нету.

                      а мне надо юсб :(
                        Цитата Fox @
                        а мне надо юсб



                        Ютилити дает перечень всех WMI классов и всех их пропертиз, других нету. :no:
                          хорошо :) вопрос тогда - откуда винда берет инфу в девайс менагер о компортах?:)
                            Цитата Fox @
                            хорошо вопрос тогда - откуда винда берет инфу в девайс менагер о компортах?



                            Хороший вопрос! :D
                              думаю придутся брать инфу о юсб всетаки с реестра както по идентификатору ЮСБ устройства чтоли... только вот как это сделать представляю смутно.

                              обидно что не получилось найти ВМИ клас с этой инфой, а ведь он есть 100%...
                                Fox, а как насчет того, чтобы слить всю базу WMI со всеми классами и свойствами в текстовый файлик, и поискать в нем слово COM?
                                  боюсь комп этого не переживет:)
                                  и так на многи запросы комп зависает...

                                  думал может кто подскажет...
                                    таки нету вроде непосредственного WMI в свойствах которого будет метка на компорт...
                                    таки любоптно - как их вычисляет девайс манагер в красивом виде...
                                    чтото мне подсказывает что как ПнП девайс... но как оттуда вытащить имя порта...?


                                    цена вопроса 10 баксов :) (в пределах Украины могу выслать пополняшкой счета или еще как... спасайте :( )
                                      хм... похоже всетаки нарыл то чт мне нужно :)
                                      http://www.delphi3000.com/articles/article_4001.asp?SK=
                                      если кому интересно.. правда не на шарпе... мозгодробилка блин... думал будет проще
                                      Сообщение отредактировано: Fox -
                                        решил пойти другим путем :)

                                        перебираю поля USBControllerDevice (там в поле Dependent есть чтото весьма похожее на путь в реестр, откуда можно снять информацию о порте собственно)
                                        ExpandedWrap disabled
                                          public SomeScanFunc()
                                          {
                                                          ManagementClass c = new ManagementClass("Win32_USBControllerDevice");
                                                          foreach (ManagementObject o in c.GetInstances())
                                                          {
                                                              try
                                                              {
                                                                  string path = o["Dependent"].ToString();
                                                                  RegistryKey key = Registry.LocalMachine.OpenSubKey(path);
                                                              }
                                                              catch { }
                                                          }
                                          }

                                        только блин этот путь не совсем путь... структура поля следующая:
                                        ExpandedWrap disabled
                                          \\Имя компа\\root\\cimv2:Win32_PnPEntity.DeviceID=\"USB\\ROOT_HUB\\4&74BD3DD&0\"

                                        собственно часть "USB\\ROOT_HUB\\4&74BD3DD&0\" есть куском пути. :) если впереди дописать "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\" то получим полный путь в реестре для этого устройства, после чего оттуда можно выковырять инфу о присвоеном номере порта и т д

                                        уж больно мутно но пока так :(
                                        буду рад если кто поправит меня - как это сделать проще?


                                        и еще попутно для знатоков вопрос:
                                        поле Dependent класа Win32_USBControllerDevice есть ссылка на (обьект?) CIM_LogicalDevice ?
                                        ExpandedWrap disabled
                                          class Win32_USBControllerDevice : CIM_ControlledBy
                                          {
                                            uint16 AccessState;
                                            CIM_USBController ref Antecedent;// как получить отсюда обьект типа CIM_USBController?
                                            CIM_LogicalDevice ref Dependent;
                                            uint32 NegotiatedDataWidth;
                                            uint64 NegotiatedSpeed;
                                            uint32 NumberOfHardResets;
                                            uint32 NumberOfSoftResets;
                                          };
                                           
                                                  class CIM_LogicalDevice
                                                  {
                                                      UInt16 Availability;
                                                      string Caption;
                                                      UInt32 ConfigManagerErrorCode;
                                                      bool ConfigManagerUserConfig;
                                                      string CreationClassName;
                                                      string Description;
                                                      string DeviceID;
                                                      bool ErrorCleared;
                                                      string ErrorDescription;
                                                      DateTime InstallDate;
                                                      UInt32 LastErrorCode;
                                                      string Name;
                                                      string PNPDeviceID;
                                                      UInt16[] PowerManagementCapabilities;
                                                      bool PowerManagementSupported;
                                                      string Status;
                                                      UInt16 StatusInfo;
                                                      string SystemCreationClassName;
                                                      string SystemName;
                                                  }

                                        собственно вопрос - как получить из длинной некрасивой строки Dependent красивый обьект класса CIM_LogicalDevice?
                                        первое что пришло в голову - создал класс CIM_LogicalDevice и попробовал привести [Dependent] к (CIM_LogicalDevice) :) естественно ничего не получилось :) смутно понимаю что делается это ансейфным кодом через ссылки но не понимаю как именно :)
                                          Столкнулся с аналогичной же проблемой, помучался :)
                                          Объект в итоге получить очень просто: из той строки, что он тебе выдает очень легко сформулировать очередной WQL запрос. Например,
                                          из строки
                                          ExpandedWrap disabled
                                            \\ACER\root\cimv2:Win32_PnPEntity.DeviceID="USBSTOR\\DISK&VEN_T.SONIC&PROD_820&REV_\\10004020200001210064&0"

                                          очень нетрудно создать такой запрос:
                                          ExpandedWrap disabled
                                            ManagementObjectSearcher s2 = new ManagementObjectSearcher(@"\\ACER\root\cimv2",@"SELECT * FROM Win32_PnPEntity WHERE
                                             DeviceID='USBSTOR\\DISK&VEN_T.SONIC&PROD_820&REV_\\10004020200001210064&0'");

                                          А далее, уже методом Get() получаешь коллекцию, с которой смело можно работать

                                          (думаю, можно еще проще сделать запрос, но пока не понял как :) )
                                          Сообщение отредактировано: fdevelop -
                                          1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                          0 пользователей:


                                          Рейтинг@Mail.ru
                                          [ Script execution time: 0,0532 ]   [ 15 queries used ]   [ Generated: 8.11.24, 23:36 GMT ]