|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Получить список оборудования с неустановленными/неправильно установленными драйверами |
|
|
[решено] Получить список оборудования с неустановленными/неправильно установленными драйверами
|
Ветеран Сообщения: 903 |
Профиль | Отправить PM | Цитировать Собственно проблема:
1. Можно ли штатными средствами autoit получить список проблемного оборудования в системе? Под проблемным я понимаю: без драйверов, с некорректно работающим (установленными) драйверами. Если, да, то покажите где искать. Буду благодарен за любую помощь. 2. Список - в простом виде (Название железа - проблема), в виде Диспетчера устройств с таким же функционалом (но только, не всех, а проблемных) было бы идеально. PS "штатными" означает - без использования сторонних утилит. Использовать "родные" средства Win XP можно. |
|
Отправлено: 22:15, 05-08-2010 |
Ветеран Сообщения: 812
|
Профиль | Отправить PM | Цитировать saavaage,
Есть такая UDF: DeviceAPI.au3. Посмотрите в ней. |
Отправлено: 22:48, 05-08-2010 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 903
|
Профиль | Отправить PM | Цитировать madmasles, посмотрел функции, посмотрел примеры. Не понял как использовать. Как вывести все оборудование, которое есть -понятно, но как наложить ограничение вывода по признаку "отсутствие драйвера", не понимаю.
Код примера с гуи из http://www.autoitscript.com/forum/in...howtopic=77731 #include <GuiConstantsEx.au3> #include <GuiTreeView.au3> #include <TreeViewConstants.au3> #Include <GuiListView.au3> #include <WindowsConstants.au3> #include <GuiImageList.au3> #include "DeviceAPI.au3" Global $aAssoc[1][2] $GUI = GUICreate("Device Management API - GUI Example", 800, 500) Dim $iStyle = BitOR($TVS_EDITLABELS, $TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS) $hTreeView = _GUICtrlTreeView_Create($GUI, 5, 5, 300, 450, $iStyle, $WS_EX_STATICEDGE ) $hListView = GUICtrlCreateListView ("Key|Value", 310, 5, 485,450) GUISetState() GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") ;Assign image list to treeview _GUICtrlTreeView_SetNormalImageList($hTreeView, _DeviceAPI_GetClassImageList()) Dim $total_devices = 0 _DeviceAPI_GetClasses() While _DeviceAPI_EnumClasses() ;Get icon index from image list for given class $Icon_Index = _DeviceAPI_GetClassImageIndex($p_currentGUID) ;Build list of devices within current class, if class doesn't contain any devices it will be skipped _DeviceAPI_GetClassDevices($p_currentGUID) ;Skip classes without devices If _DeviceAPI_GetDeviceCount() > 0 Then ;Add parent class to treeview $parent = _GUICtrlTreeView_Add($hTreeView, 0, _DeviceAPI_GetClassDescription($p_currentGUID), $Icon_Index, $Icon_Index) ;Loop through all devices by index While _DeviceAPI_EnumDevices() $description = _DeviceAPI_GetDeviceRegistryProperty($SPDRP_DEVICEDESC) $friendly_name = _DeviceAPI_GetDeviceRegistryProperty($SPDRP_FRIENDLYNAME) ;If a friendly name is available, use it instead of description If $friendly_name <> "" Then $description = $friendly_name ;Add device to treeview below parent $handle = _GUICtrlTreeView_AddChild($hTreeView, $parent, $description, $Icon_Index, $Icon_Index) If $total_devices > 0 Then ReDim $aAssoc[$total_devices+1][2] EndIf ;Add treeview item handle to array along with device Unique Instance Id (For lookup) $aAssoc[$total_devices][0] = $handle $aAssoc[$total_devices][1] = _DeviceAPI_GetDeviceId() ;Update running total count of devices $total_devices += 1 WEnd EndIf WEnd While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam) #forceref $hWnd, $iMsg, $iwParam Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndTreeview $hWndTreeview = $hTreeView If Not IsHWnd($hTreeView) Then $hWndTreeview = GUICtrlGetHandle($hTreeView) $tNMHDR = DllStructCreate($tagNMHDR, $ilParam) $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom")) $iIDFrom = DllStructGetData($tNMHDR, "IDFrom") $iCode = DllStructGetData($tNMHDR, "Code") Switch $hWndFrom Case $hWndTreeview Switch $iCode Case $TVN_SELCHANGEDA, $TVN_SELCHANGEDW RefreshDeviceProperties() EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_NOTIFY ;Triggered when a device is selected in the treeview Func RefreshDeviceProperties() Local $hSelected = _GUICtrlTreeView_GetSelection($hTreeView) ;Don't do anything if a class name (root item) was clicked If _GUICtrlTreeView_Level($hTreeView, $hSelected) = 0 Then Return ;Lookup treeview item handle in global array For $X = 0 to Ubound($aAssoc)-1 If $hSelected = $aAssoc[$X][0] Then ;MsgBox(0,"", "Handle: " & $aAssoc[$X][0] & @CRLF & "Unique Instance Id: " & $aAssoc[$X][1]) ;Build list of ALL device classes _DeviceAPI_GetClassDevices() ;Loop through all devices by index While _DeviceAPI_EnumDevices() If $aAssoc[$X][1] = _DeviceAPI_GetDeviceId() Then ;Empty listview _GUICtrlListView_DeleteAllItems($hListView) GUICtrlCreateListViewItem ("Hardware ID: |" & _DeviceAPI_GetDeviceRegistryProperty($SPDRP_HARDWAREID), $hListView ) GUICtrlCreateListViewItem ("Unique Instance ID: |" & _DeviceAPI_GetDeviceId(), $hListView ) GUICtrlCreateListViewItem ("Manufacturer: |" & _DeviceAPI_GetDeviceRegistryProperty($SPDRP_MFG), $hListView ) GUICtrlCreateListViewItem ("Driver: |" & _DeviceAPI_GetDeviceRegistryProperty($SPDRP_DRIVER), $hListView ) GUICtrlCreateListViewItem ("Friendly Name: |" & _DeviceAPI_GetDeviceRegistryProperty($SPDRP_FRIENDLYNAME), $hListView ) GUICtrlCreateListViewItem ("Physical Device Object Name: |" & _DeviceAPI_GetDeviceRegistryProperty($SPDRP_PHYSICAL_DEVICE_OBJECT_NAME), $hListView ) GUICtrlCreateListViewItem ("Upper Filters: |" & _DeviceAPI_GetDeviceRegistryProperty($SPDRP_UPPERFILTERS), $hListView ) GUICtrlCreateListViewItem ("Lower Filters: |" & _DeviceAPI_GetDeviceRegistryProperty($SPDRP_LOWERFILTERS), $hListView ) GUICtrlCreateListViewItem ("Enumerator: |" & _DeviceAPI_GetDeviceRegistryProperty($SPDRP_ENUMERATOR_NAME), $hListView ) ;Resize columns to fit text _GUICtrlListView_SetColumnWidth($hListView, 0,$LVSCW_AUTOSIZE) _GUICtrlListView_SetColumnWidth($hListView, 1,$LVSCW_AUTOSIZE) EndIf WEnd EndIf Next EndFunc ;Cleanup image list _DeviceAPI_DestroyClassImageList() _DeviceAPI_DestroyDeviceInfoList() ;Cleanup for good measure |
------- Последний раз редактировалось saavaage, 06-08-2010 в 00:17. Отправлено: 00:03, 06-08-2010 | #3 |
Ветеран Сообщения: 812
|
Профиль | Отправить PM | Цитировать saavaage,
Мне кажется, что надо копать в сторону системной библиотеки devmgr.dll. В ней есть 4 функции DeviceProblem.... Но как ей пользоваться, я не знаю. |
Отправлено: 10:14, 06-08-2010 | #4 |
Ветеран Сообщения: 903
|
Профиль | Отправить PM | Цитировать madmasles, к сожалению для меня, я -тоже не знаю... Остается надеяться, что, м.б., Creat0R, что-нибудь подскажет...
|
|
------- Отправлено: 10:25, 06-08-2010 | #5 |
Ветеран Сообщения: 812
|
Профиль | Отправить PM | Цитировать saavaage,
Найти неизвестные устройства у меня получилось так: #include "DeviceAPI.au3" #include <Array.au3> $j = 0 $aDiv = _DeviceAPI_GetClassArray() ;_ArrayDisplay($aDiv) Dim $aUnknownDiv[1][3] For $i = 0 To UBound($aDiv) - 1 If StringInStr($aDiv[$i][1], 'Unknown') Then $j += 1 ReDim $aUnknownDiv[UBound($aUnknownDiv) + 1][3] $aUnknownDiv[$j][0] = $aDiv[$i][0] $aUnknownDiv[$j][1] = $aDiv[$i][1] $aUnknownDiv[$j][2] = $aDiv[$i][2] EndIf Next $aUnknownDiv[0][0] = UBound($aUnknownDiv) - 1 _ArrayDisplay($aUnknownDiv) |
Отправлено: 21:26, 12-08-2010 | #6 |
Ветеран Сообщения: 903
|
Профиль | Отправить PM | Цитировать madmasles, а выйти на название оборудования (в стиле авторского вывода) как-нибудь можно?
Я, честно говоря, взялся за изучение справки и еще до массивов не дошел. Поэтому своих версий предложить не могу. Заранее извиняюсь за иждивенческий подход в этом топике (жду манны небесной от гуру autoit). |
Отправлено: 22:38, 12-08-2010 | #7 |
Ветеран Сообщения: 903
|
Профиль | Отправить PM | Цитировать Вообщем, у меня получилось сделать список, слегка изменив файл - пример поста http://forum.oszone.net/post-1467800-3.html,
а именно добавив в соответствующую строку доп. условие: ;Skip classes without devices or devices have drivers If _DeviceAPI_GetDeviceCount() > 0 and _DeviceAPI_GetDeviceRegistryProperty($SPDRP_DRIVER) = '' Then Само собой, что для работы этого скрипта нужна библиотека DeviceAPI.au3, указанная madmasles в одном из вышестоящих постов. Просьба to All, проверить работу скрипта на корректность. |
------- Отправлено: 18:48, 06-09-2010 | #8 |
Ветеран Сообщения: 825
|
Профиль | Отправить PM | Цитировать saavaage, У меня к сожалению выводится только окно без всякого списка, хотя одно устройство без драйверов есть. Это USB hub.
Как планируется использовать данный скрипт? Я в свое время хотел сделать такой для составления списка для значения OemPnPDriversPath в файле winnt.sif. То есть где нить на Т40 он запускается, составляет список устройств, ищет драйвера и найденные пути приписывает в OemPnPDriversPath. Вы не то же самое планируете? |
Отправлено: 10:35, 07-09-2010 | #9 |
Ветеран Сообщения: 903
|
Профиль | Отправить PM | Цитировать NikLok, нет.
Честно говоря, пока только осваиваю autoit (пошел 2-ой месяц), раньше опыта программирования не имел. Поэтому чувствую себя очень неуверенно. Решил в качестве "контрольной работы" по введению в основы autoit , сделать утилиту по диагностике системы сразу после установки XP + драйверов (у меня часть из них ставится вместе с системой). Будет несколько вкладок, одна из них - Оборудование без драйверов. Думаю через неделю-другую выложить свой первый "блин". Насчет драйверов - тестировал на своем ПК (отрубив дрова на модем) - вроде отобразило то, что надо. Насчет Цитата NikLok:
|
|
------- Отправлено: 10:51, 07-09-2010 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Драйвер - Проблема с установкой оборудования и драйверами | amadeu | Microsoft Windows Vista | 1 | 27-06-2008 18:57 | |
Firewall - ISA2004 - как получить доступ извне к внут.IP адресу оборудования | Evgesha_572 | Сетевые технологии | 13 | 21-04-2008 22:28 | |
Как получить список пользователей AD? | Evgeniy15 | Microsoft Windows NT/2000/2003 | 10 | 09-04-2007 18:03 | |
Удаленно получить список процессов | Dronec | Сетевые технологии | 1 | 25-09-2004 12:49 | |
Удаленно получить список процессов | Dronec | Защита компьютерных систем | 4 | 24-09-2004 14:41 |
|