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

Griboed0ff 17-04-2020 12:07 2917655

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

Iska 17-04-2020 12:44 2917662

Griboed0ff, обратите внимание ещё на:
Код:

wmic.exe DesktopMonitor get /value

Griboed0ff 17-04-2020 13:06 2917664

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

Vadikan 17-04-2020 13:09 2917667

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

Iska 17-04-2020 13:33 2917674

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


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

Griboed0ff 17-04-2020 13:50 2917680

нашел в дискуссии инсайдеров скрипты для 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)
}
}
}
}

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

Vadikan 17-04-2020 14:49 2917690

Нашел скрипты по ссылке, но ссылку не дал 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 ""


Griboed0ff 17-04-2020 15:42 2917699

Цитата:

Цитата Vadikan
А так, все работает же, прямо из дискуссии копирую »

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

Iska 17-04-2020 16:59 2917711

А у меня в среде 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:\>


Vadikan 17-04-2020 17:57 2917723

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

Цитата:

Цитата Griboed0ff
как направить вывод в .csv, в виде таблицы как на картинке. »

CSV это не таблица, а текст. С такими таблицами как на картинке можно мозг сломать, будьте проще...

YuS_2 17-04-2020 19:31 2917736

Цитата:

Цитата Vadikan
можно мозг сломать »

или глаза, как минимум :)

Цитата:

Цитата Griboed0ff
как направить вывод в .csv, в виде таблицы как на картинке. »

Вывод в csv, просто. А про таблицы уже сказали.
Лучше так выводить:
Код:

gcim wmimonitorid -name root\wmi|%{$n=1}{
    [pscustomobject]@{
        'Монитор' = $n
        'Модель'= -join [char[]]$_.UserFriendlyName
        'Серийный номер' = -join [char[]]$_.SerialNumberID
    }
    $n++
}|export-csv out.csv -notype -enc utf8 -d ';'


Griboed0ff 18-04-2020 08:20 2917788

Цитата:

Цитата Iska
приводит к лишним пробелам. Без приведения к [string] — отображение нормальное: »

в переписке такое решение:
Скрытый текст
$ofs="";[string][char[]] ($m.UserFriendlyName) -join ""
$ofs="";[string][char[]] ($m.SerialNumberID) -join ""

тоже без пробелов получается.

Цитата:

Цитата YuS_2
Лучше так выводить: »

Спасибо! Мне как раз нужно было просто понятное представление.

что-то мне подсказывает, что сюда же можно сделать выведение информации о мак адресе\ах, которые есть на этом пк. Или лучше отдельную тему завести?

Iska 18-04-2020 08:39 2917791

Цитата:

Цитата Griboed0ff
Или лучше отдельную тему завести? »

Или.

YuS_2 18-04-2020 08:48 2917793

Цитата:

Цитата Griboed0ff
$ofs="" »

автоматическая переменная, имеющая значение по умолчанию:
Цитата:

$OFS
$OFS is a special variable that stores a string that you want to use as an output field separator. Use this variable when you are converting an array to a string. By default, the value of $OFS is " ", but you can change the value of $OFS in your session, by typing $OFS="<value>". If you are expecting the default value of " " in your script, module, or configuration output, be careful that the $OFS default value has not been changed elsewhere in your code.
Examples:
PS> $a="1","2","3","4"
PS> $a
1
2
3
4

PS> [string]$a
1 2 3 4
PS> $OFS="";[string]$a
1234

PS> $OFS=",";[string]$a
1,2,3,4

PS> $OFS="--PowerShellRocks--";[string]$a
1--PowerShellRocks--2--PowerShellRocks--3--PowerShellRocks--4
PS> $OFS="`n`n";[string]$a
1

2

3

4

Iska 18-04-2020 11:51 2917810

YuS_2, с какой версии она появилась?

Busla 18-04-2020 12:06 2917815

Цитата:

Цитата Griboed0ff
в переписке такое решение:
Код:

