Войти

Показать полную графическую версию : соединить три скрипта общим выводом.


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

Griboed0ff
03-06-2020, 11:26
не знаю как, но проблема с заполнением полей сама ушлаParam( #powershell
[string]$Region,
#[parameter(Mandatory=$true)]
[String]$a=((Get-Date).ToShortDateString() | Foreach-Object {$_ -replace "\.", ""}) ,
[string]$outfile = "D:\PowerShell\франкин\test\all_$a.csv"

)
$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
}

$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 "Прошлись по $Region. Получили $counter записей" -ForegroundColor Yellow

$pcs2|% {
$name = $_.name
if ((Test-Connection -Cn $name -Count 1 -quiet -ErrorAction SilentlyContinue) -eq $False) {
Write-host "$name;не пингуется" -ForegroundColor Yellow
$forLog = $name+";"+"не пингуется"
$ofs = ''
[string]$Region2 = $Region[0..2]
[string]$Region3 = $Region[4]
$hash_object1 = [ordered] @{"on\off" = "no ping"; Region = $Region2; "B\S\TT" = $Region3; "PSComputerName" = $name; Manufacturer = " "; Model = " "; Serialnumber = " ";"IPv4" = " "; MACAddress = " "; name = " "; AdapterType = " "; Speed = " "; "Monitor 1" = " "; "Monitor SN 1" = " "; "Monitor 2" = " "; "Monitor SN 2" = " "; }
$ps_object1 = [pscustomobject]$hash_object1
$ps_object1 | export-csv $outfile -notype -enc utf8 -d ';' -append
} else {
$ofs = ''
Write-host "$name пингуется, выполняем проверку" -ForegroundColor Green
$ip = gwmi -ComputerName $name Win32_NetworkAdapterConfiguration | foreach { $_.IPAddress }
#$ipv4 = $ip.Split(",")[-1]
$ip1 = gwmi -ComputerName $name Win32_NetworkAdapterConfiguration |Where { $_.DefaultIPGateway}|foreach {$_.DefaultIPGateway}
$PSComputerName = Get-WmiObject -computername $name Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.PSComputerName}
$MACAddress = Get-WmiObject -computername $name Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.MACAddress}
$namenet = Get-WmiObject -computername $name Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.name}
$AdapterType = Get-WmiObject -computername $name Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.AdapterType}
$Speed = Get-WmiObject -computername $name Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.Speed}
$Manufacturer = Get-WmiObject -computername $name -ClassName Win32_ComputerSystem |foreach {$_.Manufacturer}
$Model = Get-WmiObject -computername $name -ClassName Win32_ComputerSystem |foreach {$_.Model}
$SN = Get-WmiObject -computername $name Win32_BaseBoard | foreach {$_.SerialNumber}
$mm = [char[]]((gwmi wmimonitorid -Namespace root\wmi -ComputerName $name).UserFriendlyName)-join ""
[string]$mmod1 = $mm[0..12]
[string]$mmod2 = $mm[13..26]
$msn = [char[]]((gwmi wmimonitorid -Namespace root\wmi -ComputerName $name).SerialNumberID)-join ""
[string]$msn1 = $msn[0..15]
[string]$msn2 = $msn[16..32]
[string]$Region4 = $Region[0..2]
[string]$Region5 = $Region[4]
$hash_object = [ordered] @{"on\off" = "ping"; Region = $Region4; "B\S\TT" = $Region5; "PSComputerName" = $PSComputerName; Manufacturer = $Manufacturer; Model = $Model; Serialnumber = $SN; "IPv4" = "$ipv4"; MACAddress = $MACAddress; name = $namenet; AdapterType = $AdapterType; Speed = $Speed; "Monitor 1" = $mmod1; "Monitor SN 1" = $msn1; "Monitor 2" = $mmod2; "Monitor SN 2" = $msn2; }
$ps_object = [pscustomobject]$hash_object
$ps_object | export-csv $outfile -notype -enc utf8 -d ';' -append
}}
"on\off";"Region";"B\S\TT";"PSComputerName";"Manufacturer";"Model";"Serialnumber";"IPv4";"MACAddress";"name";"AdapterType";"Speed";"Monitor 1";"Monitor SN 1";"Monitor 2";"Monitor SN 2"
"ping";"ekt";"s";"6-SERVER";"Hewlett-Packard";"HP ProDesk 400 G2 MT";"CZC4483YKL";"";"A0:D3:C1:4D:52:C1";"Realtek PCIe GBE Family Controller #4";"Ethernet 802.3";"1000000000";"";"";"";""
"ping";"ekt";"b";"PC-PANOV";"KRAFTWAY";"GEG";" ";"";"D0:27:88:72:3F:98";"Realtek PCIe GBE Family Controller";"Ethernet 802.3";"100000000";"HP E231 ";"3CQ3470WJF ";"HP E231 ";"3CQ4070QH5 "
"no ping";"ekt";"b";"PC-CHIOV";" ";" ";" ";" ";" ";" ";" ";" ";" ";" ";" ";" "
"ping";"ekt";"b";"PC-BYCHA";"Hewlett-Packard";"HP ProDesk 400 G2 MT";"CZC44846ZW";"";"A0:D3:C1:4E:85:E8";"Realtek PCIe GBE Family Controller #4";"Ethernet 802.3";"100000000";"HP W2072a ";"CNC238PNJN ";"";""
"ping";"ekt";"t";"008-5";"Hewlett-Packard";"HP ProDesk 400 G1 SFF";"CZC4483ZWL";"";"64:51:06:3B:4A:8D";"Realtek PCIe GBE Family Controller #3";"Ethernet 802.3";"1000000000";"HP W2072a ";"CNC435PJ5D ";"";""
проблема еще в том, что теперь скрипт на сильно удаленных пк довольно медленно работает. И траблы с получением ipv4, нужно выловить только с активной карты и только тот адрес, который начинается с 10.*.*.*; Начинаю думать как теперь по хитрецки записывать ответы в таблицу (или уже базу создать), надо сделать как-то чтобы дубли не писал. Перед записью проверить наличие записываемой инфомации о пк в файле, если ее там нет то записать, если она изменилась то записать новую удалив старую, если уже есть и актуальная то пропустить. Есть мысли в какую сторону подумать?

