Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Видеоадаптер (http://forum.oszone.net/showthread.php?t=327647)

jkadaba 16-06-2017 09:35 2745071

Видеоадаптер
 
Каким образом можно узнать модель видеокарты и ассоциированный с ней раздел реестра? Через WMI можно получить только первое, а второе как сделать?

Iska 16-06-2017 10:21 2745079

jkadaba, а что именно Вы подразумеваете под:
Цитата:

Цитата jkadaba
ассоциированный с ней раздел реестра »

?

greg zakharov 16-06-2017 11:15 2745102

Также хотелось бы задать вопрос касательно ассоциированного раздела реестра, но все же попробую телепатировать что же имелось в виду. Вроде бы как упомянался 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 путем простого сопоставления значений реестра.


Время: 00:07.

Время: 00:07.
© OSzone.net 2001-