У цій статті ми покажемо, як можна використовувати PowerShell для моніторингу вільного місця на диску сервера (комп’ютера) з Windows і оповіщення адміністратора (спливаючих повідомленням або листом), якщо перевищено граничне значення.

  • PowerShell: перевірка вільного місця на диску через WMI клас
  • Перевірка вільного місця на віддалених комп’ютерах Windows за допомогою PowerShell

PowerShell: перевірка вільного місця на диску через WMI клас

Ви можете отримати інформацію про логічних дисках в Windows за допомогою WMI класу Win32_logicalDisk.

Наступна команда виведе всю інформацію про логічних дисках комп’ютера:

Get-WmiObject -Class Win32_LogicalDisk

Якщо ви використовуєте новий PowerShell Core 7.x, майте на увазі, що в цій версії PowerShell WMI не підтримує (тому що PowerShell Core заснований на .Net Core). Тому при запуску команди Get-WmiObject з’явиться помилка “The term 'Get-WmiObject' is not recognized as a name of a cmdlet, function, script file, or executable program“. Замість WMI командлетів потрібно використовувати CIM, наприклад:

Get-CimInstance win32_logicaldisk

poweshell дізнатися вільне місце на диску

У властивості FreeSpace міститься місце, що залишилося на кожному диску в байтах. Для зручності можна перетворити його в GB, а також вивести% місця, вільного на кожному з логічних дисків (як відношення freespace до загального розміру диска). Можна використовувати такий PowerShell скрипт:

Get-WmiObject -Class Win32_LogicalDisk |
Select-Object -Property DeviceID, VolumeName, @{Label="FreeSpace (Gb)"; expression={($_.FreeSpace/1GB).ToString('F2')}},
@{Label="Total (Gb)"; expression={($_.Size/1GB).ToString('F2')}},
@{label="FreePercent"; expression={[Math]::Round(($_.freespace / $_.size) * 100, 2)}}|ft

Get-WmiObject Win32_LogicalDisk - інформація по вільному диску на логічному диску

Скрипт вивів список логічних дисків, їх розмір, і відсоток залишку вільного місця.

Для використання цього скрипта в PowerShell Core, просто замініть Get-WmiObject на Get-CimInstance.

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

$percentWarning = 6
$percentCritcal = 3
$ListDisk = Get-WmiObject -Class Win32_LogicalDisk
Foreach($Disk in $ListDisk){
if ($Disk.size -ne $NULL)
{
$DiskFreeSpace = ($Disk.freespace/1GB).ToString('F2')
$DiskFreeSpacePercent = [Math]::Round(($Disk.freespace/$Disk.size) * 100, 2)
if($DiskFreeSpacePercent -lt $percentWarning)
{
$Message= "Warning!"
if($DiskFreeSpacePercent -lt $percentCritcal)
{
$Message= "Alert!"
}
# блок вывода уведомления
$wshell = New-Object -ComObject Wscript.Shell
$Output = $wshell.Popup("На диске $($Disk.DeviceID) осталось свободно всего $DiskFreeSpace ГБ",0,$Message,48)
}
}
}

powershell скрипт оповіщення про вільне місце на диску

В даному скрипті задані порогові значення вільного місця на диску – 3 і 6%. Якщо на будь-якому з дисків відсоток залишку вільного місця менше ніж ці значення, то виводиться модальне інформаційне вікно (можна зробити спливаючі повідомлення або відразу викликати утиліту очищення диска).

Якщо ви хочете сповіщати адміністратора про проблему по email, можна відправити лист через SMTP сервер (це може бути як будь-який Exchange, так і будь-який інший SMTP сервіс, піде навіть вбудована SMTP роль Windows Server), потрібно використовувати командлет Send-MailMessage:

Send-MailMessage -To “serveradmin@winitpro.ru” -From “$env:computername@winitpro.ru” -Subject “Недостаточно место на диске сервера $env:computername” -Body “На диске $($Disk.DeviceID) осталось свободно всего $DiskFreeSpace ГБ” -Credential (Get-Credential) -SmtpServer smtp.winitpro.ru -Port 587

Даний PowerShell скрипт можна запускати регулярно через завдання планувальника або оформити у вигляді служби Windows. Якщо на даному хості Windows недостатньо вільного місця, адміністратор отримає повідомлення.

Перевірка вільного місця на віддалених комп’ютерах Windows за допомогою PowerShell

Для запуску PS скрипта перевірки залишку вільного місця на віддаленому комп’ютері можна використовувати WinRM командлет Invoke-Command.

Invoke-Command -ComputerName dc01,dc02,dc03 -FilePath "C:PScheck-free-disk-space.ps1"

Якщо сервера, на яких потрібно перевірити вільне місце складаються в домені, можна отримати їх список з Active Directory за допомогою командлета Get-ADComputer і запустити скрипт перевірки для кожного з них:

$computers = (Get-ADComputer -Filter 'operatingsystem -like "*Windows server*" -and enabled -eq "true"').Name
Invoke-Command -ComputerName $computers -FilePath "C:PScheck-free-disk-space.ps1" -ErrorAction SilentlyContinue

Також для отримання WMI даних з віддалених комп’ютерів можна використовувати RemoteWMI:

Get-WmiObject -Class Win32_logicalDisk -ComputerName dc01,dc02

Дана інструкція описує найпростішу саморобну систему моніторингу місця на дисках, яку можна використовувати для вирішення приватних завдань. Якщо у вас безліч хостів, стан яких потрібно відстежувати, то звичайно краще використовувати повноцінну систему моніторингу (наприклад, Zabbix, PRTG, Nagion, Icinga і т.д.).

Leave a Reply

Your email address will not be published. Required fields are marked *