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

Компьютерный форум 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

 

Ветеран


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

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


Цитата Griboed0ff:
по идее и здесь можно через пошик 7 запараллелить »
Только вместо Get-WmiObject Get-Ciminstance, первого нет.
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:56, 09-05-2020 | #31



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

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


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Griboed0ff:
а надо, »
именно так, не получится, но можно так:
Цитата:
VLK-ROZN-10;HP E231;6CM421144B
KHB-DAOR-06;SMB2230N;HLOB101779
KHB-DAOR-06;HP W2072a;CNC302Q39B
Для этого, используем вместо простого цикла foreach, командлет foreach-object:
Код: Выделить весь код
...
$pcs2|% {
	$Res = @()
	$forLog = @()
	$name = $_.name
	$logon = $_.LastLogonDate.tostring("dd.MM.yyyy")
	write-host $name -ForegroundColor Green
	if ((Test-Connection -Cn $name -Count 1 -quiet -ErrorAction SilentlyContinue) -eq $False) {
		Write-host "$name;не пингуется"
		$forLog = $name+";"+$_.OperatingSystem+";"+"не пингуется;"+";$logon"+";"+$_.CanonicalName
		$forLog | Out-File $log -Append -Encoding utf8
	} else {
		Write-host "$name пингуется, выполняем проверку"
		$ofs = ''
		gwmi wmimonitorid -Namespace root\wmi -ComputerName $name |
		Select @{n='UserFriendlyName';e={([string][Char[]]$_.UserFriendlyName).SubString(0,$_.UserFriendlyNameLength)}}, @{n='SerialNumberID';e={[string][Char[]]$_.SerialNumberID}} |%{
			[pscustomobject]@{
				'Name' = $name
				'UserFriendlyName' = $_.UserFriendlyName.trim([char]0x0000)
				'SerialNumberID' = $_.SerialNumberID.trim([char]0x0000)
			}
		}
	}
} | convertto-csv -d ';' -notype| Out-File C:\mon\3.csv -enc utf8 -Append
- если всё нормально, то можно будет уже распараллеливать...

Griboed0ff,
Кстати, да, в версии PS 7.0, это обязательно
Цитата Foreigner:
Только вместо Get-WmiObject Get-Ciminstance, первого нет. »
в Core с этим не всё радужно и могут возникнуть затруднения с получением данных через wmi

-------
scio me nihil scire. Ѫ

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

Отправлено: 00:13, 10-05-2020 | #32


Старожил


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

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


Цитата YuS_2:
если всё нормально, то можно будет уже распараллеливать.. »
Скрытый текст
Код: Выделить весь код
Param( #powershell 
	[string]$Region
	)

