Проверка свободного места на диске с помощью PowerShell скрипта

В этой статье мы покажем, как можно использовать PowerShell для мониторинга свободного места на диске сервера (компьютера) с Windows и оповещения администратора (всплывающим сообщением или письмом), если превышено пороговое значение.

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 “ [email protected] ” -From “$env: [email protected] ” -Subject “Недостаточно место на диске сервера $env:computername” -Body “На диске $($Disk.DeviceID) осталось свободно всего $DiskFreeSpace ГБ” -Credential (Get-Credential) -SmtpServer smtp.remontka.com -Port 587

В этом примере вам придется вводить имя и пароль пользователя для аутентфикации на SMTP сервере вручную. Чтобы отправлять письма без ручного ввода пароля, вы можете в настройках SMTP сервера разрешить подключение с определенных хостов без аутентфикации. Либо можно настроить SMTP аутентфикацию с помощью сохраненных паролей в файле (к сожалению, не получится настроить управляемые сервисные записи MSA/gMSA для аутентфикации на почтовом сервере).

Данный 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 и т.д.).
EnglishRussianUkrainian