В этой статье мы покажем, как можно использовать 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
Добрый день, подскажите как мне правильно изменить скрипт для архивации файлов при превышении порогового значения свободного места на диске!
Спасибо!
Какой сценарий? Архивировать и куда то перемещать.
Как выбрать что архивировать, а что оставлять. Нужно бы понять критерии.
Добрый день. Подскажите пожалуйста мне нужно перезапустить службу при заполнении определенного диска например D больше 98%(или когда осталось меньше 5 Гб свободного), а по остальным дискам не проверять место. Спасибо.
За основу берите скрипт после блока «Если вы хотите не просто выводить информацию о свободном месте на диске, а выполнять некоторое действие »
Для выбора конкрентного диска используйте:
Get-WmiObject -Class Win32_LogicalDisk | Where-Object {$_.DeviceID -eq "D:"}
Для перезапуска службы (https://winitpro.ru/index.php/2019/09/05/upravlenie-sluzhbami-windows-powershell/) нужно вместо блока $Message= «Warning!» использовать
Restart-Service -Name spooler
Вам осталось скомпоновать все в один скрипт.
Можно получить своюодное место с удаленного компьютера через CIM:
$computer = "dc01"
$RequiredSpaceGB = 10
$FreeSpaceGB = [int]((Get-CimInstance -ComputerName $computer CIM_LogicalDisk -Filter "DeviceId='C:'").FreeSpace/1024/1024/1024)if($FreeSpaceGB -lt $RequiredSpaceGB){
write-host "Not enough space: $RequiredSpaceGB GB required!"
}
Чуток допилил скрипт для проверки конкретного диска(физического/сетевого) и отправки уведомления на email. С учётом того, что почтовый сервер не требует авторизации.
cls
#Указать диск для проверки места и минимальный порог в ГБ
$DiskToCheck = "Z:"
$FreeGB = 99
$MailTo = "[email protected]"
#Для добавления второго адреса, расскоментировать строку ниже и в командлет Send-MailMessage добавить: -To "$MailTo", "$MailTo2"
#$MailTo2 = "[email protected]"
$MailFrom = "[email protected]"
$MailSubject = "Мало места на \\server\share"
$MailBody = "Осталось меньше $FreeGB ГБ на диске $DiskToCheck\ `nСейчас свободно: $FreeSpaceGB ГБ"
$MailSMTP = "smtp.domain.ru"
$MailSMTPport = 25
$FreeSpaceGB = (Get-WmiObject -Class Win32_LogicalDisk -Filter "DeviceId='$DiskToCheck'").FreeSpace/1024/1024/1024
$FreeSpaceGB =[Math]::Truncate($FreeSpaceGB) #округляем до целого числа
if ($FreeSpaceGB -lt $FreeGB)
{
#расскоментировать строку ниже для проверки работы скрипта в консоли
#Write-Host ("Всё плохо, осталось $FreeSpaceGB гигабайт на диске $DiskToCheck") -Separator " "
Send-MailMessage -From $MailFrom -To "$MailTo" -Subject "$MailSubject" -Body $MailBody -SmtpServer $MailSMTP -Port $MailSMTPport -Encoding 'UTF8'
}
else{
Write-Host ("Всё тип-топ")
}