编程

winskill

试用

Windows 服务器运维工具箱 - 磁盘分析、临时文件清理、IIS 站点管理、批量文件操作、服务状态监控、Windows Update 诊断、实时性能监控、安全审计、注册表启动项审计、磁盘健康检测、网络端口监控、事件日志诊断、已安装程序管理、用户会话监控、计划任务审计、文件共享审计、DNS网卡诊断、SSL证书过期检测、防火墙规则审计、服务崩溃恢复状态、系统文件修复、存储池管理、备份状态检查、Docker容器管理、K8s集群监控、自动化修复向导、性能基线与趋势分析、等保合规检查清单、远程多服务器管理、日志轮转、模块索引。只读分析+安全确认,绝不误删文件,完全免费离线运行。

它能做什么

Windows 服务器运维工具箱 - 磁盘分析、临时文件清理、IIS 站点管理、批量文件操作、服务状态监控、Windows Update 诊断、实时性能监控、安全审计、注册表启动项审计、磁盘健康检测、网络端口监控、事件日志诊断、已安装程序管理、用户会话监控、计划任务审计、文件共享审计、DNS网卡诊断、SSL证书过期检测、防火墙规则审计、服务崩溃恢复状态、系统文件修复、存储池管理、备份状态检查、Docker容器管理、K8s集群监控、自动化修复向导、性能基线与趋势分析、等保合规检查清单、远程多服务器管理、日志轮转、模块索引。只读分析+安全确认,绝不误删文件,完全免费离线运行。

技能文档

Winskill — Windows 服务器运维工具箱

快速开始

直接对 AI 说就行,不用记命令。

你想做什么直接对 AI 说
看磁盘空间"帮我扫一下 D 盘大文件"
清理临时文件"看看我电脑的临时文件"
检查 IIS"我的 IIS 站点还活着吗?"
检测重复文件"帮我找下重复文件"
检查服务状态"看下数据库和 IIS 服务有没有挂"
Windows Update 状态"Windows Update 正常吗?有积压补丁吗?"
服务器卡顿定位"服务器变卡了,帮我看看是什么原因"
检查有没有被入侵"帮我查一下有没有异常登录"
检查可疑启动项"有没有可疑的自启动程序"
磁盘健康状态"硬盘还健康吗?有没有坏道"
网络连接监控"谁在连我的服务器"
系统日志哪里错了"系统日志有没有最近的错误"
服务器装了什么程序"看看系统安装了哪些软件"
谁在服务器上"当前有谁登录了服务器"
检查计划任务"有没有可疑的计划任务"
文件共享审计"有哪些共享文件夹,权限安全吗"
DNS / 网卡诊断"DNS 解析正常吗"
搞不定了"我遇到报错了,帮我看看"

⚠️ AI 必须遵守:凡涉及删除、停止服务、修改系统的操作,必须先展示操作清单,等用户明确说"确认执行"后才可执行。


安全声明

保护项方式
系统目录保护绝不操作 C:\WindowsC:\Program Files
删除必须确认先展示受影响文件,等用户说"确认清理"后才执行
回收站优先删除用 Shell.Application 回收站 API
只读诊断所有分析命令不修改任何文件/服务/注册表
排除保护pagefile.syshiberfil.sys 等系统文件不可操作
注册表保护注册表分析只读,任何修改需双重确认
日志读取保护事件日志只读查看,不修改任何日志记录

功能模块

📋 日志记录与轮转

function Write-WinskillLog {
    param([string]$Message)
    $logDir = "$env:USERPROFILE\.workbuddy\output\winskill"
    $logFile = Join-Path $logDir "winskill.log"
    New-Item -ItemType Directory -Force -Path $logDir | Out-Null
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    "$timestamp $Message" | Out-File $logFile -Append -Encoding utf8
    if (Test-Path $logFile) {
        $size = (Get-Item $logFile).Length
        if ($size -gt 10MB) {
            $timestamp = Get-Date -Format "yyyyMMddHHmmss"
            Move-Item $logFile "winskill.log.$timestamp" -Force
        }
    }
    Get-ChildItem $logDir -Filter "winskill.log.*" | Where-Object {
        $_.LastWriteTime -lt (Get-Date).AddDays(-7)
    } | Remove-Item -Force
}

📋 模块索引(一键列出所有可用操作)

Write-Host "`n📋 Winskill 3.1.0 - 模块索引(共 30 个模块)"
Write-Host ("=" * 60)
Write-Host ("{0,-25} {1,-35}" -f "模块", "用途")
Write-Host ("-" * 60)
$modules = @(
    "模块 1: 磁盘空间分析 - 扫大文件/目录占用",
    "模块 2: 大文件重复检测 - 找重复文件",
    "模块 3: 临时文件安全清理 - 清理临时文件",
    "模块 4: IIS 站点管理 - IIS 站点/应用池状态",
    "模块 5: 服务状态监控 - Windows 服务状态",
    "模块 6: 批量文件操作 - 批量重命名/移动/复制",
    "模块 7: 目录磁盘使用报告 - 目录大小报告",
    "模块 8: Windows Update 服务状态 - 更新服务/缓存",
    "模块 9: 实时性能监控 - CPU/内存/磁盘/网络",
    "模块 10: 安全审计与日志分析 - 暴力破解/特权操作",
    "模块 11: 注册表与启动项安全审计 - 启动项/WMI",
    "模块 12: 磁盘健康状态检测 - SMART/坏道/温度",
    "模块 13: 网络连接与端口监控 - 连接/端口/防火墙",
    "模块 14: Windows 事件日志诊断 - 系统/应用日志",
    "模块 15: 已安装程序与补丁管理 - 程序/补丁清单",
    "模块 16: 用户会话与登录状态监控 - 会话/登录",
    "模块 17: 计划任务审计 - 计划任务清单",
    "模块 18: 文件共享与 SMB 审计 - 共享/权限",
    "模块 19: DNS 解析与网卡诊断 - DNS/网卡",
    "模块 20: SSL 证书过期检测 - 证书扫描",
    "模块 21: 防火墙规则审计 - 规则/高危检测",
    "模块 22: 关键服务崩溃与自动恢复 - 服务崩溃记录",
    "模块 23: 系统文件完整性检查与修复 - SFC/DISM",
    "模块 24: 存储池与虚拟磁盘管理 - Storage Spaces",
    "模块 25: Windows Server Backup 状态检查 - 备份状态",
    "模块 26: Docker / K8s 容器管理 - 容器/集群",
    "模块 27: 自动化修复向导 - 一键修复常见问题",
    "模块 28: 性能基线 & 趋势分析 - 趋势/告警/预测",
    "模块 29: 安全合规检查清单 - 等保2.0/CIS",
    "模块 30: 远程多服务器管理 - 多机批量管理"
)
$modules | ForEach-Object { Write-Host $_ }
Write-Host ("=" * 60)
Write-Host "直接对 AI 说模块名称或用途即可调用"

📌 模块导航(点击直达,共 30 个模块)

🖥️ 基础运维(1-7): 模块 1:磁盘空间分析 · 模块 2:大文件重复检测 · 模块 3:临时文件安全清理 · 模块 4:IIS 站点管理 · 模块 5:服务状态监控 · 模块 6:批量文件操作 · 模块 7:目录磁盘使用报告