Iska
03-06-2020, 20:06
…(или уже базу создать), надо сделать как-то чтобы дубли не писал. »
Вы плавно движетесь в правильном направлении.

то записать новую удалив старую, »
А не надо «удалять старую». Совсем не надо.

Griboed0ff
03-06-2020, 20:48
А не надо «удалять старую». Совсем не надо. »
Почему не удалять? Оставить для истории изменений? Тогда дату добавить что ли.. Можете подсказать как можно ускорить выполнение скрипта? А то выполняется очень медленно. Мб как-то делать меньше запросов в один и тот же класс, а потом уже вычленять нужное в переменные? Но как ума не приложу. Я уже пробовал запараллелить через кор, но там проблемы с Get-WmiObject, gwmi и модулем AD, на Get-Ciminstance 90% компов ответили ошибками.

Fors1k
03-06-2020, 21:02
записывает прошлое значение если нет мониторов

Monitor9 HP E231 [3CQ4070X4Z]
Monitor10 HP E231 [6CM4221RHC] »
А Вас номера мониторов совсем не смущают?))
Если планируете запускать скрипт много раз в одной сессии, то замените первую строку на Param($rv=(rv * -ea 0), .

Griboed0ff
03-06-2020, 23:41
А Вас номера мониторов совсем не смущают?)) » Да вот как раз номера то и смутили. Я просто не понимаю возможно как вашим кодом пользоваться. Сделал так Param($rv=(rv * -ea 0),
$a=((Get-Date).ToShortDateString() | Foreach-Object {$_ -replace "\.", ""}) ,
$outfile = "E:\video\1111.csv",
$pp = "10.10.10.7"
)cls

$PSComputerName = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.PSComputerName}
$MACAddress = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.MACAddress}
$namenet = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.name}
$AdapterType = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.AdapterType}
$Speed = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.Speed}
$Manufacturer = Get-WmiObject -computername $pp -ClassName Win32_ComputerSystem |foreach {$_.Manufacturer}
$Model = Get-WmiObject -computername $pp -ClassName Win32_ComputerSystem |foreach {$_.Model}
$SN = Get-WmiObject -computername $pp Win32_BaseBoard | foreach {$_.SerialNumber}

