В этой статье мы покажем, как можно использовать PowerShell для мониторинга свободного места на диске сервера (компьютера) с Windows и оповещения администратора (всплывающим сообщением или письмом), если превышено пороговое значение.
PowerShell: проверка свободного места на диске через WMI класс
Вы можете получить информацию о логических дисках в Windows с помощью WMI класса Win32_logicalDisk.
Следующая команда выведет всю информацию о логических дисках компьютера:
Get-WmiObject -Class Win32_LogicalDisk
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
Скрипт вывел список логических дисков, их размер, и процент оставшегося свободного места.
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 “[email protected]” -From “$env:[email protected]” -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:\PS\check-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:\PS\check-free-disk-space.ps1" -ErrorAction SilentlyContinue
Также для получения WMI данных с удаленных компьютеров можно использовать RemoteWMI:
Get-WmiObject -Class Win32_logicalDisk -ComputerName dc01,dc02