🔧 进阶运维(8-18): 模块 8:Windows Update 服务状态与缓存管理 · 模块 9:实时性能监控与进程资源分析 · 模块 10:安全审计与日志分析 · 模块 11:注册表与启动项安全审计 · 模块 12:磁盘健康状态检测 · 模块 13:网络连接与端口监控 · 模块 14:Windows 事件日志诊断 · 模块 15:已安装程序与补丁管理 · 模块 16:用户会话与登录状态监控 · 模块 17:计划任务审计 · 模块 18:文件共享与 SMB 审计

🔒 安全专项(19-25): 模块 19:DNS 解析与网卡诊断 · 模块 20:SSL 证书过期检测 · 模块 21:Windows 防火墙规则审计 · 模块 22:关键服务崩溃与自动恢复状态 · 模块 23:系统文件完整性检查与修复(SFC / DISM) · 模块 24:存储池与虚拟磁盘管理(Storage Spaces) · 模块 25:Windows Server Backup 状态检查

🚀 高级功能(26-30): 模块 26:Docker / K8s 容器管理 · 模块 27:自动化修复向导 · 模块 28:性能基线 & 趋势分析 · 模块 29:安全合规检查清单 · 模块 30:远程多服务器管理


模块 1:磁盘空间分析

📋 展开查看:模块 1:磁盘空间分析

用途:扫描指定路径,找出占用空间的大文件和目录。

常你说"扫一下 C 盘大文件" / "D 盘哪个最占空间"

$scanPath = "C:\"   # ← 改成你要扫的盘符或目录

Get-ChildItem -Path $scanPath -Recurse -File -ErrorAction SilentlyContinue |
    Where-Object { $_.Length -gt 100MB } |
    Sort-Object Length -Descending |
    Select-Object -First 50 @{N='路径';E={$_.FullName}},
        @{N='大小(GB)';E={[math]::Round($_.Length/1GB,2)}},
        @{N='最后修改';E={$_.LastWriteTime}}

风险等级:🟢 无(只读)

报错含义解决
Access to the path 'xxx' is denied权限不足管理员身份运行 PowerShell
Could not find a part of the path目录不存在确认路径

↑ 返回顶部


模块 2:大文件重复检测

📋 展开查看:模块 2:大文件重复检测

用途:通过 MD5 哈希找出重复文件。

常你说"找找 D 盘有没有重复文件"

$scanPath = "D:\"   # ← 扫描目标目录
$minSize = 1MB      # ← 只检测大于 1MB 的文件

Get-ChildItem -Path $scanPath -Recurse -File -ErrorAction SilentlyContinue |
    Where-Object { $_.Length -gt $minSize } |
    ForEach-Object {
        $hash = (Get-FileHash $_.FullName -Algorithm MD5 -ErrorAction SilentlyContinue).Hash
        if ($hash) {
            [PSCustomObject]@{
                路径 = $_.FullName
                哈希 = $hash
                大小MB = [math]::Round($_.Length/1MB,2)
            }
        }
    } |
    Group-Object 哈希 |
    Where-Object { $_.Count -gt 1 } |
    ForEach-Object { $_.Group }

风险等级:🟢 无(只读)

报错含义解决
Exception getting file hash文件正在使用跳过
The specified path is not valid路径格式不对检查路径

↑ 返回顶部


模块 3:临时文件安全清理

📋 展开查看:模块 3:临时文件安全清理

用途:扫描安全可删的临时文件,先预览后确认再清理。

常你说"帮我清理临时文件" / "C 盘快满了帮清 temp"

安全清理路径

路径说明安全天数
%TEMP%\*用户临时文件>7 天
C:\Windows\Temp\*系统临时文件>7 天
C:\Windows\SoftwareDistribution\Download\*Windows Update 下载缓存任意
C:\Windows\Prefetch\*程序预取>30 天
IIS Temporary Compressed Files\*IIS 压缩缓存>1 天
$tempPath = $env:TEMP
$daysOld = 7
$cutoff = (Get-Date).AddDays(-$daysOld)

$tempFiles = Get-ChildItem -Path $tempPath -Recurse -ErrorAction SilentlyContinue |
    Where-Object { $_.LastWriteTime -lt $cutoff }

Write-Host "═══════════════════════════════════════════"
Write-Host "  📋 扫描结果: $tempPath"
Write-Host "  过期临时文件数: $($tempFiles.Count) 个"
Write-Host "═══════════════════════════════════════════"

$tempFiles | Sort-Object Length -Descending |
    Select-Object -First 20 |
    Select-Object @{N='文件路径';E={$_.FullName}},
        @{N='大小(KB)';E={[math]::Round($_.Length/1KB,1)}},
        @{N='最后修改';E={$_.LastWriteTime}} |
    Format-Table -AutoSize

$totalKB = ($tempFiles | Measure-Object -Property Length -Sum).Sum
Write-Host "  预计可释放空间: $([math]::Round($totalKB/1MB,2)) MB"
Write-Host "  ⚠️ 确认删除请说 '确认清理'"
# ⚠️ 仅当用户明确说「确认清理」后才执行!
Write-Host "  正在移到回收站..."
$shell = New-Object -ComObject Shell.Application
$rb = $shell.NameSpace(0x0a)
$totalFiles = 0
foreach ($f in $tempFiles) {
    try {
        $rb.MoveHere($f.FullName)
        $totalFiles++
    } catch { }
}
Write-Host "  ✅ 已完成!已将 $totalFiles 个文件移到回收站"
Write-Host "  如需彻底删除,请手动清空回收站"

风险等级:🟡 中(需确认后删除)

报错含义解决
Cannot find path ... does not existtemp 目录下某些路径不存在自动跳过
Access is denied系统临时文件正在使用中跳过,正常现象
MoveHere 失败回收站操作异常手动清或用其他方式

↑ 返回顶部


模块 4:IIS 站点管理

📋 展开查看:模块 4:IIS 站点管理

用途:查看站点状态、应用池信息、快速重启。

常你说"我的 IIS 站点正常吗?" / "重启一下应用池"

前置条件(需管理员权限):

if (-not (Get-Module -ListAvailable -Name WebAdministration)) {
    Write-Host "⚠️ IIS 管理工具未安装,请以管理员运行:"
    Install-WindowsFeature Web-Mgmt-Tools
}
Import-Module WebAdministration
Import-Module WebAdministration

Write-Host "════════ IIS 站点列表 ════════"
Get-Website | Select-Object @{N='站点名';E={$_.Name}},
    @{N='状态';E={$_.State}},
    @{N='物理路径';E={$_.PhysicalPath}},
    @{N='应用池';E={$_.ApplicationPool}},
    @{N='绑定';E={$_.Bindings -join ';'}} |
    Format-Table -AutoSize

Write-Host "`n════════ 应用池状态 ════════"
Get-WebAppPoolState | Select-Object @{N='名';E={$_.Name}}, @{N='状态';E={$_.Value}} |
    Format-Table -AutoSize
# ⚠️ 仅当用户明确确认后才执行!
# Restart-WebSite -Name "你的站点名"

风险等级:🟢 查看只读 / 🟡 重启需确认

报错含义解决
Get-Website is not recognizedIIS 模块未加载Install-WindowsFeature Web-Mgmt-Tools
Cannot connect to IISW3SVC 服务未启动管理服务
Could not find WebAdministration未装 IIS 管理工具添加 Web 管理工具

↑ 返回顶部


模块 5:服务状态监控

📋 展开查看:模块 5:服务状态监控

用途:一眼看出哪些关键服务挂了。

常你说"检查服务器关键服务" / "看下数据库有没有挂"

