Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > .NET: Общие вопросы > select * from Win32_????


Автор: Fox 29.12.08, 10:23
ищу WMI клас, хранящий информацию о диагностических портах оборудования (USB)

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


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

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

Автор: Vladimir 29.12.08, 15:15
Цитата Fox @
в Win32_USBControler точно нету



A в Win32_USBHub? :huh:

Автор: Fox 29.12.08, 16:53
информации о номере компорта там не нашол

Автор: Fox 29.12.08, 18:17
попросту говоря мне нужно сделать чтото типа окна
"Управление компьютером"-"Диспечер устройств"-"Порты КОМ и ЛПТ" :(

:wall:

Автор: Vladimir 30.12.08, 07:57
Цитата Fox @
информации о номере компорта там не нашол


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


<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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 выдает примерно то же самое:


<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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 , других там нету


<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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 30.12.08, 09:07
это все понятно, но проблема в том, что я ищу именно имя порта, а весь остальной набор веселых параметров безсловно полезен и интересен но мне абсолютно не нужен.

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

Автор: Vladimir 30.12.08, 09:10
Цитата Fox @
я ищу именно имя порта,


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

Автор: Fox 30.12.08, 12:43
в таком чтобы можно было получить доступ к порту. в таком как он отображается в менеджере устройств винды.

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

и именно через ВМИ класы. искать в реестре и т д не предлагать.

Автор: Vladimir 30.12.08, 12:58
Цитата Fox @
COM2 например




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

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

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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 неймспейсе

Автор: Fox 30.12.08, 13:34
Win32_SerialPort отдает только железные порты
а у тебя ноут скорее всего потому их нету.

а мне надо юсб :(

Автор: Vladimir 30.12.08, 13:38
Цитата Fox @
а мне надо юсб



Ютилити дает перечень всех WMI классов и всех их пропертиз, других нету. :no:

Автор: Fox 30.12.08, 13:57
хорошо :) вопрос тогда - откуда винда берет инфу в девайс менагер о компортах?:)

Автор: Vladimir 30.12.08, 14:15
Цитата Fox @
хорошо вопрос тогда - откуда винда берет инфу в девайс менагер о компортах?



Хороший вопрос! :D

Автор: Fox 30.12.08, 14:34
думаю придутся брать инфу о юсб всетаки с реестра както по идентификатору ЮСБ устройства чтоли... только вот как это сделать представляю смутно.

обидно что не получилось найти ВМИ клас с этой инфой, а ведь он есть 100%...

Автор: debugx 30.12.08, 15:00
Fox, а как насчет того, чтобы слить всю базу WMI со всеми классами и свойствами в текстовый файлик, и поискать в нем слово COM?

Автор: Fox 30.12.08, 15:13
боюсь комп этого не переживет:)
и так на многи запросы комп зависает...

думал может кто подскажет...

Автор: Fox 04.01.09, 11:08
таки нету вроде непосредственного WMI в свойствах которого будет метка на компорт...
таки любоптно - как их вычисляет девайс манагер в красивом виде...
чтото мне подсказывает что как ПнП девайс... но как оттуда вытащить имя порта...?


цена вопроса 10 баксов :) (в пределах Украины могу выслать пополняшкой счета или еще как... спасайте :( )

Автор: Fox 05.01.09, 10:36
хм... похоже всетаки нарыл то чт мне нужно :)
http://www.delphi3000.com/articles/article_4001.asp?SK=
если кому интересно.. правда не на шарпе... мозгодробилка блин... думал будет проще

Автор: Fox 05.01.09, 14:47
решил пойти другим путем :)

перебираю поля USBControllerDevice (там в поле Dependent есть чтото весьма похожее на путь в реестр, откуда можно снять информацию о порте собственно)
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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 { }
                    }
    }

только блин этот путь не совсем путь... структура поля следующая:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    \\Имя компа\\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 ?
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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) :) естественно ничего не получилось :) смутно понимаю что делается это ансейфным кодом через ссылки но не понимаю как именно :)

Автор: fdevelop 02.02.10, 10:36
Столкнулся с аналогичной же проблемой, помучался :)
Объект в итоге получить очень просто: из той строки, что он тебе выдает очень легко сформулировать очередной WQL запрос. Например,
из строки
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    \\ACER\root\cimv2:Win32_PnPEntity.DeviceID="USBSTOR\\DISK&VEN_T.SONIC&PROD_820&REV_\\10004020200001210064&0"

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

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

(думаю, можно еще проще сделать запрос, но пока не понял как :) )

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)