$ofs="";[string][char[]] ($m.UserFriendlyName) -join ""
»

очередные заклинатели компьютеров писали
либо
Код:

$ofs="";[string]
либо
Код:

-join ""
И в мультимониторной конфигурации оно выдаст кашу в ответ

Лучше получать данные так:
Код:

$ofs = ''
gwmi wmimonitorid -Namespace root\wmi | Select @{n='UserFriendlyName';e={([string][Char[]]$_.UserFriendlyName).SubString(0,$_.UserFriendlyNameLength)}}, @{n='SerialNumberID';e={[string][Char[]]$_.SerialNumberID}}

Как показывает практика, SerialNumberID не всегда то, что написано на наклейке, и может выдавать разное на разных разъёмах одного и того же монитора.
У встроенных мониторов (ноутбуки, моноблоки) нет ни модели, ни серийного номера.

YuS_2 18-04-2020 16:33 2917847

Цитата:

Цитата Iska
с какой версии она появилась? »

с версии 2.0 она точно есть... правда там описание своеобразное:
$OFS
Цитата:

$OFS
----
Output Field Separator. Задает знак, разделяющий элементы
массива при преобразовании массива в строку.

Допустимые значения: любая строка.
Значение по умолчанию: пробел

По умолчанию переменная $OFS не существует и знаком-разделител
ем для выходных файлов является пробел, но пользователь может
добавить эту переменную и присвоить ей в качестве значения
любую строку.

ПРИМЕРЫ

Этот пример показывает, что при преобразовании массива в строку
для разделения значений используется пробел. В данном случае
массив целых чисел сохраняется в переменной, а затем переменная
приводится к типу string.

PS> $array = 1,2,3 # Сохраняется массив целых чисел.

PS> [string]$array # Массив приводится к типу string.
1 2 3 # Элементы разделяются пробелами


Чтобы изменить разделитель, добавьте переменную $OFS, назначив ей
значение. Для корректной работы переменная должна называться $OFS.

PS> $OFS = "+" # Создается переменная $OFS, ей присваивается значение "+"

PS> [string]$array # Команда повторяется
1+2+3 # Элементы разделяются знаками плюс


Чтобы восстановить поведение по умолчанию, можно присвоить пробел
(" ") в качестве значения переменной $OFS или удалить переменную.
Следующая команда удаляет переменную, затем выполняется проверка,
что разделителем является пробел.

PS> Remove-Variable OFS # Удаление переменной $OFS
PS>

PS> [string]$array # Команда повторяется
1 2 3 # Элементы разделяются пробелами

Iska 18-04-2020 17:58 2917851

YuS_2, спасибо, ясно. Значит, я как обычно «прощёлкал».

Нет, PowerShell точно повёрнутый на всю голову язык.

Griboed0ff 19-04-2020 09:51 2917928

Цитата:

Цитата Busla
И в мультимониторной конфигурации оно выдаст кашу в ответ
Лучше получать данные так: »

Код предложенный ранее и ваш выдают одинаковые значения на пк где 2 монитора.

Griboed0ff 19-04-2020 09:57 2917930

Цитата:

Цитата Busla
Как показывает практика, SerialNumberID не всегда то, что написано на наклейке, и может выдавать разное на разных разъёмах одного и того же монитора.
У встроенных мониторов (ноутбуки, моноблоки) нет ни модели, ни серийного номера. »

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

Busla 19-04-2020 11:49 2917950

Цитата:

Цитата Griboed0ff
как проводить инвентаризацию непонятно »

ножками дойти, ручками потрогать, внести в инвентарную опись, распечатать и подписаться под ней
никак иначе инвентаризация не проводится

всевозможная автоматизация - это помощь по отслеживанию изменений, а не первоисточник

Griboed0ff 19-04-2020 11:55 2917952

тут больше для отслеживания изменений, даже больше для истории. а то всплывают мониторы где то на складе и никто не знает откуда они взялись, а так хотя бы примерно знать где этот моник был. Если эти данные будут на 80%-90% правдивы уже хорошо. Но сразу же встретил проблему, одна модель мониторов имеет одинаковый серийник.

