![]() |
извлечь данные о мониторах из реестра
Доброго всем времени суток! Есть задача получить данные о мониторах в винде, а именно модель и серийный номер. Данные хранятся в реестре ("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY") в бинарном виде. Есть батник DispEDID, который умеет считывать и переводить в читабельный вид модель и серийник. Проблема в том, что данный батник выдает данные только 1 монитора, а если их 2 или 3 то, покажет данные последнего. Мозгов переписать такой сложный батник не хватает. Подумал может эту задачу проще решить через ps, по идее надо просто снять данные, конвертировать на человеческий, отправить в .cvs
|
Griboed0ff, обратите внимание ещё на:
Код:
wmic.exe DesktopMonitor get /value |
Iska, данная команда не дает нужных данных. Они хранятся в бинарном виде и просто одной командой их не получить. Иначе зачем городили большой батник, если все было так просто.
|
Почитайте дискуссию в чате инсайдеров https://telega.at/winsiders/492449
|
Griboed0ff, а у меня даёт бо́́льшую часть:
Скрытый текст
Код:
C:\Мои проекты\0310>wmic.exe DesktopMonitor get /value Серийного номера в выдаче нет. |
нашел в дискуссии инсайдеров скрипты для 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) } } } } Оба обрабатывают без ошибок, но и результат не выводят. просто запустил и ничего не происходит. |
Нашел скрипты по ссылке, но ссылку не дал https://www.hofferle.com/retrieve-mo...th-powershell/
А так, все работает же, прямо из дискуссии копирую Код:
$m = gwmi wmimonitorid -Namespace root\wmi Код:
$m = gwmi wmimonitorid -Namespace root\wmi |
Цитата:
Еще небольшой вопросик есть: как направить вывод в .csv, в виде таблицы как на картинке. |
А у меня в среде ISE:
Код:
[string][char[]] ($m.UserFriendlyName) -join "" Скрытый текст
Код:
PS C:\> $m = gwmi wmimonitorid -Namespace root\wmi |
Iska, согласен, но я просто брал код из чата.
Цитата:
|
Цитата:
Цитата:
Лучше так выводить: Код:
gcim wmimonitorid -name root\wmi|%{$n=1}{ |
Цитата:
Скрытый текст
$ofs="";[string][char[]] ($m.UserFriendlyName) -join ""
$ofs="";[string][char[]] ($m.SerialNumberID) -join "" тоже без пробелов получается. Цитата:
что-то мне подсказывает, что сюда же можно сделать выведение информации о мак адресе\ах, которые есть на этом пк. Или лучше отдельную тему завести? |
Цитата:
|
Цитата:
Цитата:
|
YuS_2, с какой версии она появилась?
|
Цитата:
либо Код:
$ofs="";[string] Код:
-join "" Лучше получать данные так: Код:
$ofs = '' У встроенных мониторов (ноутбуки, моноблоки) нет ни модели, ни серийного номера. |
Цитата:
$OFS
Цитата:
|
YuS_2, спасибо, ясно. Значит, я как обычно «прощёлкал».
Нет, PowerShell точно повёрнутый на всю голову язык. |
Цитата:
|
Цитата:
|
Цитата:
никак иначе инвентаризация не проводится всевозможная автоматизация - это помощь по отслеживанию изменений, а не первоисточник |
тут больше для отслеживания изменений, даже больше для истории. а то всплывают мониторы где то на складе и никто не знает откуда они взялись, а так хотя бы примерно знать где этот моник был. Если эти данные будут на 80%-90% правдивы уже хорошо. Но сразу же встретил проблему, одна модель мониторов имеет одинаковый серийник.
|
Griboed0ff, наклеечки, наклеечки наше всё. Ну, или — выжигатель для особо тяжёлых случаев.
|
Цитата:
Код:
Param( #powershell Код:
D877-2 Код:
D877-2;HP W2072a;CNC434P359; |
Как думаете, если из этого скрипта убрать пинг, будет ли быстрей перебор?
|
Цитата:
|
Цитата:
Откуда вообще вот эта строка: Цитата:
В исходном варианте разве так было? |
Цитата:
Цитата:
скрипт запрашивает список пк с ou ad, пингует разок, если пингуется то выполняется команда, если нет то пишет куда там надо. |
Griboed0ff,
так, вот и сравните то, что я выделил... именно поэтому у Вас результат совсем не тот, что ожидается... Тут надо бы Вам показать, что получаете с нескольких компьютеров и что именно, необходимо получить... |
Цитата:
Скрытый текст
Код:
KHB-BUH-04 Скрытый текст
Код:
VLK-ROZN-10;HP E231;6CM421144B это имя пк, с которого снимаются данные, модель монитора, серийник, вторая модель, второй серийник(если мониторов 2) по идее и здесь можно через пошик 7 запараллелить для ускорения процесса как понимаю просто надо поместить в Код:
% -parallel {...} -throttlelimit 4 |
Цитата:
|
Цитата:
Цитата:
Код:
... Griboed0ff, Кстати, да, в версии PS 7.0, это обязательно Цитата:
|
Цитата:
Скрытый текст
Код:
Param( #powershell если из core запускаю Скрытый текст
Код:
get-adcomputer: C:\Users\svushak2\Desktop\инвентаризация\mon\monitor_last2.ps1:71 |
Цитата:
Цитата:
[code] Import-Module ActiveDirectory [/come] Цитата:
|
Цитата:
Память никак не управляется, не предусмотрено в командлете, так что тут ничего нового не придумаем. Цитата:
Цитата:
А вот вторая ошибка... тут, возможно, одновременная запись в один и тот же файл от разных процессов не получается у out-file, видимо придется export-csv использовать... |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
export-csv справится... вон, там ведь справляется :) Цитата:
|
Цитата:
Код:
Get-WmiObject Win32_NetworkAdapter -Filter 'AdapterTypeId = 0 and MACAddress is not null' Код:
Get-NetAdapter -Physical |? ndismedium -eq 0 первая команда выдает все интерфейсы, вторая только физические, как вот из физических проводную выбрать. |
Время: 14:59. |
Время: 14:59.
© OSzone.net 2001-