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

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

Ответить
Настройки темы
PowerShell - [решено] извлечь данные о мониторах из реестра

Старожил


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

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


Изменения
Автор: Griboed0ff
Дата: 17-09-2021
Доброго всем времени суток! Есть задача получить данные о мониторах в винде, а именно модель и серийный номер. Данные хранятся в реестре ("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY") в бинарном виде. Есть батник DispEDID, который умеет считывать и переводить в читабельный вид модель и серийник. Проблема в том, что данный батник выдает данные только 1 монитора, а если их 2 или 3 то, покажет данные последнего. Мозгов переписать такой сложный батник не хватает. Подумал может эту задачу проще решить через ps, по идее надо просто снять данные, конвертировать на человеческий, отправить в .cvs

Отправлено: 12:07, 17-04-2020

 

Ветеран


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

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


Griboed0ff, обратите внимание ещё на:
Код: Выделить весь код
wmic.exe DesktopMonitor get /value
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:44, 17-04-2020 | #2



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

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


Старожил


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

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


Iska, данная команда не дает нужных данных. Они хранятся в бинарном виде и просто одной командой их не получить. Иначе зачем городили большой батник, если все было так просто.

Последний раз редактировалось Griboed0ff, 17-09-2021 в 15:33.


Отправлено: 13:06, 17-04-2020 | #3


(*.*)


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

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


Почитайте дискуссию в чате инсайдеров https://telega.at/winsiders/492449

-------
Канал Windows 11, etc | Чат @winsiders

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:09, 17-04-2020 | #4


Ветеран


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

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


Griboed0ff, а у меня даёт бо́́льшую часть:
Скрытый текст
Код: Выделить весь код
C:\Мои проекты\0310>wmic.exe DesktopMonitor get /value


Availability=3
Bandwidth=
Caption=Philips 243V5 (23.6inch Wide LCD MONITOR 243V5)
ConfigManagerErrorCode=0
ConfigManagerUserConfig=FALSE
CreationClassName=Win32_DesktopMonitor
Description=Philips 243V5 (23.6inch Wide LCD MONITOR 243V5)
DeviceID=DesktopMonitor1
DisplayType=
ErrorCleared=
ErrorDescription=
InstallDate=
IsLocked=
LastErrorCode=
MonitorManufacturer=Philips Electronics
MonitorType=Philips 243V5 (23.6inch Wide LCD MONITOR 243V5)
Name=Philips 243V5 (23.6inch Wide LCD MONITOR 243V5)
PixelsPerXLogicalInch=96
PixelsPerYLogicalInch=96
PNPDeviceID=DISPLAY\PHLC0D1\4&2ED0BDF8&0&UID16843008
PowerManagementCapabilities=
PowerManagementSupported=
ScreenHeight=1080
ScreenWidth=1920
Status=OK
StatusInfo=
SystemCreationClassName=Win32_ComputerSystem
SystemName=XXX

Серийного номера в выдаче нет.

Отправлено: 13:33, 17-04-2020 | #5


Старожил


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

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


нашел в дискуссии инсайдеров скрипты для ps
первый
Function Get-MonitorInfo
{
[CmdletBinding()]
Param
(
[Parameter(
Position=0,
ValueFromPipeLine=$true,
ValueFromPipeLineByPropertyName=$true)]
[string]$name = '.'
)

Process
{

$ActiveMonitors = Get-WmiObject -Namespace root\wmi -Class wmiMonitorID -ComputerName $name
$monitorInfo = @()

foreach ($monitor in $ActiveMonitors)
{
$mon = New-Object PSObject
$manufacturer = $null
$product = $null
$serial = $null
$name = $null
$week = $null
$year = $null

$monitor.ManufacturerName | foreach {$manufacturer += [char]$_}
$monitor.ProductCodeID | foreach {$product += [char]$_}
$monitor.SerialNumberID | foreach {$serial += [char]$_}
$monitor.UserFriendlyName | foreach {$name += [char]$_}

$mon | Add-Member NoteProperty Manufacturer $manufacturer
$mon | Add-Member NoteProperty ProductCode $product
$mon | Add-Member NoteProperty SerialNumber $serial
$mon | Add-Member NoteProperty Name $name
$mon | Add-Member NoteProperty Week $monitor.WeekOfManufacture
$mon | Add-Member NoteProperty Year $monitor.YearOfManufacture

$monitorInfo += $mon
}
$monitorInfo |
}
}