$hash_object = [ordered] @{PSComputerName = "$PSComputerName"; Manufacturer = "$Manufacturer"; Model = "$Model"; Serialnumber = "$SN"; MACAddress = "$MACAddress"; name = "$namenet"; AdapterType = "$AdapterType"; Speed = "$Speed"; }
gwmi -ea 0 wmimonitorid -Namespace root\wmi|%{$hash_object.add("Monitor"+ ++$i,(($_.UserFriendlyName|?{($_ -ne 0)}|%{[char]$_}) -join "")+' ['+(($_.SerialNumberID|?{($_ -ne 0)}|%{[char]$_}) -join "")+']')}

$ps_object = [pscustomobject]$hash_object
$ps_object | export-csv $outfile -notype -enc utf8 -d ';' -appendвывод получился такой:"PSComputerName";"Manufacturer";"Model";"Serialnumber";"MACAddress";"name";"AdapterType";"Speed";"Monitor11"
"DESKTOP-84S5RK8 DESKTOP-84S5RK8 DESKTOP-84S5RK8 DESKTOP-84S5RK8 DESKTOP-84S5RK8 DESKTOP-84S5RK8 DESKTOP-84S5RK8";"Gigabyte Technology Co., Ltd.";"To be filled by O.E.M.";"To be filled by O.E.M.";"74:D4:35:08:86:7C ";"Realtek PCIe GbE Family Controller VirtualBox Host-Only Ethernet Adapter VirtualBox Host-Only Ethernet Adapter VirtualBox Host-Only Ethernet Adapter VirtualBox Host-Only Ethernet Adapter VirtualBox Host-Only Ethernet Adapter VirtualBox Host-Only Ethernet Adapter";"Ethernet 802.3 ";"100000000 ";"HP W2072a [CNC401NT3L]"
И еще из-за того, что имя столбца всегда разное export-csv не может записать инфу файл больше одного раза получается ошибка: export-csv : Не удается присоединить содержимое CSV к следующему файлу: E:\video\1111.csv. У присоединяемого объекта отсутствует свойство, соответствующее сл
едующему столбцу: Monitor11. Чтобы продолжить работу при наличии несоответствий свойств, добавьте параметр -Force и выполните команду снова.
строка:20 знак:14
+ $ps_object | export-csv $outfile -notype -enc utf8 -d ';' -append
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (Monitor11:String) [Export-Csv], InvalidOperationException
+ FullyQualifiedErrorId : CannotAppendCsvWithMismatchedPropertyNames,Microsoft.PowerShell.Commands.ExportCsvCommandТак же модель и серийник записываются в одну ячейку, а не в две. Надеюсь я просто не понимаю как правильно вывести результат..

DJ Mogarych
04-06-2020, 10:38
$PSComputerName = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.PSComputerName}
$MACAddress = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.MACAddress}
$namenet = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.name}
$AdapterType = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.AdapterType}
$Speed = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.Speed}
$Manufacturer = Get-WmiObject -computername $pp -ClassName Win32_ComputerSystem |foreach {$_.Manufacturer}
$Model = Get-WmiObject -computername $pp -ClassName Win32_ComputerSystem |foreach {$_.Model}
$SN = Get-WmiObject -computername $pp Win32_BaseBoard | foreach {$_.SerialNumber} »
Зачем сто раз запрашивать одно и то же? Достаточно сделать один запрос, а потом получить данные.
И зачем там foreach?

$adapter = gwmi -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0"

$adapter.macaddress
$adapter.AdapterType
$adapter.speed


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

Busla
04-06-2020, 11:44
прежде чем браться за подобные монструозные проекты, желательно поизучать то, на чём вы это всё пытаетесь реализовать »
зачем? - предприятие деньги на инвентаризации сэкономило, offer выполнен, премия получена

