PowerShell脚本优化:如何让本地主机发送远程检测告警邮件?
修改思路
核心就是把远程机器执行邮件发送改成本地主机集中处理检测结果再发送邮件:
- 本地脚本遍历远程服务器列表,通过远程管理命令直接拉取进程检测结果
- 本地记录每个服务器的状态:连接成功且进程正常、连接失败、目标进程未运行
- 一旦出现异常,就用本地主机的SMTP配置触发告警邮件
具体修改步骤
- 删除原脚本中远程机器上的邮件发送代码块,将检测逻辑改为远程调用,把结果返回到本地
- 在本地脚本中配置好SMTP服务器、发件人、收件人等邮件参数
- 本地判断每个服务器的检测结果,出现异常时执行邮件发送操作
示例修改后的脚本
# 远程服务器列表 $servers = @("Server01", "Server02", "Server03") # 本地邮件配置(需确保本地主机能访问SMTP服务器) $smtpServer = "smtp.yourdomain.com" $smtpPort = 587 $smtpUser = "alerts@yourdomain.com" $smtpPassword = ConvertTo-SecureString "your_smtp_password" -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential ($smtpUser, $smtpPassword) $from = "alerts@yourdomain.com" $to = "admin@yourdomain.com" $subjectPrefix = "PN9进程检测告警" # 遍历远程服务器执行检测 foreach ($server in $servers) { $errorInfo = $null $processExists = $false try { # 远程检测带pn9参数的javaw.exe进程 $targetProcess = Get-CimInstance -ComputerName $server -ClassName Win32_Process -Filter "Name='javaw.exe' AND CommandLine LIKE '%pn9%'" -ErrorAction Stop if ($targetProcess) { $processExists = $true Write-Host "[$server] 目标进程正常运行" } else { $errorInfo = "未找到带pn9参数的javaw.exe进程" Write-Warning "[$server] $errorInfo" } } catch { $errorInfo = "远程连接失败: $($_.Exception.Message)" Write-Warning "[$server] $errorInfo" } # 本地发送告警邮件(仅当出现异常时) if (-not $processExists -or $errorInfo) { $subject = "$subjectPrefix - $server" $body = @" 服务器名称: $server 异常详情: $errorInfo 检测时间: $(Get-Date -Format "yyyy-MM-dd HH:mm:ss") "@ Send-MailMessage -SmtpServer $smtpServer -Port $smtpPort -Credential $credential -From $from -To $to -Subject $subject -Body $body -UseSsl Write-Host "[$server] 告警邮件已发送" } }
关键修改说明
- 用
Get-CimInstance替代远程执行脚本的方式,直接在本地获取远程进程数据,无需在远程机器运行额外代码 - 所有邮件发送逻辑都在本地执行,完全依赖本地主机的网络和SMTP配置,与远程机器网络状态无关
- 异常捕获覆盖了远程连接失败、目标进程未找到两种场景,确保每种异常都能触发告警
- 若不想每台异常服务器单独发邮件,可先将所有异常信息存入数组,最后一次性发送汇总告警
内容的提问来源于stack exchange,提问作者aristosv
相关产品推荐
相关产品推荐

