IT运维工具箱技能。覆盖网络诊断、系统监控、服务检查、监控问题排查、实用工具等核心运维场景。 适合运维工程师、开发人员日常使用。在 WorkBuddy 中通过自然语言触发,由 AI 选择合适的脚本执行并解读结果。 触发场景(包括但不限于): - 网络/连通性:ping检测、DNS解析、**域名查IP**、HTTP...
Coding
winskill
Try itWindows 服务器运维工具箱 - 磁盘分析、临时文件清理、IIS 站点管理、批量文件操作、服务状态监控、Windows Update 诊断、实时性能监控、安全审计、注册表启动项审计、磁盘健康检测、网络端口监控、事件日志诊断、已安装程序管理、用户会话监控、计划任务审计、文件共享审计、DNS网卡诊断、SSL证书过期检测、防火墙规则审计、服务崩溃恢复状态、系统文件修复、存储池管理、备份状态检查、Docker容器管理、K8s集群监控、自动化修复向导、性能基线与趋势分析、等保合规检查清单、远程多服务器管理、日志轮转、模块索引。只读分析+安全确认,绝不误删文件,完全免费离线运行。
What it does
Windows 服务器运维工具箱 - 磁盘分析、临时文件清理、IIS 站点管理、批量文件操作、服务状态监控、Windows Update 诊断、实时性能监控、安全审计、注册表启动项审计、磁盘健康检测、网络端口监控、事件日志诊断、已安装程序管理、用户会话监控、计划任务审计、文件共享审计、DNS网卡诊断、SSL证书过期检测、防火墙规则审计、服务崩溃恢复状态、系统文件修复、存储池管理、备份状态检查、Docker容器管理、K8s集群监控、自动化修复向导、性能基线与趋势分析、等保合规检查清单、远程多服务器管理、日志轮转、模块索引。只读分析+安全确认,绝不误删文件,完全免费离线运行。
The skill document
Winskill — Windows 服务器运维工具箱
快速开始
直接对 AI 说就行,不用记命令。
| 你想做什么 | 直接对 AI 说 |
|---|---|
| 看磁盘空间 | "帮我扫一下 D 盘大文件" |
| 清理临时文件 | "看看我电脑的临时文件" |
| 检查 IIS | "我的 IIS 站点还活着吗?" |
| 检测重复文件 | "帮我找下重复文件" |
| 检查服务状态 | "看下数据库和 IIS 服务有没有挂" |
| Windows Update 状态 | "Windows Update 正常吗?有积压补丁吗?" |
| 服务器卡顿定位 | "服务器变卡了,帮我看看是什么原因" |
| 检查有没有被入侵 | "帮我查一下有没有异常登录" |
| 检查可疑启动项 | "有没有可疑的自启动程序" |
| 磁盘健康状态 | "硬盘还健康吗?有没有坏道" |
| 网络连接监控 | "谁在连我的服务器" |
| 系统日志哪里错了 | "系统日志有没有最近的错误" |
| 服务器装了什么程序 | "看看系统安装了哪些软件" |
| 谁在服务器上 | "当前有谁登录了服务器" |
| 检查计划任务 | "有没有可疑的计划任务" |
| 文件共享审计 | "有哪些共享文件夹,权限安全吗" |
| DNS / 网卡诊断 | "DNS 解析正常吗" |
| 搞不定了 | "我遇到报错了,帮我看看" |
⚠️ AI 必须遵守:凡涉及删除、停止服务、修改系统的操作,必须先展示操作清单,等用户明确说"确认执行"后才可执行。
安全声明
| 保护项 | 方式 |
|---|---|
| 系统目录保护 | 绝不操作 C:\Windows、C:\Program Files 等 |
| 删除必须确认 | 先展示受影响文件,等用户说"确认清理"后才执行 |
| 回收站优先 | 删除用 Shell.Application 回收站 API |
| 只读诊断 | 所有分析命令不修改任何文件/服务/注册表 |
| 排除保护 | pagefile.sys、hiberfil.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 exist | temp 目录下某些路径不存在 | 自动跳过 |
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 recognized | IIS 模块未加载 | Install-WindowsFeature Web-Mgmt-Tools |
Cannot connect to IIS | W3SVC 服务未启动 | 管理服务 |
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 应用池是否需回收 |
| 磁盘队列长度 >2 | I/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 |
Related skills
Skill Security — 安全审计扫描器,帮助你快速发现 Skill 中的安全风险。轻量 SAST 污点追踪(Python AST + JS 词法近似,source→sink 证据链降误报)、规则引擎(YAML 规则包热插拔扩展)、社区规则(schema 校验 + 来源记录 + 签名验证)、提示注入 ML 语义检测(ONNX + 正则降级)、系统级行为捕获(eBPF Linux / ETW Windows)、动态沙箱执行扫描、供应链风险分析、CVE 离线缓存、恶意 Skill 指纹库、健康度与合规检查(质量+结构+权限合并)、全局排除配置、CI/CD 集成、JSON/HTML/SARIF 报告生成。
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 检查.
使用场景: 用户要审计第三方 Agent Skill、检查 SKILL.md、安装前安全扫描,或评估提示注入、敏感数据、危险命令与供应链风险;需要 SKILLGUARD_API_KEY。
分析管理体系文件的逻辑完整性与合规性,识别差异点和风险,提供结构化改进建议;适用于内审、供应商评估、认证准备及流程改善场景