В этой статье мы покажем, как можно использовать 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
В свойстве 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
Скрипт вывел список логических дисков, их размер, и процент оставшегося свободного места.
Для использования этого скрипта в 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)
}
}
}
В данном скрипте заданы пороговые значения свободного места на диске — 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
В этом примере вам придется вводить имя и пароль пользователя для аутентфикации на 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 и т.д.).