В этой статье мы покажем, как можно использовать 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
В свойстве 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 “[email protected]” -From “$env:[email protected]” -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:\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
Данная инструкция описывает простейшую самодельную систему мониторинга места на дисках, которую можно использовать для решения частных задач. Если у вас множество хостов, состояние которых нужно отслеживать, то конечно лучше использовать полноценную систему мониторинга (например, Zabbix, PRTG, Nagion, Icinga и т.д.).
Прочитано: 2 116
В сегодняшней заметке я наглядно покажу, как мониторить дисковое пространство на подконтрольном Вам сервере под управлением Windows Server 2008 / R2. В работе системного администратора должен быть порядок и предупреждения на раннем этапе спасут многие часы в последствии. Лучше иметь преимущество перед возникнувшей ситуацией.
Если на системе заканчивается свободное место, стабильность её нарушается, останавливается работа. А простой – это потеря денег.
И так, для мониторинга дискового пространства на подконтрольном сервере в систему (Windows Server 2008 / R2) следует поднять роль файлового сервера и в ней же доустановить оснастку File Server Resource Manager.
Start – Control Panel – Administrative Tools – Server Manager – Roles – Add Roles (добавляем роль – File Services)
И отмечаем галочкой установки оснастки: File Server Resource Manager
На следующем шаге отмечаем логические диски, которые будем мониторить:
На следующем шаге отмечаем, как проводить уведомление:
- Сохранять отчёт в указанную папку
- Уведомлять по почте
По умолчанию оснастка выбирает, что формировать отчёты в каталог:
C:\StorageReports
На следующем шаге проверяем сформированные итоговые данные которые мы указывали шагами выше и нажимаем “Install”, следует также иметь ввиду, что по окончании процедуры инсталляции потребуется перезагрузка сервера.
Теперь чтобы проверить, как выглядит настройка, в полном виде, открываем, установленную оснастку:
Start – Control Panel – Administrative Tools – File Server Resource Manager, раскрываем пункт Quota Managemnet – Quota
И видим настроенный мониторинг дискового пространства на локальном диске “D:”
В Качестве эксперимента создадим на вверенном логическом диске файл, к примеру, в 1Gb и также через оснастку пронаблюдаем, открываем командную строку с правами Администратора и набираем следующую команду:
C:\Users\ekzorchik>fsutil file createnew d:\file.txt 1000000000
File d:\file.txt is created
Открываем оснастку: File Server Resource Manager и видим, что изменилось процентное соотношение использования диска (47%), а также занятый и свободный объем:
Start – Control Panel – Administrative Tools – File Server Resource Manager, раскрываем пункт Quota Managemnet – Quota
Отлично.
Также можно изменить тип мониторинг, т.е. если занимаемой место на локальном диске исчерпывается, то просто идут уведомления, либо запрещается принудительно запись. Правой кнопкой мыши открываем свойства у “D:” и в ниспадающем меню выбираем – Edit Quota Properties…
В разделе Space limit:
- Hard quota – жёсткое ограничение, т.е. при исчерпании места дальнейшая запись не возможно
- Soft quota – Только мониторинг дискового пространства
Вот собственно и всё, что я Вам хотел Вам рассказать. С уважением, ekzorchik.
Перейти к содержимому
Дабы держать руку на пульсе о состоянии логических дисков виртуальных и физических серверов был использован powershell скрипт, с возможностью отправки отчета на e-mail.
Создаем на диске С папку DiskSpace_Report, там будет создаваться файл отчета после работы скрипта. Если отчет содержит какие записи — он отравляется на e-mail. В скрипте настраиваются пороги предупреждений и параметры для отправки почтовых уведомлений.
get-childitem C:\DiskSpace_Report\* -include *.html -recurse | remove-item # Параметры предупреждений в % $percentWarning = 15 $percentCritcal = 5 # Путь для хранения отчета $reportPath = "C:\DiskSpace_Report\"; # Имя файла отчета $reportName = "DiskSpaceRpt.html"; $diskReport = $reportPath + $reportName $redColor = "#FF0000" $orangeColor = "#FBB917" $whiteColor = "#FFFFFF" $i = 0; # Список компьютеров для отчета $computers = "192.168.0.1", "192.168.0.2", "192.168.0.3"; $datetime = Get-Date -Format "yyyy_MM-dd"; #E-mail settings $SMTPServer = "smtp.gmail.com" $SMTPPort = "587" $Username = "c***p@gmail.com" $Password = "******" $to = "t***@mail.ru" $subject = "Servers Disks Space monitoring" $body = "Файл лога во вложении" $titleDate = get-date -uformat "%d-%m-%Y" $header = " <html> <head> <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'> <title>DiskSpace Report</title> <STYLE TYPE='text/css'> <!-- td { font-family: Tahoma; font-size: 11px; border-top: 1px solid #999999; border-right: 1px solid #999999; border-bottom: 1px solid #999999; border-left: 1px solid #999999; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; } body { margin-left: 5px; margin-top: 5px; margin-right: 0px; margin-bottom: 10px; table { border: thin solid #000000; } --> </style> </head> <body> <table width='100%'> <tr bgcolor='#CCCCCC'> <td colspan='7' height='25' align='center'> <font face='tahoma' color='#003399' size='4'><strong>Servers DiskSpace Report for $titledate</strong></font> </td> </tr> </table> " Add-Content $diskReport $header $tableHeader = " <table width='100%'><tbody> <tr bgcolor=#CCCCCC> <td width='10%' align='center'>Server</td> <td width='5%' align='center'>Drive</td> <td width='15%' align='center'>Drive Label</td> <td width='10%' align='center'>Total Capacity(GB)</td> <td width='10%' align='center'>Used Capacity(GB)</td> <td width='10%' align='center'>Free Space(GB)</td> <td width='10%' align='center'>Freespace %</td> </tr> " Add-Content $diskReport $tableHeader foreach($computer in $Computers) { $disks =Get-WmiObject -ComputerName $Computer -Class Win32_LogicalDisk -Filter "DriveType=3" $computer = $computer.toupper() foreach($disk in $disks) { $deviceID = $disk.DeviceID; $volName = $disk.VolumeName; [float]$size = $disk.Size; [float]$freespace = $disk.FreeSpace; $percentFree = [Math]::Round(($freespace / $size) * 100, 2); $sizeGB = [Math]::Round($size / 1073741824, 2); $freeSpaceGB = [Math]::Round($freespace / 1073741824, 2); $usedSpaceGB = $sizeGB - $freeSpaceGB; $color = $whiteColor; if($percentFree -lt $percentWarning) { $color = $orangeColor if($percentFree -lt $percentCritcal) { $color = $redColor } $dataRow = " <tr> <td width='10%'>$computer</td> <td width='5%' align='center'>$deviceID</td> <td width='15%' >$volName</td> <td width='10%' align='center'>$sizeGB</td> <td width='10%' align='center'>$usedSpaceGB</td> <td width='10%' align='center'>$freeSpaceGB</td> <td width='5%' bgcolor=`'$color`' align='center'>$percentFree</td> </tr> " Add-Content $diskReport $dataRow; Write-Host -ForegroundColor DarkYellow "$computer $deviceID,percentage,free_space = $percentFree"; $i++ } } } $tableDescription = " </table><br><table width='20%'> <tr bgcolor='White'> <td width='10%' align='center' bgcolor='#FBB917'>Warning less than 15% free space</td> <td width='10%' align='center' bgcolor='#FF0000'>Critical less than 5% free space</td> </tr> " Add-Content $diskReport $tableDescription Add-Content $diskReport "</body></html>" if ($i -gt 0) { Write-Host "Sending Email notification" $file = "$reportPath\DiskSpaceRpt.html" $message = New-Object System.Net.Mail.MailMessage $message.subject = $subject $message.body = $body $message.to.add($to) $message.from = $username $message.attachments.add($file) $smtp = New-Object System.Net.Mail.SmtpClient($SMTPServer, $SMTPPort); $smtp.EnableSSL = $true $smtp.Credentials = New-Object System.Net.NetworkCredential($Username, $Password); $smtp.send($message) }
Добавляем созданный скрипт в планировщик, регулярность запуска задания — 3 часа.
Пример получаемого отчета:
7 091
Статья давно не обновлялась, поэтому информация могла устареть.
Для оповещения об исчерпании свободного места используем Powershell-скрипт с расширением ps1, представленный ниже Скачать скрипт Для работы скрипта необходим почтовый ящик, локальный/удаленный не имеет значения. Необходимо скачать скрипт и заполнить поля в разделе Enviroments. В скрипте можно задать аварийный и критический уровень исчерпания места. После создания скрипта требуется добавить его исполнение в планировщик.
#http://www.ionline.by #Enviroments #Путь к файлам логов, например, c:\logs\ $logpath = 'ENTER_LOG_PATH' #Имя Лог-файла $lname = 'hdd-freespace.log' #IP-адрес или доменное имя почтового сервера, например, mail.example.com $IPMailServer="ENTER_IP_OR_NAME_MAIL_SERVER" #Адрес отправителя. Внимание, он же является логином для авторизации. $SenderEmail="ENTER_SENDER_E-MAIL" #Адрес получателя $RecipientEmail="ENTER_RECIPIENT_E-MAIL" #Пароль на ящик $pass = 'E-MAIL_PASSWORD' #Уровень предупреждения о окончании места. Указывается в процентах, от 1 до 100 $WarnSpace = '20' #Аварийный уровень. Указывается в процентах $Alarm = '5' #Functions function Send-mail ($subj = "VM" ,$body = "Text", $AttachPath = "0") { $SMTPClient = new-object System.Net.Mail.SMTPClient $Msg = new-object System.Net.Mail.MailMessage if ($AttachPath -ne "0") { $Attach = new-object System.Net.Mail.Attachment($AttachPath) $Msg.Attachments.add($Attach) } $Msg.To.Add($RecipientEmail) $Msg.from=$SenderEmail $Msg.Subject = $subj $Msg.Body= $body $SMTPClient.Host=$IPMailServer $SMTPClient.Credentials=New-Object System.Net.NetworkCredential "$SenderEmail" , "$pass" $SMTPClient.Send($Msg) #$Attach.Dispose() } #Code $time = Get-Date $servname = $env:computername "$time" >> $logpath\$lname "Начало проверки количества свободного места на логических дисках сервера $servname" >> $logpath\$lname gwmi win32_logicaldisk -filter "drivetype = 3" | foreach { $did = $_.DeviceID $vname = $_.VolumeName $allspace = $([Math]::Round($_.Size / 1GB)) $fsp = $([Math]::Round($_.FreeSpace / 1GB)) $freeprc = ( $fsp / $allspace )*100 $freeprc = $([Math]::Round($freeprc)) if ( $freeprc -ile $WarnSpace ) { if ( $freeprc -ile $Alarm ) { "$time" >> $logpath\$lname $uspace = $allspace - $fsp $uprc = 100 - $freeprc "КРИТИЧЕСКАЯ ОШИБКА!!! на $servname на диске $did метка $vname осталось $freeprc % свободного места ($fsp Гб). Требуется принять меры!" >> $logpath\$lname "Дополнительная информация о данном разделе:" >> $logpath\$lname "Идентификатор:............................$did" >> $logpath\$lname "Метка тома:...............................$vname" >> $logpath\$lname "Полный объем диска:.......................$allspace" >> $logpath\$lname "Свободное пространство на диске в ГБ:.....$fsp" >> $logpath\$lname "Свободное пространство на диске в %:.....$freeprc" >> $logpath\$lname "Использовано на диске ГБ:.................$uspace" >> $logpath\$lname "Использовано на диске в %:.................$uprc" >> $logpath\$lname $date = Get-Date -UFormat %T Send-mail -subj "КРИТИЧЕСКАЯ ОШИБКА! $date - $servname" -body "$time !!!КРИТИЧЕСКАЯ ОШИБКА!!! На $servname на диске $did метка $vname осталось $freeprc % свободного места ($fsp Гб). Требуется принять меры! Дополнительная информация о аварийном разделе: Идентификатор:............................$did Метка тома:...............................$vname Полный объем диска:.......................$allspace Свободное пространство на диске в ГБ:.....$fsp Свободное пространство на диске в %:.....$freeprc Использовано на диске ГБ:.................$uspace Использовано на диске в %:.................$uprc " } else { "$time" >> $logpath\$lname $uspace = $allspace - $fsp $uprc = 100 - $freeprc "Внимание на $servname на диске $did метка $vname осталось $freeprc % свободного места ($fsp Гб). Требуется принять меры!" >> $logpath\$lname "Дополнительная информация о данном разделе:" >> $logpath\$lname "Идентификатор:............................$did" >> $logpath\$lname "Метка тома:...............................$vname" >> $logpath\$lname "Полный объем диска:.......................$allspace" >> $logpath\$lname "Свободное пространство на диске в ГБ:.....$fsp" >> $logpath\$lname "Свободное пространство на диске в %:.....$freeprc" >> $logpath\$lname "Использовано на диске ГБ:.................$uspace" >> $logpath\$lname "Использовано на дисе в %:.................$uprc" >> $logpath\$lname $date = Get-Date -UFormat %T Send-mail -subj "$date - $servname Предупреждение" -body "$time Внимание на $servname на диске $did метка $vname осталось $freeprc % свободного места ($fsp Гб). Требуется принять меры! Дополнительная информация о аварийном разделе: Идентификатор:............................$did Метка тома:...............................$vname Полный объем диска:.......................$allspace Свободное пространство на диске в ГБ:.....$fsp Свободное пространство на диске в %:.....$freeprc Использовано на диске ГБ:.................$uspace Использовано на диске в %:.................$uprc " } } else { "$time" >> $logpath\$lname $uspace = $allspace - $fsp $uprc = 100 - $freeprc "Результат проверки локального диска $did :" >> $logpath\$lname "Идентификатор:............................$did" >> $logpath\$lname "Метка тома:...............................$vname" >> $logpath\$lname "Полный объем диска:.......................$allspace" >> $logpath\$lname "Свободное пространство на диске в ГБ:.....$fsp" >> $logpath\$lname "Свободное пространство на диске в %:.....$freeprc" >> $logpath\$lname "Использовано на диске ГБ:.................$uspace" >> $logpath\$lname "Использовано на диске в %:.................$uprc" >> $logpath\$lname } }
Этот материал был полезен?
We can easily list the Size and Free Space of all Disks using WMI class Win32_LogicalDisk. The class is a Win32_LogicalDisk which represents a data source that resolves to an actual local storage device on a computer system running Windows. In this article, we will explore how to get Disk Space usage in a Local Machine and Remote Computer using PowerShell.
Summary:
- Get Drive Free Space in Local Machine
- Get Disk Space Usage from Remote Machine
- Export Disk Size Report to CSV for multiple computers
Get Drive Free Space in Local Machine
You can get the Disk Space Usage report from Local Machine by using the following Powershell script. Here, I have used the filter “DriveType -eq 3” to list only local hard disks, and the below query displays the size and free space in a unit of GB, you can change it if you want as any other unit. (i.e To display in MB, you need to change this format query -f ($_.FreeSpace/1GB) into -f ($_.FreeSpace/1MB)).
Get-WmiObject -Class Win32_LogicalDisk | Where-Object {$_.DriveType -eq 3} | Select-Object DeviceID, Description,` @{"Label"="DiskSize(GB)";"Expression"={"{0:N}" -f ($_.Size/1GB) -as [float]}}, ` @{"Label"="FreeSpace(GB)";"Expression"={"{0:N}" -f ($_.FreeSpace/1GB) -as [float]}},` @{"Label"="PercentFreeSpace";"Expression"={"{0:N}" -f (($_.FreeSpace/$_.Size)*100) -as [float]}} | FT -AutoSize
Get Disk Space Usage from Remote Server using Powershell
You can get the disk’s free space usage report from Remote Computer by giving the name of the remote computer through argument syntax -ComputerName in the existing Powershell script.
Get-WmiObject -Class Win32_LogicalDisk -ComputerName "hp-pc" | Where-Object {$_.DriveType -eq 3} | Select-Object DeviceID, Description,` @{"Label"="DiskSize(GB)";"Expression"={"{0:N}" -f ($_.Size/1GB) -as [float]}}, ` @{"Label"="FreeSpace(GB)";"Expression"={"{0:N}" -f ($_.FreeSpace/1GB) -as [float]}},` @{"Label"="PercentFreeSpace";"Expression"={"{0:N}" -f (($_.FreeSpace/$_.Size)*100) -as [float]}} | FT -AutoSize
Connecting a remote server may require providing admin user credentials. In this case, you may receive the error message “Get-WmiObject : Access is denied“. Use the below command to pass user credentials to the Get-WmiObject command.
$PSCredential = Get-Credential "ComputerName\UserName" #$PSCredential = Get-Credential "DomainName\UserName" Get-WmiObject -Class Win32_LogicalDisk -ComputerName "Remote_Machine_Name" -Credential $PSCredential | Where-Object {$_.DriveType -eq 3} | Select-Object DeviceID, Description,` @{"Label"="DiskSize(GB)";"Expression"={"{0:N}" -f ($_.Size/1GB) -as [float]}}, ` @{"Label"="FreeSpace(GB)";"Expression"={"{0:N}" -f ($_.FreeSpace/1GB) -as [float]}},` @{"Label"="PercentFreeSpace";"Expression"={"{0:N}" -f (($_.FreeSpace/$_.Size)*100) -as [float]}} | FT -AutoSize
Export Disk Size Report to CSV for multiple computers
You can export the Disk Space Usage into CSV using Powershell‘s Export-CSV cmdlet. The following script exports the disk size usage report to a CSV file for a set of multiple remote servers.
$DiskSizeReport = @() $computers = "pc1","hp-pc","svr1","svr2" $computers | ForEach { $Disks = Get-WmiObject win32_logicaldisk -ComputerName $_ -Filter "Drivetype=3" -ErrorAction SilentlyContinue | Select-Object @{Label = "Server Name";Expression = {$_.SystemName}}, @{Label = "Drive Letter";Expression = {$_.DeviceID}},@{Label = "Total Capacity (GB)";Expression = {"{0:N1}" -f( $_.Size / 1GB)}}, @{Label = "Used Space (GB)";Expression = {(Round($_.Size /1GB,2)) - (Round($_.FreeSpace /1GB,2))}}, @{Label = "Free Space (GB)";Expression = {"{0:N1}" -f( $_.Freespace / 1GB ) }},@{Label = "Free Space (%)"; Expression = {"{0:P0}" -f ($_.freespace/$_.size) }} $DiskSizeReport += $Disks } $DiskSizeReport | Export-CSV "C:\DiskSizeReport.csv" -NoTypeInformation -Encoding UTF8
CSV Output of Disk Size Usage Report: