Показать полную графическую версию : [решено] Сбор данных с ПК
Armsinglom
20-07-2018, 23:45
Добрый вечер.
При выполнении данного запроса:
get-adcomputer -searchbase "OU=PC,OU=TET,DC=PC,DC=MEM" -filter {(name -like "*") -and (enable -eq "true")} -Properties name, IPv4Address, CanonicalName | select name, IPv4Address, CanonicalName | out-gridview
я получаю вполне красивую табличку с именем машины, IP, и её местонахождение в домене. Проблема в том что к данной табличке мне необходимо добавить ещё информацию, которая находится в двух разных местах:
1) информация находится в двух местах реестра. т.е. необходимо считать информацию в ветках реестра и выдать указанные там значение в разные столбцы в табличке.
2) информация актуальной версии рабочего приложения, данную информацию я смог извлечь WMIC командной:
wmic.exe /interactive:off /failfast:on /node:127.0.0.1 datafile where "name='C:\\Offtop\\Top\\Top.exe'" get version
Которая возвращает результат типа:
Version
1.22.2.8
Но хотелось бы это сделать через PowerShell и получать результат в общей таблице.
Есть возможность такое провернуть с помощью PowerShell?
wmic.exe /interactive:off /failfast:on /node:127.0.0.1 datafile where "name='C:\\Offtop\\Top\\Top.exe'" get version »
Например:
Write-Host (@(Get-WmiObject -ComputerName 127.0.0.1 -Class 'CIM_DataFile' -Filter 'name = "C:\\Offtop\\Top\\Top.exe"'))[0].Version
Но можно и встроенными средствами:
$oVersionInfo = ([System.IO.FileInfo]"C:\Offtop\Top\Top.exe").VersionInfo
Write-Host $oVersionInfo.FileVersion, $oVersionInfo.ProductVersion
естественно, через сессию WinRM.
Вообще же, идея с перебором-опросом кучи машин с одной — это не самый правильный самый неправильный подход в условиях домена. Пишите логон-скрипт, который привязывайте к машинам, в котором будет происходить извлечение информации с локальной машины и заполнение этой информацией удалённой базы, будь то Jet, або SQL, на текущую дату/время.
Вообще же, идея с перебором-опросом кучи машин с одной — это не самый правильный самый неправильный подход в условиях домена. »
тем не менее, для этого у Invoke-Command даже есть специальный ключ ThrottleLimit
Пишите логон-скрипт, который привязывайте к машинам, в котором будет происходить извлечение информации с локальной машины и заполнение этой информацией удалённой базы »
Это вообще не работает: не обязательно перелогиниваться при каждом обновлении ПО и изменении реестра. Вернее: хоть как-то работает, если обесточивать на ночь всё предприятие :-)
Нормальная практика: логировать события и вести мониторинг по отдельности. А не скрещивать ужа с ежом.
тем не менее, для этого у Invoke-Command даже есть специальный ключ ThrottleLimit »
Busla, да, я знаю. В этом отношении ребята из Microsoft наконец-то повернулись к пользователям лицом, за что им спасибо.
Это вообще не работает: не обязательно перелогиниваться при каждом обновлении ПО и изменении реестра. Вернее: хоть как-то работает, если обесточивать на ночь всё предприятие :-)
Нормальная практика: логировать события и вести мониторинг по отдельности. А не скрещивать ужа с ежом. »
Это и есть нормальная практика. Не бывает варианта «Не перегружаем машину по пять лет».
Armsinglom
21-07-2018, 13:38
Если не сложно, можете набросать полную версию скрипта, моя часть + Invoke-Command, и если есть возможность в него добавить еще и выборку из реестра...
Armsinglom, я точно не набросаю, поскольку ограничен нынче одной машиной, коллеги помогут. Но в любом случае с Вас потребуется точное указание вот этих вот путей:
в двух местах реестра »
Armsinglom
21-07-2018, 15:52
Не проблема:
\HKEY_LOCAL_MACHINE\SOFTWARE\RUSSIA\SU\CORE
\HKEY_LOCAL_MACHINE\SOFTWARE\RUSSIA\SU\FDC
Armsinglom, это что — разделы, и Вам нужно полное содержимое этих разделов?
Armsinglom
21-07-2018, 17:38
прошу прощения:
\HKEY_LOCAL_MACHINE\SOFTWARE\RUSSIA\SU\CORE\SQLver.REG_SZ
\HKEY_LOCAL_MACHINE\SOFTWARE\RUSSIA\SU\FDC\Setup.REG_SZ
Необходимы только значения из этих ключей, я просто не за рабочей машиной, пишу на память, но я потом если что путь подправлю.
Это и есть нормальная практика. Не бывает варианта «Не перегружаем машину по пять лет». »
мир не делится на чёрное и белое: между аптаймом 5 лет и выключением каждый вечер есть масса промежуточных вариантов
Busla, а вот соглашусь, коллега! ;)
Armsinglom
22-07-2018, 17:20
Ну что, сможете помочь? :)
Wheee111
22-07-2018, 22:33
Я бы сделал это так:
$Info = @()
Get-AdComputer `
-filter {Enabled -eq $True} `
-SearchBase "OU=PC,OU=TET,DC=PC,DC=MEM" `
-Properties name, IPv4Address, CanonicalName | %{
$CompName = $_.Name
[string]$IPAddresses = ""
Set-Service RemoteRegistry -ComputerName $CompName -Status Running -PassThru | Out-Null
$NIC = Get-WmiObject Win32_NetworkAdapterConfiguration -Filter "IPEnabled='True'" -ComputerName $CompName
$NIC | %{ $_.IPAddress.Split(",") | ?{ $_ -notlike "*:*" }} | %{ $IPAddresses += ($_ + ",") }
$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $CompName )
$RegKey1 = $Reg.OpenSubKey("SOFTWARE\RUSSIA\SU\CORE")
$RegKey2 = $Reg.OpenSubKey("SOFTWARE\RUSSIA\SU\FDC\")
$Member = New-Object PSObject -Property @{
CompName = $CompName
CanonicalName = $_.CanonicalName
IPAddresses = $IPAddresses -replace (',$')
RegVersion = $RegKey1.GetValue("SQLver")
Setup = $RegKey2.GetValue("Setup")
FileVersion = (Get-Item $("\\" + $CompName + "\C$\Offtop\Top\Top.exe") ).VersionInfo.ProductVersion
}
$Info += $Member
Set-Service RemoteRegistry -ComputerName $CompName -Status Stopped -PassThru -ErrorAction SilentlyContinue | Out-Null
}
$Info | Out-GridView
Armsinglom
23-07-2018, 01:06
Вот что выдаёт(см.картинку), и и не формирует табличку...
Wheee111
23-07-2018, 10:27
В личке добавилось требование обработчика ошибок.
$FilePath = "C$\Core Test\System\Core.exe"
$SearchBase = "OU=OFT,OU=SU,OU=PRM-CN,DC=contoso,DC=com"
$RegPath1 = "SOFTWARE\Soft Practic\RUSSIA"
$RegPath2 = "SOFTWARE\Soft Practic\Ver"
$RegKeyName1 = "System Version"
$RegKeyName2 = "Version"
$Info = @()
Get-AdComputer `
-Filter {Name -like "msk-004*" -and Enabled -eq $True} `
-SearchBase $SearchBase `
-Properties Name, CanonicalName | %{
$CompName = $_.Name
If ( Test-Connection $CompName -Count 1 -Quiet ) {
[string]$IPAddresses = ""
Try {
$RegErr = $False
Set-Service RemoteRegistry -ComputerName $CompName -Status Running -PassThru -EA SilentlyContinue | Out-Null
$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $CompName )
} Catch {
$RegErr = $True
}
Try {
$NICErr = $False
$NIC = Get-WmiObject Win32_NetworkAdapterConfiguration -Filter "IPEnabled='True'" -ComputerName $CompName -EA SilentlyContinue
$NIC | %{ $_.IPAddress.Split(",") | ?{ $_ -notlike "*:*" }} | %{ $IPAddresses += ($_ + ",") }
$IPAddresses = ( $IPAddresses -replace (',$') )
} Catch {
$NICErr = $True
}
If ($RegErr) {
$RegVersion = "Registry connection error"
$Setup = "Registry connection error"
} Else {
$RegKey1 = $Reg.OpenSubKey($RegPath1)
$RegKey2 = $Reg.OpenSubKey($RegPath2)
$RegVersion = $RegKey1.GetValue($RegKeyName1)
$Setup = $RegKey2.GetValue($RegKeyName2)
}
If ($NICErr) {
$IPAddresses = "WMI Connection error"
}
If (Test-Path $("\\" + $CompName + "\" + $FilePath) ) {
$FileVersion = (Get-Item $("\\" + $CompName + "\" + $FilePath) ).VersionInfo.ProductVersion
} Else {
$FileVersion = ""
}
Set-Service RemoteRegistry -ComputerName $CompName -Status Stopped -PassThru -ErrorAction SilentlyContinue | Out-Null
} Else {
$IPAddresses = "Offline"
$RegVersion = ""
$Setup = ""
$FileVersion = ""
}
$Member = New-Object PSObject -Property @{
CompName = $CompName
CanonicalName = $_.CanonicalName
IPAddresses = $IPAddresses
RegVersion = $RegVersion
Setup = $Setup
FileVersion = $FileVersion
}
$Info += $Member
}
$Info | Out-GridView
# $Info | Export-CSV C:\Temp\ScanResult.CSV -Encoding UTF8 -Delimiter ";" -NoTypeInformation
Armsinglom
23-07-2018, 11:14
Великолепно! Скрипт работает как нада!!!
Armsinglom
25-07-2018, 14:57
Столкнулся с такой проблемой, скрипт в некоторых OU не может собрать данные с какой то машины, и зависает. Вчера нашел одну из этих «вещающих скрипт машин» и зарустил скрипт только на неё, в итоге за сутки скрипт не выдал ошибку, но и не собрал данных, что это может быть?
что это может быть? »
Открываете консоль, исполняете в ней команды из скрипта по одной, определяете, где «висим». Это ж не пакетные файлы, тут так можно.
интересно, а есть ли подобная информация актуальной версии рабочего приложения, данную информацию я смог извлечь WMIC командной: »
информация о дате последнего апдейта для антивиря битдефендер?
Я в принуипе, могу залезть в файл, где лежат юникс даты, но не уверен, что там дата именно апдейта, а не попытки (неизвестно, успешной ли)
bredych, не уверен, что а) это возможно и б) что это нужно. Причём акцент здесь на слове «это».
Если указанный антивирус корректно работает с Центром безопасности ОС, попробуйте поиграться с Wbem, а именно с классом AntiVirusProduct пространства SecurityCenter/SecurityCenter2 (до-Vista/Vista+). Вас должно интересовать свойство .productState, его анализ и конечный вывод — антивирус в состоянии Up-to-date или Out-of-date, то есть базы его в актуальном состоянии, або нет.
Для PowerShell есть даже готовый код в Галерее: Script Get the status of Antivirus Product on local and Remote Computers. (https://gallery.technet.microsoft.com/scriptcenter/Get-the-status-of-4b748f25).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.