Списання техніки: скрипт технічного стану, акти й чек-лист

Скрипт знімає з комп'ютера показники, які комісія приймає як доказ: паспортні дані, стан і напрацювання накопичувачів, обсяг пам'яті з кількістю вільних слотів, версію системи та помилки диска з журналу подій. Він нічого не змінює і не робить висновків — висновок про непридатність ухвалює комісія. Нижче — шаблон акта технічного стану, акт знищення даних і чек-лист усієї процедури.

1. Скрипт: технічний стан комп'ютера

Тільки читає. Дописує рядок у спільний CSV, щоб зібрати картину по парку.

Get-DeviceCondition.ps1
# Технічний стан комп'ютера для акта списання: збирає ФАКТИ, а не робить висновок.
# Висновок про непридатність ухвалює комісія — скрипт лише дає їй перевірні дані.
# Нічого не змінює. Дописує рядок у спільний 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
}
Дані SMART потрібують прав адміністратора. Без них лічильники надійності повертають порожні поля, а не помилку — звіт виглядає заповненим, хоча напрацювання й попереджень у ньому немає. Скрипт про це попереджає окремим рядком, але для повних даних запускайте його від імені адміністратора.
Зберігайте файл у кодуванні UTF-8 з BOM. Інакше PowerShell 5.1 прочитає кирилицю в коментарях як ANSI і не запустить скрипт.
Як запуститиКоманда
На одній машині, з виводом на екран .\Get-DeviceCondition.ps1
Із записом у спільний CSV .\Get-DeviceCondition.ps1 -CsvPath "\\SERVER\inv\stan-tekhniky.csv"
Своя норма строку служби замість 5 років .\Get-DeviceCondition.ps1 -NormYears 7

2. Акт технічного стану

Документ IT-служби. Іде додатком до акта списання за типовою формою.

АКТ
технічного стану комп'ютерної техніки

Установа: <назва установи>
Дата огляду: <дата>

1. ОБ'ЄКТ ОГЛЯДУ
Найменування: системний блок <модель або складання>
Інвентарний номер: <номер>
Серійний номер: <номер або «відсутній, ідентифікація за інвентарним номером»>
Рік введення в експлуатацію: <рік за інвентарною карткою>
Місце встановлення: <кабінет, робоче місце>

2. ЩО ПЕРЕВІРЕНО
Зовнішній огляд, пробний запуск, діагностика накопичувачів засобами
операційної системи, аналіз журналу подій за останні 90 днів,
перевірка можливості модернізації (слоти пам'яті, підтримка платформи).

3. ЩО ВИЯВЛЕНО
Процесор: <модель>
Оперативна пам'ять: <обсяг> ГБ, зайнято <n> з <m> слотів
Накопичувачі: <модель, тип, обсяг, стан здоров'я, напрацювання в годинах>
Стан за самодіагностикою: <без попереджень / попередження про відмову>
Помилок дискової підсистеми в журналі за 90 днів: <кількість>
Операційна система: <назва, номер збірки>, <підтримується / без оновлень безпеки>
Інші несправності: <перелік>

4. ЧИ МОЖЛИВЕ ВІДНОВЛЕННЯ
Технічно: <можливе / неможливе, бо ...>
За вартістю: орієнтовна вартість ремонту <сума> грн за <джерело оцінки>,
що становить <частку> вартості аналогічного нового пристрою.
Модернізація: <можлива / неможлива, бо ...>

5. ВИСНОВОК
Придатний / придатний після ремонту / придатний для інших задач /
НЕПРИДАТНИЙ до подальшого використання за призначенням.

Огляд провів: <посада>        <підпис>        <ПІБ>
Дата: <дата>
У висновку не пишіть «застарів» і «повільно працює» — ці слова не мають одиниць виміру. Пишіть показники: стан диска, напрацювання, кількість помилок у журналі, обсяг пам'яті та максимум для платформи, номер збірки системи.

3. Акт знищення даних

Складається до вивезення техніки. П'ять рядків, які знімають питання під час перевірки.

АКТ
знищення (стирання) даних з носіїв інформації

Установа: <назва установи>
Дата: <дата>

Комісія у складі <посади, ПІБ> склала цей акт про те, що з носіїв
інформації, знятих зі списаної техніки, знищено дані:

№ | Тип носія | Модель | Серійний номер | З якого пристрою | Спосіб | Результат
1 | HDD       |        |                | інв. №           | перезапис нулями (diskpart clean all) | виконано
2 | SSD       |        |                | інв. №           | вбудоване стирання засобами виробника | виконано
3 | HDD       |        |                | інв. №           | фізичне знищення (свердління пластин)  | виконано

Носії, з яких дані знищено фізично, передано на утилізацію в складі
техніки за актом приймання-передачі від <дата> № <номер>.

Голова комісії: <посада>      <підпис>      <ПІБ>
Члени комісії:  <посада>      <підпис>      <ПІБ>
                <посада>      <підпис>      <ПІБ>
Форматування не знищує дані. Швидке форматування прибирає таблицю файлів, видалення розділу — розмітку. Для механічного диска потрібен перезапис (clean all у diskpart або cipher /W: для вільного місця), для твердотільного — вбудоване стирання засобами виробника чи знищення ключа шифрування, для непридатного — фізичне знищення.

4. Чек-лист процедури

Роздрукуйте й ведіть по ньому. Порядок кроків має значення: два з них незворотні.

Перед комісією

  • Перевірено альтернативи: ремонт, модернізація, перерозподіл, передача іншій установі
  • Зібрано технічні показники по кожній машині (скрипт вище або огляд вручну)
  • Складено акт технічного стану на кожен об'єкт, у висновку є конкретні ознаки
  • Звірено інвентарні номери з інвентарною карткою — машину можна впізнати
  • Уточнено в бухгалтерії, за яким порядком списує ваша установа і які межі сум

Рішення й документи

  • Створено комісію наказом керівника, до складу входять технічні працівники
  • Проведено огляд майна з технічною документацією, складено протокол засідання
  • Отримано рішення керівника або згоду суб'єкта управління — залежно від вартості
  • Оформлено акт списання за типовою формою, акти технічного стану додано

Дані й розбирання

  • Дані з усіх носіїв знищено ДО вивезення техніки, складено акт знищення даних
  • Розбирання розпочато лише ПІСЛЯ рішення про згоду на списання
  • Придатні вузли оприбутковано як запаси, непридатні — як вторинну сировину
  • Брухт із вмістом дорогоцінних металів не пішов у загальний металобрухт

Вивезення й облік

  • Утилізатор має дозвіл на операції з оброблення відходів, копію додано до справи
  • Підписано акт приймання-передачі з переліком і вагою, матеріали оприбутковано
  • Картку пристрою закрито датою й номером акта, історія заявок збережена
  • Пристрій знято з робочого місця, оновлено перелік матеріально відповідальних
Не розбирайте техніку до рішення про списання. Порядок дозволяє демонтаж лише після того, як згоду надано: комісія має оглянути майно в тому стані, у якому воно є.