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

Armsinglom 20-07-2018 23:45 2822893

Сбор данных с ПК
 
Добрый вечер.
При выполнении данного запроса:
Код:

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?

Iska 21-07-2018 01:26 2822896

Цитата:

Цитата Armsinglom
Код:

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, на текущую дату/время.

Busla 21-07-2018 11:36 2822924

Цитата:

Цитата Iska
Вообще же, идея с перебором-опросом кучи машин с одной — это не самый правильный самый неправильный подход в условиях домена. »

тем не менее, для этого у Invoke-Command даже есть специальный ключ ThrottleLimit

Цитата:

Цитата Iska
Пишите логон-скрипт, который привязывайте к машинам, в котором будет происходить извлечение информации с локальной машины и заполнение этой информацией удалённой базы »

Это вообще не работает: не обязательно перелогиниваться при каждом обновлении ПО и изменении реестра. Вернее: хоть как-то работает, если обесточивать на ночь всё предприятие :-)

Нормальная практика: логировать события и вести мониторинг по отдельности. А не скрещивать ужа с ежом.

Iska 21-07-2018 12:21 2822928

Цитата:

Цитата Busla
тем не менее, для этого у Invoke-Command даже есть специальный ключ ThrottleLimit »

Busla, да, я знаю. В этом отношении ребята из Microsoft наконец-то повернулись к пользователям лицом, за что им спасибо.

Цитата:

Цитата Busla
Это вообще не работает: не обязательно перелогиниваться при каждом обновлении ПО и изменении реестра. Вернее: хоть как-то работает, если обесточивать на ночь всё предприятие :-)
Нормальная практика: логировать события и вести мониторинг по отдельности. А не скрещивать ужа с ежом. »

Это и есть нормальная практика. Не бывает варианта «Не перегружаем машину по пять лет».

Armsinglom 21-07-2018 13:38 2822935

Если не сложно, можете набросать полную версию скрипта, моя часть + Invoke-Command, и если есть возможность в него добавить еще и выборку из реестра...

Iska 21-07-2018 13:45 2822937

Armsinglom, я точно не набросаю, поскольку ограничен нынче одной машиной, коллеги помогут. Но в любом случае с Вас потребуется точное указание вот этих вот путей:
Цитата:

Цитата Armsinglom
в двух местах реестра »


Armsinglom 21-07-2018 15:52 2822950

Не проблема:
\HKEY_LOCAL_MACHINE\SOFTWARE\RUSSIA\SU\CORE
\HKEY_LOCAL_MACHINE\SOFTWARE\RUSSIA\SU\FDC

Iska 21-07-2018 16:57 2822963

Armsinglom, это что — разделы, и Вам нужно полное содержимое этих разделов?

Armsinglom 21-07-2018 17:38 2822972

прошу прощения:
\HKEY_LOCAL_MACHINE\SOFTWARE\RUSSIA\SU\CORE\SQLver.REG_SZ
\HKEY_LOCAL_MACHINE\SOFTWARE\RUSSIA\SU\FDC\Setup.REG_SZ
Необходимы только значения из этих ключей, я просто не за рабочей машиной, пишу на память, но я потом если что путь подправлю.

Busla 21-07-2018 23:36 2823013

Цитата:

Цитата Iska
Это и есть нормальная практика. Не бывает варианта «Не перегружаем машину по пять лет». »

мир не делится на чёрное и белое: между аптаймом 5 лет и выключением каждый вечер есть масса промежуточных вариантов

Iska 22-07-2018 02:16 2823023

Busla, а вот соглашусь, коллега! ;)

Armsinglom 22-07-2018 17:20 2823065

Ну что, сможете помочь? :)

Wheee111 22-07-2018 22:33 2823102

Я бы сделал это так:

Код:

$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 2823109

Вложений: 1
Вот что выдаёт(см.картинку), и и не формирует табличку...

Wheee111 23-07-2018 10:27 2823135

В личке добавилось требование обработчика ошибок.

Код:

$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 2823145

Великолепно! Скрипт работает как нада!!!

Armsinglom 25-07-2018 14:57 2823448

Столкнулся с такой проблемой, скрипт в некоторых OU не может собрать данные с какой то машины, и зависает. Вчера нашел одну из этих «вещающих скрипт машин» и зарустил скрипт только на неё, в итоге за сутки скрипт не выдал ошибку, но и не собрал данных, что это может быть?

Iska 25-07-2018 20:14 2823482

Цитата:

Цитата Armsinglom
что это может быть? »

Открываете консоль, исполняете в ней команды из скрипта по одной, определяете, где «висим». Это ж не пакетные файлы, тут так можно.

bredych 26-07-2018 15:33 2823569

интересно, а есть ли подобная
Цитата:

Цитата Armsinglom
информация актуальной версии рабочего приложения, данную информацию я смог извлечь WMIC командной: »

информация о дате последнего апдейта для антивиря битдефендер?
Я в принуипе, могу залезть в файл, где лежат юникс даты, но не уверен, что там дата именно апдейта, а не попытки (неизвестно, успешной ли)

Iska 26-07-2018 15:58 2823571

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..


Время: 02:16.

Время: 02:16.
© OSzone.net 2001-