You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写带计算机名参数的PowerShell脚本实现自动服务巡检及HTML输出?

PowerShell 服务巡检自动修复脚本实现方案

1. 核心逻辑设计

  • 入参处理:支持单个/批量计算机名作为输入,默认取本地计算机名
  • 服务校验逻辑:优先过滤所有启动类型为自动的服务,默认包含自动(延迟启动)服务,若需排除可修改过滤条件增加-and $_.DelayedAutoStart -eq $false参数
  • 异常处理:启动失败的服务捕获错误信息,从系统事件日志拉取准确的服务停止时间
  • 结果输出:结构化存储所有服务状态,自动生成带样式的HTML报表,直接写入IIS默认站点路径

2. 完整脚本实现

param(
    [Parameter(Mandatory=$false)]
    [string[]]$ComputerName = $env:COMPUTERNAME
)

# 初始化结果存储数组
$serviceReport = @()

foreach ($computer in $ComputerName) {
    try {
        # 获取目标计算机所有服务列表
        $allServices = Get-Service -ComputerName $computer -ErrorAction Stop
        # 过滤自动启动类服务
        $autoServices = $allServices | Where-Object {$_.StartType -eq 'Automatic'}
        
        foreach ($service in $autoServices) {
            $serviceDetail = [PSCustomObject]@{
                计算机名 = $computer
                服务名称 = $service.Name
                服务显示名 = $service.DisplayName
                启动类型 = $service.StartType
                当前状态 = $service.Status
                停止时间 = $null
                启动结果 = $null
            }

            # 校验未运行的自动启动服务,尝试自动启动
            if ($service.Status -ne 'Running') {
                # 拉取系统事件日志获取最近24小时内的服务停止时间
                $stopEvent = Get-WinEvent -ComputerName $computer -FilterHashtable @{
                    LogName = 'System'
                    ID = 7036
                    StartTime = (Get-Date).AddDays(-1)
                } | Where-Object {$_.Message -match "$($service.DisplayName).*已停止运行" -or $_.Message -match "$($service.Name).*stopped"} | Select-Object -First 1
                $serviceDetail.停止时间 = $stopEvent.TimeCreated

                # 执行服务启动操作
                try {
                    Start-Service -InputObject $service -ErrorAction Stop
                    $serviceDetail.当前状态 = 'Running'
                    $serviceDetail.启动结果 = '自动启动成功'
                } catch {
                    $serviceDetail.启动结果 = "启动失败:$($_.Exception.Message)"
                }
            } else {
                $serviceDetail.启动结果 = '已正常运行'
            }
            $serviceReport += $serviceDetail
        }

        # 若需统计非自动启动服务状态,取消下方注释即可
        <#
        $nonAutoServices = $allServices | Where-Object {$_.StartType -ne 'Automatic'}
        foreach ($ns in $nonAutoServices) {
            $serviceReport += [PSCustomObject]@{
                计算机名 = $computer
                服务名称 = $ns.Name
                服务显示名 = $ns.DisplayName
                启动类型 = $ns.StartType
                当前状态 = $ns.Status
                停止时间 = $null
                启动结果 = '非自动启动服务,不执行启动操作'
            }
        }
        #>
    } catch {
        # 捕获计算机连接失败异常
        $serviceReport += [PSCustomObject]@{
            计算机名 = $computer
            服务名称 = 'N/A'
            服务显示名 = '连接失败'
            启动类型 = 'N/A'
            当前状态 = 'N/A'
            停止时间 = $null
            启动结果 = "连接计算机失败:$($_.Exception.Message)"
        }
    }
}

# 生成带样式的HTML报表
$htmlHeader = @"
<style>
body {font-family: 微软雅黑; font-size: 14px; margin: 20px;}
table {border-collapse: collapse; width: 100%; margin-top: 15px;}
th {background-color: #007ACC; color: white; padding: 8px; text-align: left;}
td {border: 1px solid #ddd; padding: 8px;}
tr:nth-child(even) {background-color: #f2f2f2;}
.status-running {background-color: #ccffcc;}
.status-stopped {background-color: #ffcccc;}
.status-fail {background-color: #ffebcc;}
</style>
<title>服务巡检报表 $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')</title>
"@

$htmlContent = $serviceReport | ConvertTo-Html -Head $htmlHeader -PreContent "<h2>服务巡检自动修复报表 | 生成时间:$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')</h2>"

# 给不同状态的单元格增加高亮样式
$htmlContent = $htmlContent -replace '<td>Running</td>', '<td class="status-running">Running</td>'
$htmlContent = $htmlContent -replace '<td>Stopped</td>', '<td class="status-stopped">Stopped</td>'
$htmlContent = $htmlContent -replace '<td>启动失败.*?</td>', '<td class="status-fail">$&</td>'

# 输出到IIS默认站点路径,确保目录存在且有写入权限
$outputPath = "C:\inetpub\wwwroot\service_report.html"
$htmlContent | Out-File -FilePath $outputPath -Encoding utf8

# 控制台返回结果
return $serviceReport

3. 使用说明

  • 权限要求:运行脚本的账户需要拥有目标计算机的管理员权限、IIS站点目录的写入权限
  • 调用示例:.\ServiceCheck.ps1 -ComputerName "PC01","SRV01","SRV02"
  • 访问方式:HTML报表生成后,直接访问http://<部署脚本的服务器IP>/service_report.html即可查看
  • 定时执行:可配合Windows任务计划程序设置定时巡检,自动更新报表内容

内容的提问来源于stack exchange,提问作者mobio19

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 23:48:04