$myscripname=$myInvocation.ScriptName
 if ($Region -eq "MSK_TT") {
        $OU = "OU=Workstations,OU=TT,OU=Computers,OU=MSK,DC=tsretail,DC=ru"
	} elseif ($Region -eq  "MSK_S") {
        $OU = "OU=Servers,OU=TT,OU=Computers,OU=MSK,DC=tsretail,DC=ru" 
	} elseif ($Region -eq  "VLK_TT") {
        $OU = "OU=Workstations,OU=TT,OU=Computers,OU=VLK,OU=Regions,DC=tsretail,DC=ru"
	} elseif ($Region -eq  "VLK_S") {
        $OU = "OU=Servers,OU=TT,OU=Computers,OU=VLK,OU=Regions,DC=tsretail,DC=ru"		
    } elseif ($Region -eq  "SMR_TT") {
        $OU =  "OU=Workstations,OU=TT,OU=Computers,OU=SMR,OU=Regions,DC=tsretail,DC=ru"
	} elseif ($Region -eq  "SMR_S") {
        $OU = "OU=Servers,OU=TT,OU=Computers,OU=SMR,OU=Regions,DC=tsretail,DC=ru"
    } elseif ($Region -eq  "UFA_TT") {
        $OU = "OU=Workstations,OU=TT,OU=Computers,OU=UFA,OU=Regions,DC=tsretail,DC=ru"
	} elseif ($Region -eq  "UFA_S") {
        $OU = "OU=1C-servers,OU=TT,OU=Computers,OU=UFA,OU=Regions,DC=tsretail,DC=ru"
    } elseif ($Region -eq  "SPB_TT") {
        $OU = "OU=Workstations,OU=TT,OU=Computers,OU=SPB,OU=Regions,DC=tsretail,DC=ru"
	} elseif ($Region -eq  "SPB_S") {
        $OU = "OU=Servers,OU=TT,OU=Computers,OU=SPB,OU=Regions,DC=tsretail,DC=ru"
    } elseif ($Region -eq  "EKT_TT") {
        $OU = "OU=Workstations,OU=TT,OU=Computers,OU=EKT,OU=Regions,DC=tsretail,DC=ru" 
	} elseif ($Region -eq  "EKT_S") {
        $OU = "OU=Servers,OU=TT,OU=Computers,OU=EKT,OU=Regions,DC=tsretail,DC=ru" 
    } elseif ($Region -eq  "VRN_TT") { 
        $OU = "OU=Workstations,OU=TT,OU=Computers,OU=VRN,OU=Regions,DC=tsretail,DC=ru"
	} elseif ($Region -eq  "VRN_S") { 
        $OU = "OU=Servers,OU=TT,OU=Computers,OU=VRN,OU=Regions,DC=tsretail,DC=ru"
    } elseif ($Region -eq  "RND_TT") {
        $OU = "OU=Workstations,OU=TT,OU=Computers,OU=RND,OU=Regions,DC=tsretail,DC=ru"
	} elseif ($Region -eq  "RND_S") {
        $OU = "OU=Servers,OU=TT,OU=Computers,OU=RND,OU=Regions,DC=tsretail,DC=ru"
    } elseif ($Region -eq  "NSK_TT") {
        $OU = "OU=Workstations,OU=TT,OU=Computers,OU=NSK,OU=Regions,DC=tsretail,DC=ru"
	} elseif ($Region -eq  "NSK_S") {
        $OU = "OU=Servers,OU=TT,OU=Computers,OU=NSK,OU=Regions,DC=tsretail,DC=ru"
    } elseif ($Region -eq "MSK_B") {
        $OU = "OU=MainOffice,OU=Computers,OU=MSK,DC=tsretail,DC=ru"
	} elseif ($Region -eq  "VLK_B") {
        $OU = "OU=Office,OU=Computers,OU=VLK,OU=Regions,DC=tsretail,DC=ru"
    } elseif ($Region -eq  "SMR_B") {
        $OU =  "OU=Office,OU=Computers,OU=SMR,OU=Regions,DC=tsretail,DC=ru"
    } elseif ($Region -eq  "UFA_B") {
        $OU = "OU=Office,OU=Computers,OU=UFA,OU=Regions,DC=tsretail,DC=ru"
    } elseif ($Region -eq  "SPB_B") {
        $OU = "OU=Office,OU=Computers,OU=SPB,OU=Regions,DC=tsretail,DC=ru"
    } elseif ($Region -eq  "EKT_B") {
        $OU = "OU=Office,OU=Computers,OU=EKT,OU=Regions,DC=tsretail,DC=ru"
    } elseif ($Region -eq  "VRN_B") { 
        $OU = "OU=Office,OU=Computers,OU=VRN,OU=Regions,DC=tsretail,DC=ru"
    } elseif ($Region -eq  "RND_B") {
        $OU = "OU=Office,OU=Computers,OU=RND,OU=Regions,DC=tsretail,DC=ru"
    } elseif ($Region -eq  "NSK_B") {
        $OU = "OU=Office,OU=Computers,OU=NSK,OU=Regions,DC=tsretail,DC=ru"
 
    } Else {
	    Write-Host "Usage: powershell $myscripname <filename with SQL query> [VLK_TT|MSK_TT|SMR_TT|UFA_TT|SPB_TT|EKT_TT|VRN_TT|RND_TT|NSK_TT|VLK_B|MSK_B|SMR_B|UFA_B|SPB_B|EKT_B|VRN_B|RND_B|NSK_B]"  
	    exit
    } 

    
    #Указываем путь для выгрузки лога
    
    $logdate = $((get-date).tostring("ddMMyy HH_mm"))
    $log = "D:\bat\монитор\no_ping1.csv" #Задайте свой путь для логов
    $pcs2 = get-adcomputer -Filter {Enabled -eq 'True'} -Properties Name, whenCreated, CanonicalName, OperatingSystem, OperatingSystemServicePack, OperatingSystemVersion, LastLogonDate -SearchBase $OU | Select-Object Name, whenCreated, CanonicalName, LastLogonDate, OperatingSystem, OperatingSystemServicePack, OperatingSystemVersion
    $counter = $pcs2.count
    write-host "Прошлись по $OU. Получили $counter записей" -ForegroundColor Yellow
    "Имя ПК;OperatingSystem;доступность;результат проверки;LastLogonDate;CanonicalName;" | Out-File $log -Append -Encoding utf8
    
   $pcs2|% {
	$Res = @()
	$forLog = @()
	$name = $_.name
	$logon = $_.LastLogonDate.tostring("dd.MM.yyyy")
	write-host $name -ForegroundColor Green
	if ((Test-Connection -Cn $name -Count 1 -quiet -ErrorAction SilentlyContinue) -eq $False) {
		Write-host "$name;не пингуется"
		$forLog = $name+";"+$_.OperatingSystem+";"+"не пингуется;"+";$logon"+";"+$_.CanonicalName
		$forLog | Out-File $log -Append -Encoding utf8
	} else {
		Write-host "$name пингуется, выполняем проверку"
		$ofs = ''
		gwmi wmimonitorid -Namespace root\wmi -ComputerName $name |
		Select @{n='UserFriendlyName';e={([string][Char[]]$_.UserFriendlyName).SubString(0,$_.UserFriendlyNameLength)}}, @{n='SerialNumberID';e={[string][Char[]]$_.SerialNumberID}} |%{
			[pscustomobject]@{
				'Name' = $name
				'UserFriendlyName' = $_.UserFriendlyName.trim([char]0x0000)
				'SerialNumberID' = $_.SerialNumberID.trim([char]0x0000)
			}
		}
	}
} | convertto-csv -d ';' -notype| Out-File C:\Users\svushak2\Desktop\инвентаризация\mon\1005.csv -enc utf8 -Append
Работает, но если не решу проблему забивки памяти то распараллеливать пока нет смысла.

