Войти

Показать полную графическую версию : Видеоадаптер


jkadaba
16-06-2017, 09:35
Каким образом можно узнать модель видеокарты и ассоциированный с ней раздел реестра? Через WMI можно получить только первое, а второе как сделать?

Iska
16-06-2017, 10:21
jkadaba, а что именно Вы подразумеваете под:
ассоциированный с ней раздел реестра »
?

greg zakharov
16-06-2017, 11:15
Также хотелось бы задать вопрос касательно ассоциированного раздела реестра, но все же попробую телепатировать что же имелось в виду. Вроде бы как упомянался WMI, так вот если внимательно посмотреть на вывод:
Get-WmiObject -Namespace root\cimv2 -Class Win32_VideoController
среди прочего можно заметить свойство PNPDeviceID, указывающее на значения в реестре по пути HKLM\SYSTEM\CurrentControlSet\PCI; там можно найти любую интересующую Вас информацию, а в подразделе, вроде бы, Control есть параметр ActiveService, указывающий на соответсвующий сервис, данные по которому можно отыскать в HKLM\SYSTEM\CurrentControlSet\Services. В принципе, если речь шла о сопутствующем сервисе, можно задействовать WinAPI'шную функцию EnumDisplayDevice(A|W). Например:
function Get-DisplayDevices {
<#
.SYNOPSIS
Gets information about the display devices in the current session.
.NOTES
Author: greg zakharov

typedef struct _DISPLAY_DEVICE { // A | W
DWORD cb; // +0x000 | +0x000
TCHAR DeviceName[32]; // +0x004 | +0x004
TCHAR DeviceString[128]; // +0x024 | +0x044
DWORD StateFlags; // +0x0a4 | +0x144
TCHAR DeviceID[128]; // +0x0a8 | +0x148
TCHAR DeviceKey[128]; // +0x128 | +0x248
} DISPLAY_DEVICE, *PDISPLAY_DEVICE;

sizeof(DISPLAY_DEVICE) // 0x1a8 | 0x348
#>
begin {
$user32, $STATE_FLAGS = (New-Delegate user32 -Signature @{
EnumDisplayDevicesW = [Func[[Byte[]], UInt32, [Byte[]], UInt32, Boolean]]
}), @{
AttachedToDesktop = 0x00000001
MultiDriver = 0x00000002
PrimaryDevice = 0x00000004
MirroringDrive = 0x00000008
VgaCompatible = 0x00000010
Removable = 0x00000020
UnsfaeModesOn = 0x00080000
DeviceTSCompatible = 0x00200000
Disconnect = 0x02000000
Remote = 0x04000000
ModeSpruned = 0x08000000
}
}
process {
$ddw = New-Object Byte[](0x348) # DISPLAY_DEVICEW
# set size of the DISPLAY_DEVICEW structure before use it
$ddw[0] = 0x048
$ddw[1] = 0x003

$i = 0
while ($user32.EnumDisplayDevicesW.Invoke($null, $i, $ddw, 0)) {
New-Object PSObject -Property @{
DeviceName = [Text.Encoding]::Unicode.GetString($ddw[4..35])
DeviceString = [Text.Encoding]::Unicode.GetString($ddw[68..195])
StateFlags = $(
$f = [BitConverter]::ToUInt32($ddw[324..327], 0)
foreach ($key in $STATE_FLAGS.Keys) {
if (($f -band $STATE_FLAGS[$key]) -eq $STATE_FLAGS[$key]) { $key }
}
)
DeviceID = [Text.Encoding]::Unicode.GetString($ddw[328..455])
DeviceKey = [Text.Encoding]::Unicode.GetString(
$ddw[584..839]
).Trim("`0") -replace '\\registry\\machine', 'HKLM'
} | Select-Object DeviceName, DeviceString, StateFlags, DeviceID, DeviceKey
$i++
}
}
end {}
}
Вывод примера выше довольно объемный, но Вас это не должно смущать. Основное видеоустройство помечано как PrimaryDevice в StateFlags;DeviceID - то же, что и PNPDeviceID, а DeviceKey указывает на Services в реестре. Хотя в принципе можно все то же получить с помощью командлетов Get-WmiObject, Get-ItemProperty путем простого сопоставления значений реестра.




© OSzone.net 2001-2012