Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.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 |
A в Win32_USBHub? |
Автор: Fox 29.12.08, 16:53 |
информации о номере компорта там не нашол |
Автор: Fox 29.12.08, 18:17 |
попросту говоря мне нужно сделать чтото типа окна "Управление компьютером"-"Диспечер устройств"-"Порты КОМ и ЛПТ" |
Автор: Vladimir 30.12.08, 07:57 |
Это все, что оттуда вытянул на скорую руку. <{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 30.12.08, 12:43 |
в таком чтобы можно было получить доступ к порту. в таком как он отображается в менеджере устройств винды. COM2 например или СОМ50 или СОМ100 ну короче СОМ и именно через ВМИ класы. искать в реестре и т д не предлагать. |
Автор: Vladimir 30.12.08, 12:58 |
Так значит нужен меппинг USB и виртуальных COM портов? Неслабая задачка... Добавлено У меня на машине их вообще нет: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_SerialPort"); Console.WriteLine(searcher.Get().Count); Возвращает 0 Добавлено Во, вроде есть утилити, чтобы жизнь облегчить: 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 |
Ютилити дает перечень всех WMI классов и всех их пропертиз, других нету. |
Автор: Fox 30.12.08, 13:57 |
хорошо вопрос тогда - откуда винда берет инфу в девайс менагер о компортах? |
Автор: Vladimir 30.12.08, 14:15 |
Хороший вопрос! |
Автор: 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() получаешь коллекцию, с которой смело можно работать (думаю, можно еще проще сделать запрос, но пока не понял как ) |