$criticalServices = @(
    "W3SVC",        # IIS
    "MSSQLSERVER",  # SQL Server
    "MySQL80",      # MySQL
    "Redis",        # Redis
    "Elasticsearch",# ES
    "Docker",       # Docker
    "Spooler",      # 打印
    "TermService",  # 远程桌面
    "Nginx",        # Nginx
    "Apache",       # Apache
    "Tomcat"        # Tomcat
)

Write-Host "════════ 关键服务状态 ════════"
$hasStopped = $false
foreach ($svc in $criticalServices) {
    $s = Get-Service -Name $svc -ErrorAction SilentlyContinue
    if ($s) {
        $icon = if ($s.Status -eq 'Running') { '✅' } else { '❌'; $hasStopped = $true }
        Write-Host "  $icon $($s.DisplayName) [$($s.Status)]"
    }
}
Write-Host "═══════════════════════════════"
if ($hasStopped) { Write-Host "  ⚠️ 有服务未运行" }
else { Write-Host "  ✅ 所有检测服务正常" }

风险等级:🟢 无(只读)

报错含义解决
Cannot find any service ...该服务未安装自动跳过

↑ 返回顶部


模块 6:批量文件操作

📋 展开查看:模块 6:批量文件操作

用途:先预览规则,再确认执行批量重命名/移动。

常你说"把所有 .log 改成 backup_1.log 格式"

$sourceDir = "D:\logs"    # ← 源目录
$searchFilter = "*.log"   # ← 文件筛选
$renamePrefix = "backup"  # ← 新文件名前缀

$files = Get-ChildItem -Path $sourceDir -Filter $searchFilter -File
Write-Host "════════ 批量重命名预览 ════════"
Write-Host "  扫描到 $($files.Count) 个 $searchFilter 文件"

$i = 1
foreach ($f in $files) {
    Write-Host "  🔄 $($f.Name) → ${renamePrefix}_${i}${f.Extension}"
    $i++
}

Write-Host "`n  共 $($files.Count) 个文件将被重命名"
Write-Host "  ⚠️ 确认执行请说 '确认重命名'"
# ⚠️ 仅当用户明确说「确认重命名」后才执行!
# $i = 1
# foreach ($f in $files) {
#     $newName = "${renamePrefix}_${i}${f.Extension}"
#     Rename-Item -Path $f.FullName -NewName $newName
#     Write-Host "  ✅ $($f.Name) → $newName"
#     $i++
# }

风险等级:🟡 中(需确认)

报错含义解决
Cannot rename because item already exists新文件名已存在加时间戳避免重名
Access to the path is denied文件锁定关相关程序再试

↑ 返回顶部


模块 7:目录磁盘使用报告

📋 展开查看:模块 7:目录磁盘使用报告

用途:用进度条样式一眼看出各目录占用。

常你说"看看各个目录的空间占用"

function Get-DirectorySize([string]$Path) {
    (Get-ChildItem -Path $Path -Recurse -File -ErrorAction SilentlyContinue |
     Measure-Object -Property Length -Sum).Sum
}

