Trong bài viết này, chúng tôi sẽ chỉ cho bạn cách kiểm tra dung lượng ổ đĩa trống và sử dụng ổ đĩa trên máy chủ Windows cục bộ hoặc từ xa bằng PowerShell. Cũng xem xét cách thông báo cho quản trị viên bằng popup hoặc email nếu ngưỡng dung lượng trống bị vượt quá.
Cách kiểm tra dung lượng ổ đĩa trống trên Windows với WMI và PowerShell?
Bạn có thể lấy thông tin về các ổ đĩa logic trong Windows bằng lớp WMI Win32_logicalDisk.
Lệnh dưới đây sẽ hiển thị tất cả thông tin về ổ đĩa logic trên máy tính của bạn:
Get-WmiObject -Class Win32_LogicalDisk
Nếu bạn đang dùng PowerShell Core 7.x mới hơn, lưu ý rằng WMI không được hỗ trợ trong phiên bản PowerShell này (vì PowerShell Core dựa trên .Net Core). Nếu bạn thử chạy lệnh Get-WmiObject, bạn sẽ thấy lỗi: The term 'Get-WmiObject' is not recognized as a name of a cmdlet, function, script file, or executable program. Hãy dùng CIM thay vì WMI, ví dụ:
Get-CimInstance win32_logicaldisk
Thuộc tính FreeSpace chứa lượng dung lượng trống tính bằng byte còn lại trên mỗi ổ đĩa. Để thuận tiện hơn, bạn có thể chuyển đổi sang GB và hiển thị lượng dung lượng trống trên mỗi ổ đĩa logic theo % (tỷ lệ dung lượng trống trên tổng dung lượng ổ đĩa). Bạn có thể dùng script PowerShell sau:
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
Script hiển thị danh sách ổ đĩa logic, kích thước của chúng và phần trăm dung lượng trống.
Để dùng script này trong PowerShell Core, chỉ cần thay Get-WmiObject bằng Get-CimInstance.
Nếu bạn không muốn chỉ hiển thị thông tin về dung lượng trống trên ổ đĩa, mà muốn thực hiện một hành động thay vào đó (gửi email hoặc hiển thị popup) nếu dung lượng trống nhỏ hơn ngưỡng quy định, bạn có thể dùng script PowerShell dưới đây:
$percentWarning = 20
$percentCritcal = 5
$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 $($Disk.DeviceID) has only $DiskFreeSpace GB of free space left",0,$Message,48)
}
}
}
Script này đặt giá trị ngưỡng dung lượng trống trên ổ đĩa — 5% và 20%. Nếu lượng dung lượng trống trên bất kỳ ổ đĩa nào nhỏ hơn các giá trị quy định, một cửa sổ thông tin modal sẽ hiển thị. Bạn có thể hiển thị nó như một thông báo popup hoặc ngay lập tức chạy công cụ Disk Cleanup (cleanmgr.exe).
Nếu bạn muốn gửi email cho quản trị viên về vấn đề, bạn có thể gửi email qua SMTP server (có thể là Exchange host hoặc bất kỳ dịch vụ SMTP nào khác, thậm chí role SMTP tích hợp sẵn của Windows Server cũng được) với cmdlet Send-MailMessage:
Send-MailMessage -To "srv_admin@woshub.com" -From "$env:computername@woshub.com" -Subject "Insufficient disk space on server $env:computername" -Body "Disk $($Disk.DeviceID) has only $DiskFreeSpace GB left" -Credential (Get-Credential) -SmtpServer smtp.woshub.com -Port 587
Trong ví dụ này, bạn cần nhập credentials để kết nối đến SMTP host tương tác. Bạn có thể cấu hình SMTP host để chấp nhận tin nhắn từ các host tin cậy mà không cần xác thực, hoặc cấu hình xác thực SMTP bằng credentials đã lưu trong file (không thể dùng Managed Service Accounts để gửi email).
Bạn có thể chạy script PowerShell định kỳ bằng Task Scheduler hoặc cấu hình nó như một Windows service. Nếu không đủ dung lượng trống trên máy chủ Windows này, quản trị viên sẽ nhận được thông báo.
Lấy dung lượng ổ đĩa trống từ các máy chủ Windows từ xa qua PowerShell
Cmdlet Invoke-Command có thể dùng để chạy script PS kiểm tra dung lượng trống còn lại trên các máy tính từ xa.
Invoke-Command -ComputerName srv01,srv02,srv03 -FilePath "C:\PS\checkfreespace.ps1"
Nếu các server bạn muốn kiểm tra dung lượng trống nằm trong domain của bạn, bạn có thể lấy danh sách chúng từ Active Directory bằng cmdlet Get-ADComputer và chạy script cho từng host:
$computers = (Get-ADComputer -Filter 'operatingsystem -like "*Windows Server*" -and enabled -eq "true"').Name
Invoke-Command -ComputerName $computers -FilePath "C:\PS\checkfreespace.ps1" -ErrorAction SilentlyContinue
Bạn cũng có thể dùng RemoteWMI để lấy dữ liệu WMI từ các máy tính từ xa:
Get-WmiObject -Class Win32_logicalDisk -ComputerName srv01,srv02,srv03
Hướng dẫn này mô tả giải pháp tự làm đơn giản nhất để giám sát dung lượng ổ đĩa. Nếu bạn có nhiều host cần giám sát, tốt hơn là dùng hệ thống giám sát đầy đủ tính năng (như Zabbix, Icinga, PRTG, Nagios, v.v.).