Скрипт знімає з комп'ютера показники, які комісія приймає як доказ: паспортні дані, стан і напрацювання накопичувачів, обсяг пам'яті з кількістю вільних слотів, версію системи та помилки диска з журналу подій. Він нічого не змінює і не робить висновків — висновок про непридатність ухвалює комісія. Нижче — шаблон акта технічного стану, акт знищення даних і чек-лист усієї процедури.
Тільки читає. Дописує рядок у спільний CSV, щоб зібрати картину по парку.
# Технічний стан комп'ютера для акта списання: збирає ФАКТИ, а не робить висновок.
# Висновок про непридатність ухвалює комісія — скрипт лише дає їй перевірні дані.
# Нічого не змінює. Дописує рядок у спільний CSV.
#
# .\Get-DeviceCondition.ps1
# .\Get-DeviceCondition.ps1 -CsvPath "\SERVER\inv\stan-tekhniky.csv"
#
# Дані SMART доступні лише з правами адміністратора. Без них скрипт працює,
# але в колонці SMART буде «потрібні права адміністратора».
param(
[string] $CsvPath,
[int] $NormYears = 5
)
$ErrorActionPreference = 'SilentlyContinue'
$isAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(
[Security.Principal.WindowsBuiltInRole]::Administrator)
# --- Паспортні дані ------------------------------------------------------
$bios = Get-CimInstance Win32_BIOS
$cs = Get-CimInstance Win32_ComputerSystem
$cpu = Get-CimInstance Win32_Processor | Select-Object -First 1
$model = ($cs.Manufacturer + ' ' + $cs.Model).Trim()
# На зібраних вручну машинах модель — це назва материнської плати або заглушка
if ($cs.Model -match 'System Product Name|To Be Filled|Default string') {
$mb = Get-CimInstance Win32_BaseBoard
$model = ('складання: ' + $mb.Manufacturer + ' ' + $mb.Product).Trim()
}
# Дата BIOS — орієнтир віку, а не дата придбання. Дату введення в
# експлуатацію бере бухгалтерія з інвентарної картки.
$biosDate = $bios.ReleaseDate
$ageYears = if ($biosDate) { [math]::Round(((Get-Date) - $biosDate).TotalDays / 365.25, 1) } else { $null }
# --- Память і можливість модернізації ------------------------------------
$mem = @(Get-CimInstance Win32_PhysicalMemory)
$arr = Get-CimInstance Win32_PhysicalMemoryArray
$ramGb = [math]::Round($cs.TotalPhysicalMemory / 1GB, 1)
$slots = if ($arr.MemoryDevices) { $arr.MemoryDevices } else { $mem.Count }
$freeSlots = $slots - $mem.Count
# --- Диски ---------------------------------------------------------------
$disks = @()
foreach ($d in Get-PhysicalDisk) {
$rel = $d | Get-StorageReliabilityCounter
$disks += [pscustomobject]@{
Name = $d.FriendlyName
Media = $d.MediaType
SizeGb = [math]::Round($d.Size / 1GB)
Health = $d.HealthStatus
Oper = ($d.OperationalStatus -join ',')
Hours = $rel.PowerOnHours
Wear = $rel.Wear
ReadErr = $rel.ReadErrorsTotal
}
}
# SMART: без прав адміністратора клас root\wmi віддає «Access denied»
$smart = 'потрібні права адміністратора'
if ($isAdmin) {
$fail = @(Get-CimInstance -Namespace root\wmi -ClassName MSStorageDriver_FailurePredictStatus)
if ($fail.Count -gt 0) {
$bad = @($fail | Where-Object { $_.PredictFailure })
$smart = if ($bad.Count -gt 0) { 'ПОПЕРЕДЖЕННЯ про відмову: ' + $bad.Count + ' диск(ів)' } else { 'без попереджень' }
} else {
$smart = 'диски не віддають SMART (USB або RAID)'
}
}
# --- Система -------------------------------------------------------------
$os = Get-CimInstance Win32_OperatingSystem
# Назву системи беремо за номером збірки: ProductName у реєстрі на Windows 11
# досі пише «Windows 10».
$build = [int](Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').CurrentBuild
$osName = if ($build -ge 22000) { 'Windows 11' } elseif ($build -ge 10240) { 'Windows 10' } else { $os.Caption }
$osSupport = switch ($true) {
($build -ge 22000) { 'підтримується'; break }
($build -ge 10240) { 'Windows 10 — підтримка завершилась 14.10.2025'; break }
default { 'система без оновлень безпеки'; break }
}
# --- Помилки диска в журналі за 90 днів ----------------------------------
$diskEvents = @(Get-WinEvent -FilterHashtable @{
LogName = 'System'; ProviderName = 'disk', 'Ntfs'; StartTime = (Get-Date).AddDays(-90)
} -MaxEvents 200)
$diskErrors = @($diskEvents | Where-Object { $_.Level -le 3 }).Count
# --- Ознаки, які комісія перевіряє ---------------------------------------
$signs = @()
if ($ageYears -and $ageYears -gt $NormYears) { $signs += "вік за датою BIOS $ageYears р. (норма $NormYears)" }
if ($ramGb -lt 4) { $signs += "ОЗП $ramGb ГБ" }
if ($freeSlots -le 0 -and $ramGb -lt 8) { $signs += 'вільних слотів памяті немає' }
if ($build -lt 22000) { $signs += 'система не оновлюється до підтримуваної' }
if ($smart -like 'ПОПЕРЕДЖЕННЯ*') { $signs += 'SMART попереджає про відмову диска' }
foreach ($d in $disks) {
if ($d.Health -ne 'Healthy') { $signs += "диск $($d.Name): стан $($d.Health)" }
if ($d.Hours -and $d.Hours -gt 40000) { $signs += "диск $($d.Name): напрацювання $($d.Hours) год" }
}
if ($diskErrors -gt 0) { $signs += "помилок диска в журналі за 90 днів: $diskErrors" }
$row = [pscustomobject]@{
Компютер = $env:COMPUTERNAME
Модель = $model
СерійнийНомер = $bios.SerialNumber
ДатаBIOS = if ($biosDate) { $biosDate.ToString('yyyy-MM-dd') } else { 'невідома' }
ВікРоків = $ageYears
Процесор = ($cpu.Name -replace '\s+', ' ').Trim()
ОЗПГБ = $ramGb
СлотиПамяті = "$($mem.Count) з $slots"
Диски = (($disks | ForEach-Object { "$($_.Name) $($_.Media) $($_.SizeGb)ГБ $($_.Health)" }) -join '; ')
НапрацюванняГод = if (@($disks | Where-Object { $_.Hours }).Count) {
(($disks | ForEach-Object { if ($_.Hours) { "$($_.Name): $($_.Hours)" } }) -join '; ')
} else { 'недоступно' }
SMART = $smart
Система = "$osName (збірка $build)"
ПідтримкаОС = $osSupport
ПомилокДиска90д = $diskErrors
Ознаки = ($signs -join '; ')
Дата = (Get-Date -Format 'yyyy-MM-dd HH:mm')
}
$row | Format-List
if (-not $isAdmin) {
Write-Host ''
Write-Host 'Без прав адміністратора SMART і напрацювання дисків недоступні:' -ForegroundColor Yellow
Write-Host 'лічильники повертають порожні поля, а не помилку. Для повних даних' -ForegroundColor Yellow
Write-Host 'запустіть скрипт від імені адміністратора.' -ForegroundColor Yellow
}
Write-Host ''
Write-Host '--- Фрагмент для акта технічного стану ---' -ForegroundColor Cyan
$text = @"
Комп'ютер $($env:COMPUTERNAME), $model, серійний номер $($bios.SerialNumber).
Дата BIOS $($row.ДатаBIOS), процесор $($row.Процесор), оперативна пам'ять $ramGb ГБ
($($row.СлотиПамяті) слотів зайнято). Накопичувачі: $($row.Диски).
Операційна система: $($row.Система), $osSupport.
Стан за даними самодіагностики: $smart. Помилок дискової підсистеми в журналі
подій за останні 90 днів: $diskErrors.
Виявлені ознаки: $(if ($signs.Count) { ($signs -join '; ') } else { 'не виявлено' }).
"@
Write-Host $text
if ($CsvPath) {
$dir = Split-Path $CsvPath -Parent
if ($dir -and -not (Test-Path $dir)) { New-Item -ItemType Directory -Path $dir -Force | Out-Null }
$exists = Test-Path $CsvPath
# UTF8 з BOM — інакше Excel покаже кирилицю абракадаброю
$row | Export-Csv -Path $CsvPath -NoTypeInformation -Encoding UTF8 -Append:$exists
Write-Host ''
Write-Host "Записано у $CsvPath" -ForegroundColor Green
}
| Як запустити | Команда |
|---|---|
| На одній машині, з виводом на екран | .\Get-DeviceCondition.ps1 |
| Із записом у спільний CSV | .\Get-DeviceCondition.ps1 -CsvPath "\\SERVER\inv\stan-tekhniky.csv" |
| Своя норма строку служби замість 5 років | .\Get-DeviceCondition.ps1 -NormYears 7 |
Документ IT-служби. Іде додатком до акта списання за типовою формою.
АКТ технічного стану комп'ютерної техніки Установа: <назва установи> Дата огляду: <дата> 1. ОБ'ЄКТ ОГЛЯДУ Найменування: системний блок <модель або складання> Інвентарний номер: <номер> Серійний номер: <номер або «відсутній, ідентифікація за інвентарним номером»> Рік введення в експлуатацію: <рік за інвентарною карткою> Місце встановлення: <кабінет, робоче місце> 2. ЩО ПЕРЕВІРЕНО Зовнішній огляд, пробний запуск, діагностика накопичувачів засобами операційної системи, аналіз журналу подій за останні 90 днів, перевірка можливості модернізації (слоти пам'яті, підтримка платформи). 3. ЩО ВИЯВЛЕНО Процесор: <модель> Оперативна пам'ять: <обсяг> ГБ, зайнято <n> з <m> слотів Накопичувачі: <модель, тип, обсяг, стан здоров'я, напрацювання в годинах> Стан за самодіагностикою: <без попереджень / попередження про відмову> Помилок дискової підсистеми в журналі за 90 днів: <кількість> Операційна система: <назва, номер збірки>, <підтримується / без оновлень безпеки> Інші несправності: <перелік> 4. ЧИ МОЖЛИВЕ ВІДНОВЛЕННЯ Технічно: <можливе / неможливе, бо ...> За вартістю: орієнтовна вартість ремонту <сума> грн за <джерело оцінки>, що становить <частку> вартості аналогічного нового пристрою. Модернізація: <можлива / неможлива, бо ...> 5. ВИСНОВОК Придатний / придатний після ремонту / придатний для інших задач / НЕПРИДАТНИЙ до подальшого використання за призначенням. Огляд провів: <посада> <підпис> <ПІБ> Дата: <дата>
Складається до вивезення техніки. П'ять рядків, які знімають питання під час перевірки.
АКТ
знищення (стирання) даних з носіїв інформації
Установа: <назва установи>
Дата: <дата>
Комісія у складі <посади, ПІБ> склала цей акт про те, що з носіїв
інформації, знятих зі списаної техніки, знищено дані:
№ | Тип носія | Модель | Серійний номер | З якого пристрою | Спосіб | Результат
1 | HDD | | | інв. № | перезапис нулями (diskpart clean all) | виконано
2 | SSD | | | інв. № | вбудоване стирання засобами виробника | виконано
3 | HDD | | | інв. № | фізичне знищення (свердління пластин) | виконано
Носії, з яких дані знищено фізично, передано на утилізацію в складі
техніки за актом приймання-передачі від <дата> № <номер>.
Голова комісії: <посада> <підпис> <ПІБ>
Члени комісії: <посада> <підпис> <ПІБ>
<посада> <підпис> <ПІБ>
clean all у diskpart або cipher /W: для вільного місця),
для твердотільного — вбудоване стирання засобами виробника чи знищення ключа шифрування,
для непридатного — фізичне знищення.
Роздрукуйте й ведіть по ньому. Порядок кроків має значення: два з них незворотні.