PowerShell script for server information in an email report

PowerShell script that gathers server CPU and memory utilization, disk space, and uptime, generates a report, and sends it via email to IT Support. This script uses WMI and requires SMTP configuration for email functionality.
# **Configuration Section** $SMTPServer = "smtp.yourdomain.com" # Replace with your SMTP server $SMTPPort = 587 # Replace with your SMTP port (e.g., 25, 587) $EmailFrom = "server-report@yourdomain.com" $EmailTo = "itsupport@yourdomain.com" $EmailSubject = "Server Health Report" $SMTPUsername = "your-email-username" # Replace with your SMTP username $SMTPPassword = "your-email-password" # Replace with your SMTP password # **Gather Server Information** $ServerName = $env:COMPUTERNAME $CPU = Get-WmiObject Win32_Processor | Measure-Object -Property LoadPercentage -Average | Select-Object -ExpandProperty Average $Memory = Get-WmiObject Win32_OperatingSystem $TotalMemory = [math]::Round($Memory.TotalVisibleMemorySize / 1MB, 2) $FreeMemory = [math]::Round($Memory.FreePhysicalMemory / 1MB, 2) $UsedMemory = [math]::Round($TotalMemory - $FreeMemory, 2) $DiskInfo = Get-WmiObject Win32_LogicalDisk -Filter "DriveType=3" | ForEach-Object { [PSCustomObject]@{ DriveLetter = $_.DeviceID FreeSpaceGB = [math]::Round($_.FreeSpace / 1GB, 2) TotalSpaceGB = [math]::Round($_.Size / 1GB, 2) UsedSpaceGB = [math]::Round(($_.Size - $_.FreeSpace) / 1GB, 2) } } $Uptime = (Get-WmiObject Win32_OperatingSystem).LastBootUpTime $UptimeFormatted = (Get-Date) - ([Management.ManagementDateTimeConverter]::ToDateTime($Uptime)) # **Generate Report** $Report = @" Server Health Report for $ServerName CPU Utilization: $CPU% Memory Usage: $UsedMemory GB used out of $TotalMemory GB Disk Usage: @($DiskInfo | ForEach-Object { "Drive: $($_.DriveLetter) - Free: $($_.FreeSpaceGB) GB, Used: $($_.UsedSpaceGB) GB, Total: $($_.TotalSpaceGB) GB" }) -join "`n" Uptime: $([math]::Floor($UptimeFormatted.TotalDays)) days, $($UptimeFormatted.Hours) hours, $($UptimeFormatted.Minutes) minutes "@ # **Send Email** Send-MailMessage -From $EmailFrom -To $EmailTo -Subject $EmailSubject -Body $Report -SmtpServer $SMTPServer -Port $SMTPPort -Credential (New-Object PSCredential($SMTPUsername, (ConvertTo-SecureString $SMTPPassword -AsPlainText -Force))) -UseSsl
Key Notes:
- SMTP Configuration: Replace placeholders with your actual SMTP server details and credentials.
- Permissions: Ensure the script is run with sufficient privileges to access WMI and send emails.
- Disk Filtering: The script filters only local drives (
DriveType=3
). - Customization: You can modify the email body or add additional metrics as needed.
This script is designed to be run on a Windows server.
Another way
# Define variables $SMTPServer = "localhost" # Replace with your SMTP server if not localhost $From = "server-report@yourdomain.com" $To = "itsupport@yourdomain.com" $Subject = "Server Disk Space and Uptime Report" $Body = @() # Get server uptime $Uptime = (Get-CimInstance Win32_OperatingSystem).LastBootUpTime $UptimeFormatted = (Get-Date) - $Uptime $Body += "Server Uptime: $([math]::Floor($UptimeFormatted.TotalDays)) days, $($UptimeFormatted.Hours) hours, $($UptimeFormatted.Minutes) minutes`n" # Get disk space information $Body += "Disk Space Report:`n" $Disks = Get-CimInstance Win32_LogicalDisk -Filter "DriveType=3" # Only fixed drives foreach ($Disk in $Disks) { $FreeSpaceGB = [math]::Round($Disk.FreeSpace / 1GB, 2) $TotalSpaceGB = [math]::Round($Disk.Size / 1GB, 2) $UsedSpaceGB = $TotalSpaceGB - $FreeSpaceGB $PercentFree = [math]::Round(($FreeSpaceGB / $TotalSpaceGB) * 100, 2) $Body += "Drive $($Disk.DeviceID): $UsedSpaceGB GB used, $FreeSpaceGB GB free ($PercentFree% free)`n" } # Convert body to string $Body = $Body -join "`n" # Send email Send-MailMessage -From $From -To $To -Subject $Subject -Body $Body -SmtpServer $SMTPServer