второй
Function Get-MonitorInfo
{
[CmdletBinding()]
Param
(
[Parameter(
Position=0,
ValueFromPipeLine=$true,
ValueFromPipeLineByPropertyName=$true)]
[alias("CN","MachineName","Name","Computer")]
[string[]]$ComputerName = $ENV:ComputerName
)

Begin {
$pipelineInput = -not $PSBoundParameters.ContainsKey('ComputerName')
}

Process
{
Function DoWork([string]$ComputerName) {
$ActiveMonitors = Get-WmiObject -Namespace root\wmi -Class wmiMonitorID -ComputerName $ComputerName
$monitorInfo = @()

foreach ($monitor in $ActiveMonitors)
{
$mon = $null

$mon = New-Object PSObject -Property @{
ManufacturerName=($monitor.ManufacturerName | % {[char]$_}) -join ''
ProductCodeID=($monitor.ProductCodeID | % {[char]$_}) -join ''
SerialNumberID=($monitor.SerialNumberID | % {[char]$_}) -join ''
UserFriendlyName=($monitor.UserFriendlyName | % {[char]$_}) -join ''
ComputerName=$ComputerName
WeekOfManufacture=$monitor.WeekOfManufacture
YearOfManufacture=$monitor.YearOfManufacture}

$monitorInfo += $mon
}
Write-Output $monitorInfo
}

if ($pipelineInput) {
DoWork($ComputerName)
} else {
foreach ($item in $ComputerName) {
DoWork($item)
}
}
}
}

Оба обрабатывают без ошибок, но и результат не выводят. просто запустил и ничего не происходит.

Отправлено: 13:50, 17-04-2020 | #6


(*.*)


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

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


Нашел скрипты по ссылке, но ссылку не дал https://www.hofferle.com/retrieve-mo...th-powershell/

А так, все работает же, прямо из дискуссии копирую
Код: Выделить весь код
$m = gwmi wmimonitorid -Namespace root\wmi
[string][char[]] ($m.UserFriendlyName) -join ""
[string][char[]] ($m.SerialNumberID) -join ""
Upd. Убрать [string] чтобы не было лишних пробелов:
Код: Выделить весь код
$m = gwmi wmimonitorid -Namespace root\wmi
[char[]] ($m.UserFriendlyName) -join ""
[char[]] ($m.SerialNumberID) -join ""

-------
Канал Windows 11, etc | Чат @winsiders

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:49, 17-04-2020 | #7


Старожил


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

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


Цитата Vadikan:
А так, все работает же, прямо из дискуссии копирую »
Я видимо глазом в беседе за код не зацепился. Действительно работает команда. Спасибо!
Еще небольшой вопросик есть: как направить вывод в .csv, в виде таблицы как на картинке.

Последний раз редактировалось Griboed0ff, 17-09-2021 в 15:33.


Отправлено: 15:42, 17-04-2020 | #8


Ветеран


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

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


А у меня в среде ISE:
Код: Выделить весь код
[string][char[]] ($m.UserFriendlyName) -join ""
приводит к лишним пробелам. Без приведения к [string] — отображение нормальное:
Скрытый текст
Код: Выделить весь код
PS C:\> $m = gwmi wmimonitorid -Namespace root\wmi
[string][char[]] ($m.UserFriendlyName) -join ""
[string][char[]] ($m.SerialNumberID) -join ""
''
[char[]] ($m.UserFriendlyName) -join ""
[char[]] ($m.SerialNumberID) -join ""
P H L   2 4 3 V 5        
Z V 0 1 4 4 3 0 1 3 5 6 3      

PHL 243V5    
ZV01443013563   

PS C:\>

Отправлено: 16:59, 17-04-2020 | #9


(*.*)


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

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


Iska, согласен, но я просто брал код из чата.

Цитата Griboed0ff:
как направить вывод в .csv, в виде таблицы как на картинке. »
CSV это не таблица, а текст. С такими таблицами как на картинке можно мозг сломать, будьте проще...

-------
Канал Windows 11, etc | Чат @winsiders

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:57, 17-04-2020 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - [решено] Как из архивного образа системы извлечь нужные данные реестра? ZurabK Microsoft Windows Vista 5 10-09-2020 12:08
Прочие БД - Восстановить или извлечь данные из Jetxxx.tmp, временного файла MS Access DB tweaxl Программирование и базы данных 2 18-06-2012 02:03
CMD/BAT - [решено] как извлечь все значения определенного ключа реестра из определенной ветки baza450 Скриптовые языки администрирования Windows 6 27-12-2011 13:41
HDD - Как извлечь данные с жёсткого диска Alla65 Накопители (SSD, HDD, USB Flash) 8 17-04-2009 18:27
MySQL - [решено] Извлечь данные одним запросом Strange_V Программирование и базы данных 4 20-02-2008 23:18




 
Переход