$dirs = @("C:\inetpub", "C:\Windows\Temp", "C:\ProgramData",
          "$env:TEMP", "C:\Users",
          "C:\Windows\SoftwareDistribution", "D:\")

foreach ($d in $dirs) {
    if (Test-Path $d) {
        $sizeGB = [math]::Round((Get-DirectorySize $d) / 1GB, 2)
        if ($sizeGB -gt 10)     { $icon = '🔴' }
        elseif ($sizeGB -gt 5) { $icon = '🟡' }
        else                  { $icon = '🟢' }
        Write-Host "  $icon $d : ${sizeGB} GB"
    }
}

风险等级:🟢 无(只读)

↑ 返回顶部


🆕 模块 8:Windows Update 服务状态与缓存管理

📋 展开查看:🆕 模块 8:Windows Update 服务状态与缓存管理

用途:诊断 Windows Update 是否卡住、查看已安装补丁、清理更新缓存。

常你说"Windows Update 正常吗?" / "更新缓存能不能删"

8.1 查看更新服务状态与已安装补丁(只读)

# 更新服务状态
Get-Service -Name wuauserv |
    Select-Object @{N='服务';E={$_.Name}},
        @{N='状态';E={$_.Status}},
        @{N='启动类型';E={$_.StartType}},
        @{N='账号';E={$_.StartName}}

Write-Host ""

# 已安装补丁(最近 10 个)
Get-HotFix | Sort-Object InstalledOn -Descending |
    Select-Object -First 10 @{N='补丁ID';E={$_.HotFixID}},
        @{N='安装日期';E={$_.InstalledOn}}

8.2 检查 SoftwareDistribution 更新缓存大小

$sd = "C:\Windows\SoftwareDistribution"
if (Test-Path $sd) {
    $total = (Get-ChildItem -Path $sd -Recurse -ErrorAction SilentlyContinue |
              Measure-Object -Property Length -Sum).Sum
    Write-Host "  SoftwareDistribution 大小: $([math]::Round($total/1MB,1)) MB"

    $dlDir = Join-Path $sd "Download"
    if (Test-Path $dlDir) {
        $dlSize = (Get-ChildItem -Path $dlDir -Recurse -ErrorAction SilentlyContinue |
                   Measure-Object -Property Length -Sum).Sum
        Write-Host "  └─ 下载缓存(Download): $([math]::Round($dlSize/1MB,1)) MB"
    }
    Write-Host "  💡 若超过 500MB 可考虑清理(需先停止 wuauserv 服务)"
} else {
    Write-Host "  ⚠️ SoftwareDistribution 目录不存在"
}
# ⚠️ 仅当用户明确说「确认清理更新缓存」后才执行!
# Stop-Service -Name wuauserv -Force
# Remove-Item -Path "$sd\Download\*" -Recurse -Force -ErrorAction SilentlyContinue
# Start-Service -Name wuauserv
# Write-Host "  ✅ 已清理更新下载缓存,Windows Update 将重新下载所需补丁"

风险等级:🟢 查看只读 / 🟡 清理缓存需确认

报错含义解决
The service ... cannot be stopped服务正在使用稍后重试或重启后清理
Access is denied部分缓存文件被锁定先停服务再清理

常见坑 & 解决

场景说明
Windows Update 一直不下载服务挂起,重停重启动可解决
错误码 0x80070005权限问题,清理缓存可修复
补丁安装失败清理 Download 缓存后重新检查更新

↑ 返回顶部


🆕 模块 9:实时性能监控与进程资源分析

📋 展开查看:🆕 模块 9:实时性能监控与进程资源分析

用途:定位 CPU/内存/磁盘 I/O 瓶颈,按进程排序找到罪魁祸首。

常你说"服务器变卡了,帮我看看" / "哪个进程吃内存最多"

9.1 实时性能计数器(只读)

Get-Counter '\Processor(_Total)\% Processor Time',
              '\Memory\Available MBytes',
              '\Memory\% Used',
              '\PhysicalDisk(_Total)\% Disk Time',
              '\PhysicalDisk(_Total)\Current Disk Queue Length' |
    Select-Object -ExpandProperty CounterSamples |
    Select-Object @{N='指标';E={$_.Path.Split('\')[-2..-1] -join '\'}},
        @{N='当前值';E={[math]::Round($_.CookedValue, 1)}} |
    Format-Table -AutoSize

9.2 内存占用 Top 10 进程

Get-Process | Sort-Object WorkingSet64 -Descending |
    Select-Object -First 10 @{N='进程名';E={$_.Name}},
        @{N='内存(MB)';E={[math]::Round($_.WorkingSet64/1MB,1)}},
        @{N='CPU(s)';E={[math]::Round($_.CPU,1)}} |
    Format-Table -AutoSize

9.3 磁盘 I/O 详细统计(按进程)

Get-Counter '\Process(*)\Read Bytes/sec',
              '\Process(*)\Write Bytes/sec' |
    Select-Object -ExpandProperty CounterSamples |
    Where-Object { $_.CookedValue -gt 0 } |
    Sort-Object CookedValue -Descending |
    Select-Object -First 15 @{N='进程';E={
        $_.Path -replace '\\Process\((.*)\)\\Read Bytes/sec$','$1' |
        ForEach-Object { if ($_ -eq 'idle') { 'System Idle' } else { $_ }
    }}, @{N='Bytes/s';E={[math]::Round($_.CookedValue, 0)}} |
    Format-Table -AutoSize
# ⚠️ 仅当用户明确说「确认创建」后才执行!
# $collector = New-DataCollectorSet -Name "ServerPerf_$(Get-Date -Format 'yyyyMMdd')" -Path "C:\PerfLogs"
# $collector.DataCollectors.Create(0, "Counter", 0,
#     '\Processor(_Total)\% Processor Time',
#     '\Memory\Available MBytes',
#     '\PhysicalDisk(_Total)\% Disk Time'
# )
# $collector.Commit("C:\PerfLogs\ServerPerf", 0, 0x01) | Out-Null
# Write-Host "  ✅ 已创建性能采集器,数据将保存到 C:\PerfLogs"

风险等级:🟢 实时查看 / 🟡 创建采集器需确认

报错含义解决
The specified counter is not found计数器未注册运行 lodctr /R 重建计数器
Access denied需要管理员权限提升后执行

常见坑 & 解决

场景说明
CPU 持续 >90%按进程排序定位异常进程
可用内存 <500MB判断是否内存泄漏, IIS 应用池是否需回收
磁盘队列长度 >2I/O 瓶颈,检查是否日志写入过多
计数器全为零lodctr /R 重建性能计数器

↑ 返回顶部


🆕 模块 10:安全审计与日志分析

📋 展开查看:🆕 模块 10:安全审计与日志分析

用途:检测暴力破解、特权操作、异常登录。

常你说"帮我查下有没有被入侵" / "有没有异常登录记录"

10.1 检测暴力破解尝试(最近 24 小时)

$since = (Get-Date).AddHours(-24)

$failedLogins = Get-WinEvent -FilterHashtable @{
    LogName='Security'; ID=4625; StartTime=$since
} -ErrorAction SilentlyContinue

if ($failedLogins) {
    Write-Host "⚠️ 最近 24h 失败登录 $($failedLogins.Count) 次`n"
    $failedLogins |
        Select-Object TimeCreated,
            @{N='账号';E={$_.Properties[5].Value}},
            @{N='来源IP';E={$_.Properties[19].Value}} |
        Group-Object SourceIP |
        Sort-Object Count -Descending |
        Select-Object -First 10 @{N='攻击源IP';E={$_.Name}},
            @{N='尝试次数';E={$_.Count}} |
        Format-Table -AutoSize
    Write-Host "  💡 尝试次数 >10 的 IP 建议加入防火墙黑名单"
} else {
    Write-Host "  ✅ 最近 24 小时无失败登录记录"
}

10.2 查看特权提升操作(管理员操作审计)

$since = (Get-Date).AddHours(-24)

Write-Host "════════ 特权操作(4672)════════"
Get-WinEvent -FilterHashtable @{
    LogName='Security'; ID=4672; StartTime=$since
} -ErrorAction SilentlyContinue |
    Select-Object TimeCreated,
        @{N='用户';E={$_.Properties[1].Value}},
        @{N='特权';E={$_.Properties[2..($_.Properties.Count-1)].Value -join ', '}} |
    Format-Table -AutoSize

10.3 本地管理员组成员检查

Write-Host "════════ 本地管理员组成员 ════════"
Get-LocalGroupMember -Group "Administrators" |
    Select-Object @{N='用户名';E={$_.Name}},
        @{N='来源';E={$_.PrincipalSource}} |
    Format-Table -AutoSize
# ⚠️ 仅当用户明确说「确认导出」后才执行!
# $logPath = "C:\Logs\Security_$(Get-Date -Format 'yyyyMMdd').evtx"
# if (-not (Test-Path "C:\Logs")) { New-Item -ItemType Directory -Path "C:\Logs" -Force }
# wevtutil epl Security $logPath
# Write-Host "  ✅ 安全日志已导出到: $logPath"

风险等级:🟢 只读审计 / 🟡 导出需确认

报错含义解决
No events were found ...没有符合条件的日志正常,说明期间无异常
The requested operation cannot be performed on a file ...日志文件被占用复制到另一路径导出
Get-LocalGroupMember 报错需要管理员权限提升执行

常见坑 & 解决

场景说明
某 IP 失败登录 >100 次暴力破解,建议防火墙封禁
4672 事件频繁有人在频繁执行管理员操作,需排查
管理员组成员异常多了不认识账号立即排查是否被入侵后留后门,删非法账号

↑ 返回顶部


🆕 模块 11:注册表与启动项安全审计

📋 展开查看:🆕 模块 11:注册表与启动项安全审计

用途:检测恶意持久化机制(注册表自启动、计划任务、WMI 订阅)。

常你说"有没有可疑的自启动程序" / "检查一下持久化威胁"

⚠️ 本模块所有操作均为只读分析,绝不修改注册表或删除任何键值。

11.1 经典自启动注册表位置扫描

$runKeys = @(
    "HKLM:\Software\Microsoft\Windows\CurrentVersion\Run",
    "HKLM:\Software\Microsoft\Windows\CurrentVersion\RunOnce",
    "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run",
    "HKCU:\Software\Microsoft\Windows\CurrentVersion\RunOnce",
    "HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Run"
)

Write-Host "════════ 自启动注册表项 ════════"
foreach ($key in $runKeys) {
    if (Test-Path $key) {
        Write-Host "`n  📁 $($key.Split('\')[-1..-1] -join '\')"
        Get-ItemProperty $key -ErrorAction SilentlyContinue |
            Get-Member -MemberType NoteProperty |
            Where-Object { $_.Name -notlike 'PS*' } |
            ForEach-Object {
                $val = (Get-ItemProperty $key -Name $_.Name -ErrorAction SilentlyContinue).$($_.Name)
                Write-Host "    🔹 $($_.Name) = $val"
            }
    }
}
Write-Host "`n═══════════════════════════════"
Write-Host "  💡 不认识的程序请搜索确认,不要直接删除"

11.2 计划任务审计

Write-Host "════════ 计划任务列表 ════════"
Get-ScheduledTask | Where-Object { $_.State -ne 'Disabled' } |
    Select-Object @{N='任务名';E={$_.TaskName}},
        @{N='状态';E={$_.State}},
        @{N='作者';E={$_.Author}},
        @{N='运行方式';E={$_.Principal.UserId}} |
    Format-Table -AutoSize

Write-Host "`n════════ 最近修改的任务 ════════"
Get-ScheduledTask | Sort-Object LastWriteTime -Descending |
    Select-Object -First 10 @{N='任务名';E={$_.TaskName}},
        @{N='修改时间';E={$_.LastWriteTime}} |
    Format-Table -AutoSize

11.3 WMI 持久化检测

Write-Host "════════ WMI 事件订阅 ════════"
try {
    $wmiSubs = Get-CimInstance -Namespace root\subscription -ClassName __EventFilter -ErrorAction SilentlyContinue
    if ($wmiSubs) {
        $wmiSubs | Select-Object @{N='名称';E={$_.Name}},
            @{N='查询';E={$_.Query}} |
            Format-Table -AutoSize
    } else {
        Write-Host "  ✅ 未发现 WMI 事件订阅"
    }
} catch {
    Write-Host "  ⚠️ WMI 查询失败,可能需要管理员权限"
}

11.4 系统服务异常检测

Write-Host "════════ 非微软服务列表 ════════"
Get-Service | Where-Object {
    $_.DisplayName -notlike '*Microsoft*' -and
    $_.DisplayName -notlike '*Windows*' -and
    $_.DisplayName -notlike '*Intel*' -and
    $_.DisplayName -notlike '*NVIDIA*' -and
    $_.DisplayName -notlike '*AMD*' -and
    $_.DisplayName -notlike '*Realtek*' -and
    $_.DisplayName -notlike '*HP*' -and
    $_.DisplayName -notlike '*Dell*'
} | Select-Object @{N='服务名';E={$_.Name}},
    @{N='显示名';E={$_.DisplayName}},
    @{N='状态';E={$_.Status}},
    @{N='启动类型';E={$_.StartType}} |
    Format-Table -AutoSize

风险等级:🟢 无(只读审计)

报错含义解决
Access to the path is denied权限不足管理员身份运行
Requested registry access is not allowed注册表权限限制提升权限执行
Get-CimInstance 报错WMI 服务未启动检查 Winmgmt 服务

常见坑 & 解决

场景说明
Run 键值超多(>20个)正常软件也会注册,重点排查不认识的
WMI 订阅存在未知项可能是恶意软件持久化,需进一步分析
服务名随机字符串典型恶意软件特征,需立即排查

↑ 返回顶部


🆕 模块 12:磁盘健康状态检测

📋 展开查看:🆕 模块 12:磁盘健康状态检测

用途:检测磁盘 SMART 状态、坏道预警、磁盘寿命预测。

常你说"硬盘还健康吗?" / "有没有坏道" / "磁盘寿命还剩多久"

⚠️ 本模块所有操作均为只读检测,不会执行磁盘修复或擦除操作。

12.1 SMART 状态概览

Write-Host "════════ 磁盘 SMART 状态 ════════"
Get-PhysicalDisk | Select-Object @{N='磁盘';E={$_.FriendlyName}},
    @{N='状态';E={$_.HealthStatus}},
    @{N='使用时长';E={[math]::Round($_.UsageHours,0)}},
    @{N='温度(°C)';E={$_.Temperature}},
    @{N='剩余寿命%';E={$_.RemainingLifetimePercent}} |
    Format-Table -AutoSize

12.2 磁盘坏道与错误计数

Write-Host "════════ 磁盘错误统计 ════════"
Get-PhysicalDisk | ForEach-Object {
    $disk = $_
    $errors = Get-StorageReliabilityCounter -PhysicalDisk $disk -ErrorAction SilentlyContinue
    if ($errors) {
        [PSCustomObject]@{
            磁盘 = $disk.FriendlyName
            读取错误 = $errors.ReadErrorsTotal
            写入错误 = $errors.WriteErrorsTotal
            重映射扇区 = $errors.ReallocatedSectors
            待映射扇区 = $errors.PendingSectors
            不可修复错误 = $errors.UncorrectableErrors
        }
    }
} | Format-Table -AutoSize

Write-Host "`n  💡 重映射扇区 >0 或待映射扇区 >0 表示磁盘开始老化"
Write-Host "  💡 不可修复错误 >0 建议立即备份数据并更换磁盘"

12.3 磁盘温度监控

Write-Host "════════ 磁盘温度监控 ════════"
Get-PhysicalDisk | ForEach-Object {
    $temp = $_.Temperature
    if ($temp -gt 50)     { $icon = '🔴' }
    elseif ($temp -gt 40) { $icon = '🟡' }
    else                  { $icon = '🟢' }
    [PSCustomObject]@{
        磁盘 = $_.FriendlyName
        温度 = "${temp}°C"
        状态 = $icon
    }
} | Format-Table -AutoSize

Write-Host "`n  💡 温度 >50°C 需检查散热,>60°C 立即停机检查"

12.4 磁盘 I/O 延迟分析

Write-Host "════════ 磁盘 I/O 延迟 ════════"
Get-Counter '\PhysicalDisk(*)\Avg. Disk sec/Read',
              '\PhysicalDisk(*)\Avg. Disk sec/Write' |
    Select-Object -ExpandProperty CounterSamples |
    Where-Object { $_.CookedValue -gt 0 } |
    Select-Object @{N='磁盘';E={
        $_.Path -replace '\\PhysicalDisk\((.*)\)\\.*$','$1'
    }}, @{N='平均延迟(ms)';E={[math]::Round($_.CookedValue * 1000, 2)}} |
    Format-Table -AutoSize

Write-Host "`n  💡 读延迟 >20ms 或写延迟 >20ms 表示磁盘性能下降"

风险等级:🟢 无(只读检测)

报错含义解决
No MSFT_PhysicalDisk ...系统不支持存储诊断需 Windows Server 2016+
Temperature 属性不存在磁盘不支持温度传感器用第三方工具检测
Get-StorageReliabilityCounter 报错需要管理员权限提升执行

常见坑 & 解决

场景说明
SMART 状态显示 "Warning"磁盘开始老化,立即备份数据
重映射扇区持续增长磁盘寿命将尽,尽快更换
I/O 延迟突然飙升可能磁盘故障前兆,检查 SMART

↑ 返回顶部


🆕 模块 13:网络连接与端口监控

📋 展开查看:🆕 模块 13:网络连接与端口监控

用途:检测异常网络连接、监听端口、可疑外连行为。

常你说"谁在连我的服务器" / "有没有异常外连" / "检查监听端口"

⚠️ 本模块所有操作均为只读检测,不会修改防火墙规则或终止连接。

13.1 活动网络连接概览

Write-Host "════════ 活动网络连接 ════════"
Get-NetTCPConnection -State Established -ErrorAction SilentlyContinue |
    Select-Object @{N='本地地址';E={$_.LocalAddress}},
        @{N='本地端口';E={$_.LocalPort}},
        @{N='远程地址';E={$_.RemoteAddress}},
        @{N='远程端口';E={$_.RemotePort}},
        @{N='状态';E={$_.State}},
        @{N='进程';E={(Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).Name}} |
    Sort-Object RemoteAddress |
    Format-Table -AutoSize

13.2 监听端口审计

Write-Host "════════ 监听端口列表 ════════"
Get-NetTCPConnection -State Listen -ErrorAction SilentlyContinue |
    Select-Object @{N='本地地址';E={$_.LocalAddress}},
        @{N='监听端口';E={$_.LocalPort}},
        @{N='进程';E={
            $proc = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
            if ($proc) { "$($proc.Name) (PID: $($proc.Id))" } else { "未知" }
        }} |
    Sort-Object LocalPort |
    Format-Table -AutoSize

13.3 可疑外连检测(高频连接分析)

Write-Host "════════ 高频外连目标 ════════"
Get-NetTCPConnection -State Established -ErrorAction SilentlyContinue |
    Group-Object RemoteAddress |
    Where-Object { $_.Count -gt 5 } |
    Sort-Object Count -Descending |
    Select-Object -First 15 @{N='远程IP';E={$_.Name}},
        @{N='连接数';E={$_.Count}},
        @{N='进程';E={
            $proc = Get-Process -Id ($_.Group[0].OwningProcess) -ErrorAction SilentlyContinue
            if ($proc) { $proc.Name } else { "未知" }
        }} |
    Format-Table -AutoSize

Write-Host "`n  💡 连接数 >20 的 IP 需重点排查是否为恶意外连"

13.4 防火墙规则审计

Write-Host "════════ 防火墙入站规则 ════════"
Get-NetFirewallRule -Direction Inbound -Enabled True -ErrorAction SilentlyContinue |
    Where-Object { $_.Action -eq 'Allow' } |
    Select-Object @{N='规则名';E={$_.DisplayName}},
        @{N='操作';E={$_.Action}},
        @{N='本地端口';E={$_.LocalPort}},
        @{N='远程地址';E={$_.RemoteAddress}} |
    Format-Table -AutoSize

风险等级:🟢 无(只读检测)

报错含义解决
Get-NetTCPConnection 报错需要管理员权限提升执行
Get-NetFirewallRule 报错防火墙服务未启动检查 mpssvc 服务
OwningProcess 为 0系统进程,正常无需处理

常见坑 & 解决

场景说明
未知进程监听 80/443 端口可能是 Web 服务或恶意软件,需排查
大量外连到同一 IP可能是 C2 通信,立即断网排查
防火墙规则异常宽松建议收紧为最小权限原则

↑ 返回顶部


🆕 模块 14:Windows 事件日志诊断

📋 展开查看:🆕 模块 14:Windows 事件日志诊断

用途:快速定位系统错误、警告,按时间/级别筛选关键日志。

常你说"系统日志有没有最近错误" / "最近系统出了什么问题" / "看看日志"

⚠️ 本模块仅读取日志,不会修改或清除日志文件。

14.1 系统最近错误日志(最近 2 小时)

$since = (Get-Date).AddHours(-2)

Write-Host "════════ 最近 2 小时系统日志(错误/警告)════════"
Get-WinEvent -FilterHashtable @{
    LogName='System';Level=2,3;StartTime=$since
} -ErrorAction SilentlyContinue |
    Select-Object @{N='时间';E={$_.TimeCreated}},
        @{N='来源';E={$_.Message.Split("`r`n")[0] -replace '^.*?: '}},
        @{N='级别';E={if ($_.Level -eq 2) { '❌错误' } else { '⚠️警告' }}} |
    Select-Object -First 30 |
    Format-Table -AutoSize -Wrap

14.2 应用程序错误日志

$since = (Get-Date).AddHours(-24)

Write-Host "════════ 最近 24 小时应用程序错误 ════════"
Get-WinEvent -FilterHashtable @{
    LogName='Application'; Level=2; StartTime=$since
} -ErrorAction SilentlyContinue |
    Select-Object @{N='时间';E={$_.TimeCreated}},
        @{N='来源';E={$_.ProviderName}},
        @{N='错误摘要';E={
            ($_.Message -replace "`r`n",' ' | Select-Object -First 120)
        }} |
    Select-Object -First 20 |
    Format-Table -AutoSize -Wrap

14.3 关键系统事件扫描(蓝屏/重启/故障)

Write-Host "════════ 关键系统事件(最近 7 天)════════"
Get-WinEvent -FilterHashtable @{
    LogName='System';
    ID=1074, 6005, 6006, 6008, 6009, 41, 1001, 1002;
    StartTime=(Get-Date).AddDays(-7)
} -ErrorAction SilentlyContinue |
    Select-Object @{N='时间';E={$_.TimeCreated}},
        @{N='事件ID';E={$_.Id}},
        @{N='说明';E={
            switch ($_.Id) {
                1074 {'系统关机/重启 (User initiated)'}
                6005 {'系统启动'}
                6006 {'系统正常关机'}
                6008 {'非正常关机 (意外断电/崩溃)'}
                6009 {'系统启动 (新会话)'}
                41  {'Kernel-Power 重启 (无干净关机)'}
                1001{'BugCheck (蓝屏)'}
                1002{'应用程序挂起/无响应'}
                default {$_.Message.Split("`r`n")[0]}
            }
        }} |
    Format-Table -AutoSize -Wrap

14.4 Setup 日志审计(最近 7 天)

Write-Host "════════ Setup 最近 7 天事件 ════════"
Get-WinEvent -FilterHashtable @{
    LogName='Setup';
    StartTime=(Get-Date).AddDays(-7)
} -ErrorAction SilentlyContinue |
    Select-Object @{N='时间';E={$_.TimeCreated}},
        @{N='来源';E={$_.ProviderName}},
        @{N='摘要';E={
            ($_.Message -replace "`r`n",' ' | Select-Object -First 120)
        }} |
    Select-Object -First 15 |
    Format-Table -AutoSize -Wrap

风险等级:🟢 无(只读阅读)

报错含义解决
No events were found ...没有符合条件的日志正常,说明期间无异常
RPC server is unavailable事件日志服务未运行检查 EventLog 服务
Access denied权限不足管理员身份执行

常见坑 & 解决

场景说明
每天大量 Error 日志说明存在持续性故障,需逐条排查来源
非正常关机 (6008)可能存在硬件/电源问题
蓝屏 (1001)记录蓝屏代码,排查驱动/硬件

↑ 返回顶部


🆕 模块 15:已安装程序与补丁管理

📋 展开查看:🆕 模块 15:已安装程序与补丁管理

用途:查看所有已安装的软件、补丁,检测缺失或不一致情况。

常你说"看看系统安装了哪些软件" / "服务器装了什么程序" / "补丁检查"

⚠️ 本模块仅读,不会卸载/安装/修改任何软件。

15.1 已安装程序清单

Write-Host "════════ 已安装程序清单 ════════"
Get-ItemProperty "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*" -ErrorAction SilentlyContinue |
    Where-Object { $_.DisplayName -and $_.UninstallString -notlike '*{*' } |
    Select-Object @{N='程序名';E={$_.DisplayName}},
        @{N='版本';E={$_.DisplayVersion}},
        @{N='安装日期';E={$_.InstallDate}},
        @{N='大小';E={if($_.EstimatedSize){[math]::Round($_.EstimatedSize/1MB,1)}else{'?'}}} |
    Sort-Object DisplayName |
    Format-Table -AutoSize

15.2 已安装 Windows 补丁

Write-Host "════════ 已安装 Windows 补丁 ════════"
Get-HotFix | Sort-Object InstalledOn -Descending |
    Select-Object @{N='补丁ID';E={$_.HotFixID}},
        @{N='安装日期';E={$_.InstalledOn}},
        @{N='描述';E={$_.Description}} |
    Format-Table -AutoSize

15.3 安装时间线分析

Write-Host "════════ 最近安装的软件 ════════"
Get-ItemProperty "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*" -ErrorAction SilentlyContinue |
    Where-Object { $_.InstallDate } |
    Sort-Object InstallDate -Descending |
    Select-Object -First 20 @{N='程序名';E={$_.DisplayName}},
        @{N='版本';E={$_.DisplayVersion}},
        @{N='安装日期';E={$_.InstallDate}} |
    Format-Table -AutoSize

15.4 补丁对比(检测缺失)

$hotfixes = Get-HotFix -ErrorAction SilentlyContinue | Select-Object -ExpandProperty HotFixID
$currentBuild = [System.Environment]::OSVersion.Version
$expectedPatches = @()

# 检测 Windows 10/11 常见缺失补丁
if ($currentBuild.Major -ge 10) {
    $kbToCheck = @(
        "KB5034441",  # Secure Boot DBX
        "KB5036897",  # 最新 .NET
        "KB5037771"   # 最新累积
    )
    foreach ($kb in $kbToCheck) {
        if ($hotfixes -notcontains $kb) {
            $expectedPatches += "$kb - 缺失"
        }
    }
}

Write-Host "════════ 补丁一致性检查 ════════"
Write-Host "  当前版本: $($currentBuild.Major).$($currentBuild.Minor).$($currentBuild.Build)"
Write-Host ""
if ($expectedPatches.Count -gt 0) {
    Write-Host "  ⚠️ 缺失补丁:"
    foreach ($p in $expectedPatches) { Write-Host "    ❌ $p" }
} else {
    Write-Host "  ✅ 常用补丁均已安装"
}

风险等级:🟢 无(只读阅读)

报错含义解决
Requested registry access is not allowed部分注册表权限限制管理员身份执行
Get-HotFix 报错需要管理员权限管理员身份执行

常见坑 & 解决

场景说明
某台服务器明显比其他机器少很多补丁可能 WSUS/自动更新未运行
安装时间线上出现未知日期的软件可能未经授权安装,需排查
KB 补丁安装失败Windows Update 服务或缓存异常

↑ 返回顶部


🆕 模块 16:用户会话与登录状态监控

📋 展开查看:🆕 模块 16:用户会话与登录状态监控

用途:监控当前登录的用户、远程会话、僵尸会话、账户状态。

常你说"谁在服务器上" / "有没有异常登录" / "查看远程会话"

⚠️ 本模块仅读,不会结束会话、锁定账户或修改密码策略。

16.1 当前登录用户概览

Write-Host "════════ 当前登录用户 ════════"
Get-CimInstance Win32_LogonSession | Where-Object { $_.LogonType -ne 0 } |
    Select-Object @{N='用户名';E={
        $user = Get-CimInstance Win32_ComputerSystem | Select-Object UserName
        $user.UserName ?? "未知"
    }},
    @{N='会话ID';E={$_.LogonId}},
    @{N='登录类型';E={
        switch ($_.LogonType) {
            2 {'交互 (本地登录)'}
            3 {'网络登录'}
            4 {'批处理'}
            5 {'服务'}
            7 {'解锁'}
            8 {'网络明文'}
            9 {'新凭据'}
            10 {'远程交互 (RDP)'}
            11 {'缓存交互'}
            default {"其他 ($($_.LogonType))"}
        }
    }},
    @{N='登录时间';E={$_.StartTime}} |
    Format-Table -AutoSize

16.2 远程桌面会话监控

Write-Host "════════ 远程桌面会话 (RDP) ════════"
Get-CimInstance Win32_LogonSession | Where-Object { $_.LogonType -eq 10 } |
    Select-Object @{N='用户名';E={
        $user = Get-CimInstance Win32_ComputerSystem | Select-Object UserName
        $user.UserName ?? "未知"
    }},
    @{N='会话ID';E={$_.LogonId}},
    @{N='登录时间';E={$_.StartTime}},
    @{N='空闲时间(分钟)';E={
        if ($_.StartTime) {
            [math]::Round(((Get-Date) - $_.StartTime).TotalMinutes, 0)
        } else { 0 }
    }} |
    Format-Table -AutoSize
Write-Host "`n💡 空闲 >60 分钟的会话可能为僵尸会话"

16.3 异常登录检测(多 IP / 异地登录)

Write-Host "════════ 最近 7 天的登录来源 ════════"
Get-WinEvent -FilterHashtable @{
    LogName='Security';
    ID=4624;
    StartTime=(Get-Date).AddDays(-7)
} -ErrorAction SilentlyContinue |
    Where-Object { $_.Properties[18].Value -ne '-' } |
    Select-Object @{N='登录时间';E={$_.TimeCreated}},
        @{N='用户名';E={$_.Properties[5].Value}},
        @{N='来源IP';E={$_.Properties[18].Value}},
        @{N='登录类型';E={
            switch ($_.Properties[8].Value) {
                2 {'交互(本地)'}
                3 {'网络'}
                10 {'远程(RDP)'}
                default {"其他"}
            }
        }} |
    Group-Object SourceIP |
    Sort-Object Count -Descending |
    Select-Object -First 10 @{N='来源IP';E={$_.Name}},
        @{N='登录次数';E={$_.Count}},
        @{N='最近登录';E={$_.Group[0].TimeCreated}} |
    Format-Table -AutoSize

Write-Host "`n💡 任何未知来源IP 的登录都值得警惕"

16.4 系统账户状态检查

Write-Host "════════ 本地用户账户状态 ════════"
Get-LocalUser | Where-Object { $_.Enabled -eq $true } |
    Select-Object @{N='账户名';E={$_.Name}},
        @{N='状态';E={if ($_.Enabled) {'启用'}else{'禁用'}}},
        @{N='最后登录';E={$_.LastLogon}},
        @{N='密码过期';E={
            if ($_.PasswordExpires) { $_.PasswordExpires } else { '永不过期 ⚠️' }
        }},
        @{N='需要密码';E={if ($_.PasswordRequired) {'是'}else{'否 ⚠️'}}} |
    Format-Table -AutoSize

Write-Host "`n⚠️ 标记的账户存在安全风险:无密码或密码永不过期"

风险等级:🟢 无(只读监控)

报错含义解决
Get-LocalUser 报错需要管理员权限管理员身份执行
Get-CimInstance 报错WMI 未启动检查 Winmgmt
No events found没有相关日志正常

常见坑 & 解决

场景说明
多个 RDP 会话来自同一 IP可能正常(NAT),也可能为多人共用账户
Guest 账户启用不必要的安全风险,建议禁用
僵尸 RDP 会话占用资源,闲置超时后应自动断开
密码永不过期合规风险,建议设置密码策略

↑ 返回顶部


🆕 模块 17:计划任务审计

📋 展开查看:🆕 模块 17:计划任务审计

用途:审计所有计划任务,检测可疑的持久化行为(恶意软件常用的自启动方式)。

常你说"有没有可疑计划任务" / "检查计划任务" / "有没有凌晨执行的任务"

⚠️ 本模块仅读,不会创建/删除/修改任何计划任务。

17.1 所有计划任务清单

Write-Host "════════ 所有计划任务 ════════"
$tasks = Get-ScheduledTask | Where-Object { $_.State -ne 'Disabled' }
$total = ($tasks | Measure-Object).Count
Write-Host "  总数: $total 个启用的任务`n"

$tasks | Select-Object @{N='任务名';E={$_.TaskName}},
    @{N='路径';E={$_.TaskPath}},
    @{N='状态';E={$_.State}},
    @{N='触发器';E={
        $info = Get-ScheduledTaskInfo -TaskName $_.TaskName -TaskPath $_.TaskPath -ErrorAction SilentlyContinue
        if ($info.LastRunTime) { "上次: $($info.LastRunTime)" } else { "从未执行" }
    }} |
    Sort-Object TaskPath, TaskName |
    Format-Table -AutoSize

17.2 异常计划任务检测(凌晨执行 / 隐藏窗口 / 临时目录)

Write-Host "════════ 异常计划任务检测 ════════"
$suspicious = @()
$tasks = Get-ScheduledTask | Where-Object { $_.State -ne 'Disabled' }

foreach ($task in $tasks) {
    $score = 0
    $reasons = @()
    $taskInfo = Get-ScheduledTaskInfo -TaskName $task.TaskName -TaskPath $task.TaskPath -ErrorAction SilentlyContinue
    $lastRun = if ($taskInfo.LastRunTime) { $taskInfo.LastRunTime } else { $null }

    # 检测1: 凌晨执行 (0:00-5:00)
    # 通过检查 Actions 中的命令行参数
    $actions = $task.Actions
    foreach ($action in $actions) {
        $argStr = "$($action.Arguments)" + "$($action.Execute)"
        if ($argStr -match '(-WindowStyle\s+Hidden|/hidden|-w\s+hidden|-hide|/background|/min|-NoLogo\s+-NonInteractive\s+-WindowStyle\s+Hidden)') {
            $score += 2
            $reasons += "隐藏窗口执行"
        }
        if ($argStr -match '(\\Temp\\|\\TMP\\|\\AppData\\Local\\Temp\\)') {
            $score += 3
            $reasons += "从临时目录执行"
        }
        if ($argStr -match '((?:powershell|cmd|wscript|cscript|rundll32|mshta|regsvr32).*?(?:-enc|-e\s|IEX|Invoke-Expression|DownloadString|FromBase64String|eval))') {
            $score += 4
            $reasons += "可疑命令特征(编码/下载)"
        }
    }

    # 检测2: 无描述信息的任务
    if (-not $task.Description -or $task.Description -eq '') {
        $score += 1
        $reasons += "无描述信息"
    }

    if ($score -ge 3) {
        $suspicious += [PSCustomObject]@{
            任务名 = $task.TaskName
            路径 = $task.TaskPath
            风险分 = $score
            原因 = ($reasons -join ', ')
            上次运行 = $lastRun
        }
    }
}

if ($suspicious.Count -gt 0) {
    $suspicious | Sort-Object 风险分 -Descending |
        Format-Table -AutoSize -Wrap
    Write-Host "`n🔴 以上任务存在可疑特征,建议逐条排查"
} else {
    Write-Host "✅ 未发现明显可疑的计划任务"
}

17.3 按触发条件分类(开机自启 / 定时 / 用户登录触发)

Write-Host "════════ 计划任务按触发类型分类 ════════`n"

# 开机自启
Write-Host "═══ 开机/系统启动时触发 ═══"
Get-ScheduledTask | Where-Object {
    $_.Triggers | Where-Object { $_.CimClass.CimClassName -match 'BootTrigger|StartupTrigger' }
} | Select-Object -First 15 @{N='任务名';E={$_.TaskName}},
    @{N='路径';E={$_.TaskPath}},
    @{N='触发器';E={
        ($_.Triggers | ForEach-Object { $_.CimClass.CimClassName }) -join ', '
    }} |
    Format-Table -AutoSize

Write-Host "`n═══ 用户登录时触发 ═══"
Get-ScheduledTask | Where-Object {
    $_.Triggers | Where-Object { $_.CimClass.CimClassName -match 'LogonTrigger' }
} | Select-Object -First 15 @{N='任务名';E={$_.TaskName}},
    @{N='路径';E={$_.TaskPath}},
    @{N='触发器';E={
        ($_.Triggers | ForEach-Object { $_.CimClass.CimClassName }) -join ', '
    }} |
    Format-Table -AutoSize

Write-Host "`n═══ 定时/周期性触发 (数量最多) ═══"
$timeTasks = Get-ScheduledTask | Where-Object {
    $_.Triggers | Where-Object { $_.CimClass.CimClassName -match 'TimeTrigger|DailyTrigger|WeeklyTrigger|MonthlyTrigger' }
}
Write-Host "  总数: $(($timeTasks | Measure-Object).Count) 个"

17.4 非 Microsoft 创建的任务

Write-Host "════════ 非 Microsoft 创建的计划任务 ════════"
$nonMsTasks = Get-ScheduledTask | Where-Object {
    $_.TaskPath -notmatch '\\\\Microsoft\\\\' -and $_.State -ne 'Disabled'
}

if ($nonMsTasks) {
    $nonMsTasks | Select-Object @{N='任务名';E={$_.TaskName}},
        @{N='路径';E={$_.TaskPath}},
        @{N='状态';E={$_.State}},
        @{N='描述';E={
            if ($_.Description) { $_.Description.Substring(0, [Math]::Min(60, $_.Description.Length)) }
            else { '(无描述)' }
        }} |
        Format-Table -AutoSize
    Write-Host "`n💡 第三方任务值得审查,尤其是无描述且来源不明的"
} else {
    Write-Host "✅ 无非 Microsoft 计划任务"
}

风险等级:🟢 无(只读审计)

报错含义解决
`Access denied

相关技能

IT运维工具箱技能。覆盖网络诊断、系统监控、服务检查、监控问题排查、实用工具等核心运维场景。 适合运维工程师、开发人员日常使用。在 WorkBuddy 中通过自然语言触发,由 AI 选择合适的脚本执行并解读结果。 触发场景(包括但不限于): - 网络/连通性:ping检测、DNS解析、**域名查IP**、HTTP...

4 次安装

Skill Security — 安全审计扫描器,帮助你快速发现 Skill 中的安全风险。轻量 SAST 污点追踪(Python AST + JS 词法近似,source→sink 证据链降误报)、规则引擎(YAML 规则包热插拔扩展)、社区规则(schema 校验 + 来源记录 + 签名验证)、提示注入 ML 语义检测(ONNX + 正则降级)、系统级行为捕获(eBPF Linux / ETW Windows)、动态沙箱执行扫描、供应链风险分析、CVE 离线缓存、恶意 Skill 指纹库、健康度与合规检查(质量+结构+权限合并)、全局排除配置、CI/CD 集成、JSON/HTML/SARIF 报告生成。

1 次安装

Windows 文件管家与系统健康诊断(mac-health 的 Windows 原生版,供 WorkBuddy 等 Windows 端工具调用)。Always use when the user says「电脑管家」「文件整理」「C盘满了」「Windows清理」「磁盘整理」「电脑诊断」「清理一下」「哪些可以删」「系统整理」「电脑卡」「运行慢」「内存不足」「Windows 卡」「开机慢」。涉及删除或迁移时先诊断和校验,执行时保留清单与回滚线索。

OpenClaw 技能自动化审计器 Pro(安全/性能/质量三维度 38 条规则)。基于 spclaudehome v1.0.0 fork 深度升级,新增 JSON 报告、CI 退出码、豁免机制、severity-cap 引擎适配。安装第三方技能前必跑。触发词:vet skill, audit skill, 安全审计, 扫描 skill, skill 检查.

2 次安装

使用场景: 用户要审计第三方 Agent Skill、检查 SKILL.md、安装前安全扫描,或评估提示注入、敏感数据、危险命令与供应链风险;需要 SKILLGUARD_API_KEY。

2 次安装

分析管理体系文件的逻辑完整性与合规性,识别差异点和风险,提供结构化改进建议;适用于内审、供应商评估、认证准备及流程改善场景

1 次安装