Iska 19-04-2020 14:54 2917985

Griboed0ff, наклеечки, наклеечки наше всё. Ну, или — выжигатель для особо тяжёлых случаев.

Griboed0ff 08-05-2020 11:27 2920311

Цитата:

Цитата Busla
$ofs = ''
gwmi wmimonitorid -Namespace root\wmi | Select @{n='UserFriendlyName';e={([string][Char[]]$_.UserFriendlyName).SubString(0,$_.UserFriendlyNameLength)}}, @{n='SerialNumberID';e={[string][Char[]]$_.SerialNumberID}} »

Вставил код в скрипт, но не могу вывод настроить, точнее вообще не понимаю, что влияет на расположение ответов.
Код:

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
   
    ForEach ($pc in $pcs2) {
       
       
        $Res = @()
        $forLog = @()
        $name = $pc.name
        $logon = $pc.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+";"+$pc.OperatingSystem+";"+"не пингуется;"+";$logon"+";"+$pc.CanonicalName
                $forLog | Out-File $log -Append -Encoding utf8
            } else {
                Write-host "$name пингуется, выполняем проверку"
                $ofs = ''
                gwmi wmimonitorid -Namespace root\wmi -ComputerName $name | Select @{n=$name;e={([string][Char[]]$_.UserFriendlyName).SubString(0,$_.UserFriendlyNameLength)}}, @{n=' ';e={[string][Char[]]$_.SerialNumberID}} | Out-File C:\mon\3.csv -enc utf8 -Append

            }
        }

Вывод получается в столбик:
Код:

D877-2                       
------        -             
HP W2072a CNC434P359

а нужно в с строку:
Код:

D877-2;HP W2072a;CNC434P359;
Возможно export-csv умеет так делать?

Griboed0ff 08-05-2020 11:47 2920313

Как думаете, если из этого скрипта убрать пинг, будет ли быстрей перебор?

Griboed0ff 09-05-2020 19:50 2920509

Цитата:

Цитата YuS_2
Вывод в csv, просто. А про таблицы уже сказали. »

может подскажете на счет вывода?

YuS_2 09-05-2020 20:56 2920523

Цитата:

Цитата Griboed0ff
может подскажете на счет вывода? »

Что именно?
Откуда вообще вот эта строка:
Цитата:

Цитата Griboed0ff
gwmi wmimonitorid -Namespace root\wmi -ComputerName $name | Select @{n=$name;e={([string][Char[]]$_.UserFriendlyName).SubString(0,$_.UserFriendlyNameLength)}}, @{n=' ';e={[string][Char[]]$_.SerialNumberID}} »

?
В исходном варианте разве так было?

Griboed0ff 09-05-2020 21:47 2920533

Цитата:

Цитата YuS_2
Откуда вообще вот эта строка: »

Цитата:

Цитата Busla
Лучше получать данные так:
Код:
$ofs = ''
gwmi wmimonitorid -Namespace root\wmi | Select @{n='UserFriendlyName';e={([string][Char[]]$_.UserFriendlyName).SubString(0,$_.UserFriendlyNameLength)}}, @{n='SerialNumberID';e={[string][Char[]]$_.SerialNumberID}}

а вообще скрипт на другую тему был, я просто нашел куда команду вставить.

скрипт запрашивает список пк с ou ad, пингует разок, если пингуется то выполняется команда, если нет то пишет куда там надо.

YuS_2 09-05-2020 22:20 2920537

Griboed0ff,
так, вот и сравните то, что я выделил... именно поэтому у Вас результат совсем не тот, что ожидается...

Тут надо бы Вам показать, что получаете с нескольких компьютеров и что именно, необходимо получить...

Griboed0ff 09-05-2020 22:54 2920543

Цитата:

Цитата YuS_2
Тут надо бы Вам показать, что получаете с нескольких компьютеров и что именно, необходимо получить... »

Скрытый текст
Код:

KHB-BUH-04                   
----------    -             
HP W2072a CNC302Q39F



VLK-AHO-04                   
----------    -             
HP E231 3CQ4070Y4G



KHB-IT-02                   
---------    -             
HP 2011 CNC215R5VH
HP 2011 CNC215QNNF



VLK-IT-06                   
---------    -             
HP E231 6CM42114X6
HP E231 6CM42114RY



KHB-IT-04                   
---------    -             
HP 2011 CNC215QNNC
HP E231 6CM42114X4



VLK-AHO-01                   
----------    -             
HP W2072a CNC302Q39H



KHB-DAOR-06                 
-----------  -             
SMB2230N HLOB101779
ASUS MW221C 78L80D5514



KHB-KRD-03                   
----------    -             
HP W2072a CNC241PFMX



KHB-STORE-03                 
------------  -             
HP E231 3CQ4070YB5



VLK-DUO-03                   
----------    -             
HP W2072a CNC302Q39B



VLK-OB-02                   
---------    -             
HP E231 6CM421144B



VLK-ROZN-10                 
-----------  -             
HP E231 3CQ3480R5R

а надо,
Скрытый текст
Код:

VLK-ROZN-10;HP E231;6CM421144B
KHB-DAOR-06;SMB2230N;HLOB101779;HP W2072a;CNC302Q39B



это имя пк, с которого снимаются данные, модель монитора, серийник, вторая модель, второй серийник(если мониторов 2)

по идее и здесь можно через пошик 7 запараллелить для ускорения процесса

как понимаю просто надо поместить в
Код:

% -parallel {...} -throttlelimit 4

Foreigner 09-05-2020 23:56 2920552

Цитата:

Цитата Griboed0ff
по идее и здесь можно через пошик 7 запараллелить »

Только вместо Get-WmiObject Get-Ciminstance, первого нет.

YuS_2 10-05-2020 00:13 2920555

Цитата:

Цитата 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

Griboed0ff 10-05-2020 13:55 2920599

Цитата:

Цитата 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.


Foreigner 10-05-2020 15:34 2920619

Цитата:

Цитата 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? Подозреваю, что несколько скриптов не могут одновременно писать в один файл.

YuS_2 10-05-2020 15:46 2920622

Цитата:

Цитата 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 использовать...

Griboed0ff 10-05-2020 16:24 2920625

Цитата:

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

нет, просто из core запустил срипт, который выше скрыт.

Griboed0ff 10-05-2020 16:45 2920629

Цитата:

Цитата YuS_2
подберите опытным путем оптимальное число параллельных процессов... »

даже если поток один, он все равно рано или поздно заполняет память, то есть все зависит от величины входящего списка.

Griboed0ff 10-05-2020 19:39 2920654

Цитата:

Цитата YuS_2
Там подсказка написана: »

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

Iska 10-05-2020 21:46 2920671

Цитата:

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

База данных, база данных… :).

Griboed0ff 10-05-2020 21:54 2920673

Цитата:

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

и функция записи в лог если не пингуется тоже не нужна. Мб вообще пинг убрать и быстрее получится?

YuS_2 10-05-2020 22:11 2920676

Цитата:

Цитата Iska
База данных, база данных… »

Можно и базу данных, конечно, но в данном случае, это "из пушки по воробьям..." :)
export-csv справится... вон, там ведь справляется :)

Цитата:

Цитата Griboed0ff
Мб вообще пинг убрать и быстрее получится? »

Если убрать, посыпятся ошибки, но можно немного укоротить -timeout 1

Griboed0ff 10-05-2020 22:34 2920683

Цитата:

Цитата YuS_2
Если убрать, посыпятся ошибки, но можно немного укоротить -timeout 1 »

можно же сразу и вытянуть инфу о мак адресе встроенной проводной сетевой карты. Мне уже посоветовали команды
Код:

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-