если из core запускаю
Скрытый текст
Код: Выделить весь код
get-adcomputer: C:\Users\svushak2\Desktop\инвентаризация\mon\monitor_last2.ps1:71
Line |
  71 |      $pcs2 = get-adcomputer -Filter {Enabled -eq 'True'} -Properties N …
     |              ~~~~~~~~~~~~~~
     | The 'get-adcomputer' command was found in the module 'ActiveDirectory', but the module could not be
     | loaded. For more information, run 'Import-Module ActiveDirectory'.

Прошлись по OU=Office,OU=Computers,OU=EKT,OU=Regions,DC=tsretail,DC=ru. Получили 0 записей
Out-File: C:\Users\svushak2\Desktop\инвентаризация\mon\monitor_last2.ps1:98
Line |
  98 |  … ;' -notype| Out-File C:\Users\svushak2\Desktop\инвентаризация\mon\100 …
     |                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | The process cannot access the file 'C:\Users\svushak2\Desktop\инвентаризация\mon\1005.csv' because it
     | is being used by another process.

Отправлено: 13:55, 10-05-2020 | #33


Ветеран


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

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


Цитата Griboed0ff:
если из core запускаю »
Цитата Griboed0ff:
The 'get-adcomputer' command was found in the module 'ActiveDirectory', but the module could not be
| loaded. For more information, run 'Import-Module ActiveDirectory'. »
Тут по моему все ясно, пропишите или в скрипте, или в консоли перед запуском или в $profile
[code]
Import-Module ActiveDirectory
[/come]

Цитата Griboed0ff:
The process cannot access the file 'C:\Users\svushak2\Desktop\инвентаризация\mon\1005.csv' because it
| is being used by another process. »
Вы запускаете скрипт с помощью Foreach -Parallel? Подозреваю, что несколько скриптов не могут одновременно писать в один файл.

Отправлено: 15:34, 10-05-2020 | #34


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Griboed0ff:
но если не решу проблему забивки памяти то распараллеливать пока нет смысла. »
подберите опытным путем оптимальное число параллельных процессов...
Память никак не управляется, не предусмотрено в командлете, так что тут ничего нового не придумаем.

Цитата Griboed0ff:
если из core запускаю »
Там подсказка написана:
Цитата:
The 'get-adcomputer' command was found in the module 'ActiveDirectory', but the module could not be loaded. For more information, run 'Import-Module ActiveDirectory'.
- если конечно, он будет работать в powershell core, мне проверить не на чем.

А вот вторая ошибка... тут, возможно, одновременная запись в один и тот же файл от разных процессов не получается у out-file, видимо придется export-csv использовать...

-------
scio me nihil scire. Ѫ


Отправлено: 15:46, 10-05-2020 | #35


Старожил


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

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


Цитата Foreigner:
Вы запускаете скрипт с помощью Foreach -Parallel? Подозреваю, что несколько скриптов не могут одновременно писать в один файл. »
нет, просто из core запустил срипт, который выше скрыт.

Отправлено: 16:24, 10-05-2020 | #36


Старожил


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

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


Цитата YuS_2:
подберите опытным путем оптимальное число параллельных процессов... »
даже если поток один, он все равно рано или поздно заполняет память, то есть все зависит от величины входящего списка.

Отправлено: 16:45, 10-05-2020 | #37


Старожил


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

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


Цитата YuS_2:
Там подсказка написана: »
похоже тут долгие проблемы, по идее функция забора списка пк с ад не очень то и нужна, можно и просто по списку из файла.

Отправлено: 19:39, 10-05-2020 | #38


Ветеран


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

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


Цитата YuS_2:
…тут, возможно, одновременная запись в один и тот же файл от разных процессов не получается у out-file, видимо придется export-csv использовать... »
База данных, база данных… .

Отправлено: 21:46, 10-05-2020 | #39


Старожил


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

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


Цитата Griboed0ff:
по идее функция забора списка пк с ад не очень то и нужна, можно и просто по списку из файла. »
и функция записи в лог если не пингуется тоже не нужна. Мб вообще пинг убрать и быстрее получится?

Отправлено: 21:54, 10-05-2020 | #40



Компьютерный форум 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




 
Переход