DJ Mogarych
04-06-2020, 12:42
Ну получена и получена, мне-то всё равно. Я о другом. Всё равно работает-то через одно место это детище Франкенштейна.
И улучшать его, лезть и разбираться уже не хочется, видя отношение ТС к процессу и нежелание нормально разобраться с написанием скриптов самому.
А ведь с момента первых сообщений по этой теме прошло уже немало времени.

Griboed0ff
04-06-2020, 14:30
нежелание нормально разобраться с написанием скриптов самому » Сначала начальника хотел просто разовую выгрузку с небольшого количества пк, для чего и был сделан мелкий скрипт. Позже надо стало больше компов, потом вообще все регионы. Так же сначала надо было одни данные потом другие, но в целом количество данных растет. Я до этого форума вообще не знал что такое ps, по мере поступления задач\проблем погружаюсь в изучение PS. Не всем дается легко скриптописание когда ничего до этого не писал. Намного лучше получается если просто переделать чей-то скрипт. Хуже получается когда сам начинаю писать, получается невероятное громоздкое что-то. На форум надеюсь в плане подсказки. Потому что иногда не могу нагуглить что мне нужно, просто видимо не получается правильно сформировать запрос. Времени на от корки до корки пошик поучить нету, но задача есть и делать надо хоть как. Большинство этих франкенштейнчиков работает, их задача часто очень маленькая, даже если они работают через одно место. улучшать его, лезть и разбираться уже не хочется » но уже залезли и дали подсказку $adapter = gwmi -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0"
$adapter.macaddress
$adapter.AdapterType
$adapter.speed »И этого уже достаточно, на этом спасибо! offer выполнен, премия получена »Может кто-то и получил, меня просто не уволили.

Griboed0ff
04-06-2020, 14:52
Зачем сто раз запрашивать одно и то же? Достаточно сделать один запрос, а потом получить данные. »вот я ранее об и думал, но не знал как. Мб как-то делать меньше запросов в один и тот же класс, а потом уже вычленять нужное в переменные? »

DJ Mogarych
04-06-2020, 21:30
уже залезли и дали подсказку »
Это лежит на поверхности, но я не собираюсь вникать в тот ужас, с которого эта тема началась.

Лично я освоил Powershell за несколько месяцев, прочитав книжку "Learn Windows PowerShell in a Month of Lunches", а потом выборочно - "PowerShell in Depth". Причём, никакого опыта программирования у меня не было - до этого я писал элементарнейшие скрипты CMD. То, что пишет в CMD, например, Megaloman, я не понимаю и сейчас.

Если не читаете на английском, есть куча русских источников, в этой ветке есть прикреплённая тема "Справочный материал Powershell (http://forum.oszone.net/thread-292023.html)".

Было бы желание, ну и читать надо последовательно и с начала, чтобы в голове складывалась какая-то система и понимание, что к чему.

Iska
04-06-2020, 23:40
Тогда дату добавить что ли.. »
Да. ДатаВремя-Домен-Имя машины — набор полей для ключа таблицы.

DJ Mogarych, не, на русском нихрена до сих пор ничего вменяемого нет. Увы.

Но проблема и в том, что даже на английском нет даже вменяемой документации (читать блоги разработчиков, это, конечно, занимательно и пользительно, но не заменяет наличия полноценной документации). Всё дёргано, разнородно, здесь работает-здесь не работает, и требует обязательной проверки и опробования на практике.

DJ Mogarych
05-06-2020, 10:43
Кто ищет - тот всегда найдёт.
А насчёт разнородности и проверок - это как у любого развивающегося языка, а особенно, которому надо поддерживать всякую совместимость со старыми технологиями.

Iska
06-06-2020, 05:45
Кто ищет - тот всегда найдёт. »
DJ Mogarych, ну, ежели что-нибудь за последние пару-тройку лет здесь изменилось — расскажите об этом в прикреплённых темах.

А насчёт разнородности и проверок - это как у любого развивающегося языка, а особенно, которому надо поддерживать всякую совместимость со старыми технологиями. »
Аааааа… Проблема в том, что его создатели действовали аналогично коллеге Griboed0ff — не продумав ни стройной системы, ни общих принципов, ни концепции развития.




© OSzone.net 2001-2012