Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Получить список оборудования с неустановленными/неправильно установленными драйверами

Ответить
Настройки темы
[решено] Получить список оборудования с неустановленными/неправильно установленными драйверами

Ветеран


Сообщения: 903
Благодарности: 161


Конфигурация

Профиль | Отправить PM | Цитировать


Собственно проблема:

1. Можно ли штатными средствами autoit получить список проблемного оборудования в системе? Под проблемным я понимаю: без драйверов, с некорректно работающим (установленными) драйверами.
Если, да, то покажите где искать. Буду благодарен за любую помощь.
2. Список - в простом виде (Название железа - проблема), в виде Диспетчера устройств с таким же функционалом (но только, не всех, а проблемных) было бы идеально.

PS "штатными" означает - без использования сторонних утилит. Использовать "родные" средства Win XP можно.

Отправлено: 22:15, 05-08-2010

 

Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


saavaage,
Есть такая UDF: DeviceAPI.au3. Посмотрите в ней.
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:48, 05-08-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 903
Благодарности: 161

Профиль | Отправить 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
Есть подозрение, что надо рыть в сторону функции _DeviceAPI_GetDeviceRegistryProperty и делать проверку на отсутствие значения у переменной $SPDRP_DRIVER, но как это вставить в скрипт?

-------
мы рождены, чтоб сказку сделать былью


Последний раз редактировалось saavaage, 06-08-2010 в 00:17.


Отправлено: 00:03, 06-08-2010 | #3


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


saavaage,
Мне кажется, что надо копать в сторону системной библиотеки devmgr.dll. В ней есть 4 функции DeviceProblem.... Но как ей пользоваться, я не знаю.
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:14, 06-08-2010 | #4


Ветеран


Сообщения: 903
Благодарности: 161

Профиль | Отправить PM | Цитировать


madmasles, к сожалению для меня, я -тоже не знаю... Остается надеяться, что, м.б., Creat0R, что-нибудь подскажет...

-------
мы рождены, чтоб сказку сделать былью


Отправлено: 10:25, 06-08-2010 | #5


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить 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
Благодарности: 161

Профиль | Отправить PM | Цитировать


madmasles, а выйти на название оборудования (в стиле авторского вывода) как-нибудь можно?

Я, честно говоря, взялся за изучение справки и еще до массивов не дошел. Поэтому своих версий предложить не могу. Заранее извиняюсь за иждивенческий подход в этом топике (жду манны небесной от гуру autoit).

Отправлено: 22:38, 12-08-2010 | #7


Ветеран


Сообщения: 903
Благодарности: 161

Профиль | Отправить 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
полностью новый код примера:

читать дальше »
Код: Выделить весь код
#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 or devices have  drivers 
	If _DeviceAPI_GetDeviceCount() > 0 and _DeviceAPI_GetDeviceRegistryProperty($SPDRP_DRIVER) = '' 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
		    EndIf


			;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


Само собой, что для работы этого скрипта нужна библиотека DeviceAPI.au3, указанная madmasles в одном из вышестоящих постов.

Просьба to All, проверить работу скрипта на корректность.

-------
мы рождены, чтоб сказку сделать былью


Отправлено: 18:48, 06-09-2010 | #8


Ветеран


Сообщения: 825
Благодарности: 50

Профиль | Отправить PM | Цитировать


saavaage, У меня к сожалению выводится только окно без всякого списка, хотя одно устройство без драйверов есть. Это USB hub.
Как планируется использовать данный скрипт?
Я в свое время хотел сделать такой для составления списка для значения OemPnPDriversPath в файле winnt.sif.

То есть где нить на Т40 он запускается, составляет список устройств, ищет драйвера и найденные пути приписывает в OemPnPDriversPath.

Вы не то же самое планируете?

Отправлено: 10:35, 07-09-2010 | #9


Ветеран


Сообщения: 903
Благодарности: 161

Профиль | Отправить PM | Цитировать


NikLok, нет.
Честно говоря, пока только осваиваю autoit (пошел 2-ой месяц), раньше опыта программирования не имел. Поэтому чувствую себя очень неуверенно. Решил в качестве "контрольной работы" по введению в основы autoit , сделать утилиту по диагностике системы сразу после установки XP + драйверов (у меня часть из них ставится вместе с системой). Будет несколько вкладок, одна из них - Оборудование без драйверов. Думаю через неделю-другую выложить свой первый "блин".
Насчет драйверов - тестировал на своем ПК (отрубив дрова на модем) - вроде отобразило то, что надо.
Насчет
Цитата NikLok:
USB hub »
ничего конкретного сказать не могу. Скорее всего, Вам надо обратиться к автору библиотеки (ссылка дана в топике madmasles).

-------
мы рождены, чтоб сказку сделать былью


Отправлено: 10:51, 07-09-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Получить список оборудования с неустановленными/неправильно установленными драйверами

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Драйвер - Проблема с установкой оборудования и драйверами 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




 
Переход