Войти

Показать полную графическую версию : [решено] извлечь данные о мониторах из реестра


Страниц : 1 [2] 3

Busla
19-04-2020, 11:49
как проводить инвентаризацию непонятно »
ножками дойти, ручками потрогать, внести в инвентарную опись, распечатать и подписаться под ней
никак иначе инвентаризация не проводится

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

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

Iska
19-04-2020, 14:54
Griboed0ff, наклеечки, наклеечки наше всё. Ну, или — выжигатель для особо тяжёлых случаев.

Griboed0ff
08-05-2020, 11:27
$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|V RN_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
Как думаете, если из этого скрипта убрать пинг, будет ли быстрей перебор?

Griboed0ff
09-05-2020, 19:50
Вывод в csv, просто. А про таблицы уже сказали. » может подскажете на счет вывода?

YuS_2
09-05-2020, 20:56
может подскажете на счет вывода? »
Что именно?
Откуда вообще вот эта строка:
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
Откуда вообще вот эта строка: »

Лучше получать данные так:
Код:
$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
Griboed0ff,
так, вот и сравните то, что я выделил... именно поэтому у Вас результат совсем не тот, что ожидается...

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

Griboed0ff
09-05-2020, 22:54
Тут надо бы Вам показать, что получаете с нескольких компьютеров и что именно, необходимо получить... »

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
по идее и здесь можно через пошик 7 запараллелить »

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

YuS_2
10-05-2020, 00:13
а надо, »
именно так, не получится, но можно так:
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, это обязательно
Только вместо Get-WmiObject Get-Ciminstance, первого нет. »
в Core с этим не всё радужно и могут возникнуть затруднения с получением данных через wmi

Griboed0ff
10-05-2020, 13:55
если всё нормально, то можно будет уже распараллеливать.. »
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|V RN_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
если из 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'. »

Тут по моему все ясно, пропишите или в скрипте, или в консоли перед запуском или в $profile
[code]
Import-Module ActiveDirectory
[/come]

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

если из 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
Вы запускаете скрипт с помощью Foreach -Parallel? Подозреваю, что несколько скриптов не могут одновременно писать в один файл. »
нет, просто из core запустил срипт, который выше скрыт.

Griboed0ff
10-05-2020, 16:45
подберите опытным путем оптимальное число параллельных процессов... » даже если поток один, он все равно рано или поздно заполняет память, то есть все зависит от величины входящего списка.

Griboed0ff
10-05-2020, 19:39
Там подсказка написана: »
похоже тут долгие проблемы, по идее функция забора списка пк с ад не очень то и нужна, можно и просто по списку из файла.

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

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




© OSzone.net 2001-2012