26zl/personal-windows-setup

GitHub: 26zl/personal-windows-setup

一套适用于 Windows 10/11 的 PowerShell 工具集,提供只读系统健康诊断、选择性安全加固和 winget 自动化软件安装三个独立模块。

Stars: 1 | Forks: 0

# 个人 Windows 设置 [![lint](https://static.pigsec.cn/wp-content/uploads/repos/cas/73/73ccbf4580efb36d6c888b7f4803d5e82c229071ca2fd1a481dac1a7a20547dc.svg)](https://github.com/26zl/personal-windows-setup/actions/workflows/lint.yml) ![Platform](https://img.shields.io/badge/platform-Windows%2011%20Pro-0078D6?logo=windows&logoColor=white) ![PowerShell](https://img.shields.io/badge/PowerShell-5.1%20%7C%207%2B-5391FE?logo=powershell&logoColor=white) [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) 适用于 Windows 10/11 的三款独立 PowerShell 工具——一项**健康检查**、一项**加固处理**以及一个**引导安装程序**。每项工具均可独立运行;你不需要依赖其他工具。 | 工具 | 功能 | |---|---| | [**健康检查**](#health-check) | 只读诊断程序,可审计安全性、隐私、性能、驱动程序、存储、电源与电池、网络、更新、事件日志记录及已安装的软件。适用于任何 Windows 10/11 机器(笔记本电脑或台式机),且不会做出任何更改。 | | [**加固处理**](#hardening-pass) | 针对常规加固工具遗漏的设置进行选择性安全收紧。先报告状态,然后在每次更改前询问确认。 | | [**引导安装程序**](#bootstrap-installer) | 我个人的基于 winget 的安装设置,用于恢复出厂设置后的全新 Windows 11 Pro 机器。本质上属于个人定制——运行前请先阅读应用列表。 | 这里的所有内容都不自称详尽无遗;这只是我在自己的机器上使用的起点。 ## 健康检查 [`healthcheck/health-check.ps1`](healthcheck/health-check.ps1) 是一个独立的诊断程序——它与下文的安装程序无关,并且可以在**任何** Windows 10/11 机器(笔记本电脑或台式机、物理机或虚拟机)上运行。无论何时感觉机器不对劲,或者按照计划运行它以排查悄然出现的问题,都非常合适。 ``` irm https://github.com/26zl/personal-windows-setup/raw/main/healthcheck/health-check.ps1 | iex ``` **它不会做出任何更改。** 每次检查都只是 `Get-`/`Test-`/查询调用——没有 `Set-`,没有 `Remove-`,也不写入服务或注册表——并且它调用的少数外部工具均仅以分析模式运行(`defrag /A`、`dism /AnalyzeComponentStore`、`fsutil behavior query`、`powercfg /query`、`auditpol /get`)。检查发现会附带观察到的值作为证据,以及供你自行修复的命令,从而让你完全掌控机器实际发生的变化。 以普通用户身份运行它也能正常工作,并且会提示你因权限不足而跳过了哪些检查;提升权限即可获得完整覆盖。它还会根据检测到的硬件进行适配:电池损耗、循环计数和充电时间检查仅在存在电池时运行,碎片整理仅在机械硬盘上运行,热区仅在存在 ACPI 类时运行。任何无法检查的内容都会被报告为**已跳过**,绝对不会报告为健康——未运行的检查绝不等于通过。 包含十二个类别。在编写该脚本的机器上,完整的提权运行大约耗时一分钟,而使用 `-Fast` 仅需 13 秒: | 类别 | 涵盖范围 | |---|---| | `System` | 版本和支持期限、激活状态、待处理的重启、运行时间、时间同步、页面文件、用户配置文件完整性 | | `Stability` | 蓝屏和错误检查代码、意外关机、WHEA 硬件故障、应用程序和服务崩溃、转储配置 | | `Drivers` | 处于错误状态的设备、重复的驱动程序包、未签名的内核驱动程序、从用户可写路径加载的驱动程序、Microsoft 的易受攻击驱动程序阻止列表 | | `Storage` | 可用空间、SMART 损耗和温度、TRIM、还原点和卷影副本配额、组件存储、庞大的临时文件夹 | | `Performance` | 启动项(包括指向已不存在文件的启动项)、来自 Windows 自身诊断日志的启动时间遥测、内存压力、处理器电源状态、计划任务 | | `Power` | 电源计划、快速启动、休眠、唤醒定时器和唤醒武装设备;在笔记本电脑上还包括:对照设计容量的电池损耗、循环计数、运行时间、电池模式限制 | | `Network` | 链路速度与适配器能力的对比、防火墙配置文件和入站允许规则、按拥有进程监听的端口、SMB1/签名/来宾登录、NetBIOS 和 LLMNR、hosts 文件、代理、DNS | | `Security` | 深入的 Defender 检查(包括排除项和 ASR 覆盖范围)、VBS/HVCI、安全启动、TPM、BitLocker、LSA 保护、UAC、账户和密码策略、RDP 和远程服务、根证书 | | `Privacy` | 遥测级别(以及大多数指南都会弄错的 Pro/Enterprise 细微差别)、广告 ID、活动历史记录、各类别的应用权限、搜索、错误报告、传递优化、账户类型 | | `Updates` | 补丁期限、待处理和**反复失败**的更新、更新服务、悄悄阻止更新的策略、可用的 winget 升级 | | `Logging` | 每个事件日志实际覆盖的*天数*(而不仅仅是大小)、审核策略缺口、Windows 和 PowerShell 7 策略键下的 PowerShell 日志记录、Sysmon 健康状况和丢弃的事件 | | `Software` | 真正的重复项(排除 VC++ 可再发行组件——那里有多个版本是正常的)、孤立的卸载条目、已知有风险或已停止支持的软件、相互竞争的防病毒产品、浏览器扩展数量 | ``` # 仅一两个领域 & ([scriptblock]::Create((irm https://github.com/26zl/personal-windows-setup/raw/main/healthcheck/health-check.ps1))) -Category Security,Privacy # 从 clone 开始:编写 Markdown 报告,隐藏 per-check OK 行,跳过缓慢的 checks .\healthcheck\health-check.ps1 -ReportPath .\health.md -FindingsOnly -Fast ``` 严重程度设定是刻意保守的——`Critical` 意味着即将发生数据丢失或正在受到主动入侵,而健康的机器不应产生任何此类问题。脚本无法完全证实的发现会被标记为 `likely` 或 `uncertain`,而不是作为事实陈述。 证据行使发现具备可操作性,同时也使报告具有可识别性:计算机名和用户名、配置文件路径、本地地址和 Wi-Fi 网络名称、拥有进程的监听端口、本地 Administrators 组的成员、已安装的软件。`-ReportPath` 会将其写入磁盘,并在文件顶部附带警告——在将其粘贴到论坛帖子或支持工单之前,请仔细阅读。 ### 它不做什么 它检查的是**配置和历史记录**,而不是行为。它无法告诉你当前是否有恶意程序正在运行:它不进行进程基线建立、哈希信誉查找、内存检查和流量分析。一台机器可能通过了此处的所有检查,但仍然被入侵——一份干净的报告意味着“没有任何配置错误,也没有记录到任何不良事件”,而不是“这台机器是干净的”。 它刻意将四件事留给了专门为它们构建的工具: | 未涵盖内容 | 替代使用 | 可委派给 | |---|---|---| | 对照已发布的基线进行合规性检查 | [HardeningKitty](https://github.com/scipag/HardeningKitty) | — | | 提权路径 —— 脆弱的服务 ACL、未加引号的服务路径、可写的 `%PATH%`、DLL 劫持候选 | [PrivescCheck](https://github.com/itm4n/PrivescCheck) | `-PrivescCheckPath` | | 凭据暴露 —— 保存的 RDP 密码、浏览器凭据存储、`unattend.xml` 或 shell 历史记录中的机密 | [winPEAS](https://github.com/peass-ng/PEASS-ng) | — | | 在日志内容*内部*进行威胁追踪 —— 4688 中的可疑命令行、4104 中混淆的 PowerShell | [DeepBlueCLI](https://github.com/sans-blue-team/DeepBlueCLI) | `-DeepBlueCliPath` | 此工具会验证这些工具所依赖的日志记录是否存在,并且是否追溯到足够早的时间。它不会读取内容来寻找攻击。 ### 委派给这些工具 如果你已经拥有它们,其中的两个可以整合进来: ``` .\health-check.ps1 -DeepBlueCliPath C:\tools\DeepBlueCLI\DeepBlue.ps1 ` -PrivescCheckPath C:\tools\PrivescCheck\PrivescCheck.ps1 ``` 它们的发现会分别出现在报告的 `Logging` 和 `Security` 下,并归功于它们。在使用前请阅读以下内容: - **不会下载任何内容,也不捆绑任何工具。** 由你自己获取和审查;你传递的路径是它们运行的唯一方式。这不仅是出于供应链安全的考量——DeepBlueCLI 是 GPL-3.0 协议,而本项目是 MIT 协议,因此在这里包含其代码会迫使整个仓库变为 GPL。作为独立程序运行是 GPL 允许的方式,这也将那些检测的功劳留给了应得的地方。 - **在这里,“不做出任何更改”不再是一个关于你可以在单个文件中阅读的代码的承诺。** 这两个工具在设计上都是只读的,但选择信任它们的是你自己。 - **PrivescCheck 会写入 CSV 报告。** 它会保存到一个具有唯一名称的临时文件中,并在运行结束时删除。这是整个 `health-check.ps1` 中唯一的磁盘写入操作,并且契约测试将其——连同进程启动——限制在委派代码中,因此它们不可能在其他任何地方出现,否则会导致 CI 失败。 - **PrivescCheck 在未提权时给出的结果更多。** 以管理员身份运行时,它会刻意跳过许多检查,以避免报告只有管理员才能利用的问题。以普通用户身份运行健康检查以获取其完整输出。 ## 加固处理 [`hardening/harden-extras.ps1`](hardening/harden-extras.ps1) 收紧了 [Harden System Security](https://github.com/HotCakeX/Harden-Windows-Security) 和 ConfigureDefender 遗漏的少数设置。它可在任何机器上独立运行: ``` irm https://github.com/26zl/personal-windows-setup/raw/main/hardening/harden-extras.ps1 | iex ``` 它会先报告当前状态,在**每次**更改前询问,并跳过已应用的内容。它提供以下功能:将五项 ASR 规则移动至 Block(被利用的易受攻击签名驱动程序、复制的系统工具、来自 USB 的未签名进程、LSASS 凭据窃取、安全模式重启)、在每个接口上关闭 TCP/IP 上的 NetBIOS、通过策略禁用 AutoPlay/AutoRun、将 NTLM 限制为仅 v2、关闭隐藏的管理共享(`C$`、`ADMIN$`),以及审核任何 Defender 排除项。 在接受之前,有两项值得深思:仅限 NTLMv2 会中断与那些老旧到只支持 NTLMv1 的设备的身份验证,而关闭管理共享会中断那些通过 `\\host\C$` 访问的备份或远程管理工具。脚本头文件记录了如何撤销每一次更改。在运行 Harden System Security 之后重新运行它,因为后者会通过策略管理一些 ASR 规则并且可能会将其恢复——当规则存在于策略键中时,脚本会写入该策略键,因为在这种情况下 `Add-MpPreference` 会被静默覆盖。 ## 引导安装程序 打开一个**提权**的 PowerShell(右键单击 → *以管理员身份运行*)并粘贴: ``` irm https://github.com/26zl/personal-windows-setup/raw/main/setup.ps1 | iex ``` 重复运行也没问题:已安装的应用会被跳过。然后它会询问 是否运行 `winget upgrade --all`,这会更新机器上的每一个 winget 应用,而不仅仅是这里的列表。失败项会在最后列出。每次运行都会将两个文件写入 `%LOCALAPPDATA%\windows-setup\logs`(放在 `%TEMP%` 之外,以免被清理工具清除):一份完整的控制台记录(`transcript-*.log`)和一份带有时间戳的事件日志(`events-*.log`),准确显示安装、跳过或失败的内容以及发生时间。 ## 要求 - **Windows 11 Pro, x64**(Sandbox 和 Hyper-V 需要 Pro 版本,无法在家庭版上启用;ARM64 未经测试)。 - **winget**(作为 *App Installer* 提供;如果缺失,请从 Microsoft Store 安装)。 - 一个**提权**的 PowerShell 会话,并为 Hyper-V 和 WSL2 启用了固件虚拟化。 ## 安装内容 - **语言:** Python、Node.js LTS、Go、Rust、Java (Temurin 21)、.NET SDK、Ruby - **构建工具:** VS Build Tools + MSVC C++ 工具集(编译器、链接器、CRT、Windows SDK —— 用于 Rust MSVC 和原生模块)、LLVM/Clang、MSYS2 (gcc/make) - **包管理器:** pnpm、Bun、Chocolatey、Scoop、pipx、uv、UniGetUI(GUI 前端)(npm/corepack 随 Node 一起提供;pipx 通过 pip 安装) - **开发工具:** Git、GitHub CLI、GitHub Desktop、VS Code、Neovim(+ 我的 [nvim 配置](https://github.com/26zl/nvim))、Windows Terminal、PowerShell 7、7-Zip、VC++ Redistributables、just、jq、ripgrep、fd、adb (platform-tools) - **全栈:** Docker Desktop、VirtualBox、DBeaver、Bruno - **AI:** Ollama(本地 LLM runtime)、CUDA Toolkit(GPU 计算 —— 体积达数 GB,仅在拥有 NVIDIA GPU 时有用) - **系统管理 / 网络:** PowerToys、Sysinternals Suite、WinSCP、PuTTYMobaXterm、Tailscale、WireGuard、Mullvad VPN - **网络安全:** Wireshark、Nmap、Burp Suite Community、KeePassXC、ConfigureDefender(Defender 设置 GUI —— 仅在签名验证后安装,绝不自动配置) - **Sysmon:** 将系统活动记录到事件日志中 —— 在 Windows 11 24H2+ 上使用内置 Sysmon(如有需要会启用可选功能),在较旧的 Windows 上使用经过签名检查的 Sysinternals 下载版本,并配置有固定的 [SwiftOnSecurity 配置](sysmon/sysmonconfig-export.xml)和 1 GB 的日志(在普通台式机上测量约为每天 150 MB,大约可保留一周的历史记录) - **加固处理(可选,y/n):** 在运行接近尾声时提供 —— 请参阅上方的[加固处理](#hardening-pass)了解其具体更改内容 - **浏览器:** Google Chrome、Tor Browser - **清理 / 维护:** Malwarebytes、AdwCleaner、BleachBit、DriverStore Explorer - **实用程序:** Rufus、balenaEtcher、Steam、Windows Notepad (Store) - **调整 / 隐私:** O&O ShutUp10、Win11Debloat、Winhance、Harden System Security (Store) - **Claude Code** 通过其官方原生安装程序 - **PowerShellPerfect**(我个人的配置文件) - 启用 Windows Sandbox、Hyper-V 和 WSL2,并将 Debian 设为默认发行版 - 在运行开始和结束时创建**系统还原点**(如果关闭了系统保护,会先将其打开)。还原点涵盖系统文件、注册表和已安装的程序——它们**不会**还原你个人的文档,也无法恢复下方磁盘清理所移除的任何内容。 - **系统完整性:** DISM 组件存储检查(仅在发现损坏时使用 `/RestoreHealth` 自动修复),随后执行 `sfc /scannow` - **磁盘清理(可选,y/n):** DISM 组件清理、Windows Update 下载缓存、两个临时文件夹以及回收站。这些操作均不可逆,因此它会先询问并且默认跳过。 - **双启动检查(可选,y/n):** 报告启动条目、快速启动、休眠、硬件时钟(UTC 与本地时间)、安全启动和 BitLocker,然后提供完全禁用休眠的功能(`powercfg /h off`,这也会清除快速启动)并将时钟设置为 UTC ## 自定义 打开 `setup.ps1` 并编辑 `$winget` 列表。使用以下命令查找任何 ID: ``` winget search ``` VS Build Tools、VirtualBox 和 CUDA Toolkit 体积庞大;如果不需要,请移除这些行。特别是 CUDA 体积达数 GB,如果没有 NVIDIA GPU 则毫无用处。 ## 注意事项 - **完成后重启**以完成 Sandbox、Hyper-V 和 WSL2 的配置(使用 `wsl -l -v` 进行验证)。 - **所有额外步骤均为可选:** 调整工具(Win11Debloat、Winhance、PowerShellPerfect)、GitHub 登录、WSL 中的 Neovim 步骤、加固处理及其内部的每项更改,以及每项双启动更改。各调整工具均在各自的进程中运行。 - **大多数安装程序都是在运行时获取的** —— 在选择加入之前,请查看它们的 URL 和内容。 - **Kubernetes** 运行在 Docker Desktop 内部(在“设置”中启用它);不安装单独的集群工具。 - **此处未安装:** 云/运维工具以及 Java 构建工具(Maven、Gradle)——请使用 Debian WSL,或使用 Chocolatey/Scoop 获取 Java 工具。 - **更多网络安全工具:** [cybersec-toolkit](https://github.com/26zl/cybersec-toolkit)(580+ Linux/Termux 工具,从 Debian WSL 运行)。
安全性与供应链 - **`OfficeSetup.exe`** 是 Microsoft 签名的存根;脚本在运行前会验证其固定的 SHA-256 和 Authenticode 签名。如果你替换了它,请刷新 `$officeSha256`(`Get-FileHash office\OfficeSetup.exe`)。 - **ConfigureDefender** 从 AndyFul 的仓库下载,经过验证(固定的 SHA-256 + 签名),并创建了桌面快捷方式——但绝不会自动启动。自行打开并选择一个级别(Default / High / Max);新版本请刷新 `$cdSha256`。 - **重复运行是累加的:** 安装使用 `winget install --no-upgrade`,因此第二次运行只会添加缺失的内容,绝不会更改已安装内容的版本。升级是在运行结束时进行的一个单独且明确的步骤。 - **单独使用 Sysmon**(现有机器,未进行完整运行):从提权的 shell 中运行 `irm https://github.com/26zl/personal-windows-setup/raw/main/sysmon/install-sysmon.ps1 | iex`。重新运行只会重新应用配置;如果替换了 XML,请刷新 `install-sysmon.ps1` 中的 `$configSha256`。 - **Sysmon 配置是一个 fork,而不是副本。** 基础是 [SwiftOnSecurity sysmon-config](https://github.com/SwiftOnSecurity/sysmon-config) v74(2021,CC BY 4.0,自那时起停止维护)。完整的 diff(这样就不必自己去寻找了):`schemaversion` 从 4.50 提升到 4.81;在文件末尾的标记块中添加了六个规则组;23 个包含规则路径从绝对的 `C:\` 重写为驱动器相对路径。其他一切都保持上游原样。 - **它收集了上游未收集的内容:** **25 条 `ProcessTampering`**(进程镂空没有合理的解释,并且该事件很少见)、**26 条 `FileDeleteDetected`** 限定于可执行文件、脚本、`.evtx` 和卷影副本、**7 条 `ImageLoad`** 缩小到从用户可写目录加载的 DLL,以及对 `SilentProcessExit` 的 `RegistryEvent` 监视。它去掉了 **23 条 `FileDelete`** —— 因为那会将每个删除的文件归档到磁盘并悄无声息地填满驱动器——以及去掉了 **24 条 `ClipboardChange`**,因为它会捕获剪贴板*内容*,这会导致密码和一次性验证码落入事件日志中。需要 Sysmon 14 或更高版本。如果你编辑了 XML,请刷新 `$configSha256`。 - **为什么不用 [sysmon-modular](https://github.com/olafhartong/sysmon-modular):** 经过实测,而非臆测。它针对此配置的 114 条包含了 246 条 `RegistryEvent` 包含规则,并且在本次使用 `end with` 的地方倾向于使用 `begin with` 和 `contains`。在已经因为负载而丢弃 RegistryEvent 的机器上——这正是 Sysmon 事件 255 `QUEUE` 的含义,而且很常见——那是错误的方向。如果你想按模块进行调整,sysmon-modular 是更好的基础;但它并不是解决配置泛滥的即插即用方案。健康检查会报告通道实际接收的事件 ID,因此无论哪种方式,收集量少于你预期的配置都会作为发现项显示出来。 - **加固处理和健康检查**也可独立运行——请参阅上方的相应部分;两者都不需要安装程序。它们在“只读”的意义上有所不同:健康检查完全不写入任何内容,而加固处理会先报告,然后只有在你对该特定更改回答 `y` 之后才会应用更改。
可选步骤:双启动、GitHub、Neovim - **双启动**检查在确认每次更改之前都是只读的。关闭休眠(`powercfg /h off`,也会清除快速启动)对任何双启动都是安全的。**只有在**另一个操作系统是 Linux/macOS 时才将硬件时钟设置为 UTC——不适用于 Windows + Windows 的组合。**如果开启了 BitLocker,在触碰安全启动或固件之前,请备份你的恢复密钥**。 - **GitHub 登录**运行 `gh auth login --web`,将 git 配置为使用 `gh` 作为凭据,并设置你的全局 git 身份(登录名,当你的邮箱被隐藏时为 `@users.noreply.github.com`),外加合理的 `init.defaultBranch` / `pull.rebase` / `push.autoSetupRemote` 默认设置。 - **Neovim** 将我的 [nvim 配置](https://github.com/26zl/nvim)安装到 `%LOCALAPPDATA%\nvim` 中(备份任何现有配置;插件在首次启动时安装)——它需要 MSVC 工具集提供的 C 编译器。它也可以在 WSL Debian 中设置相同的配置;全新的 WSL 在重启后才算准备就绪,因此请重新运行以完成该部分。
## 许可证 项目代码采用 MIT 许可协议。内置的 Sysmon 配置为 [SwiftOnSecurity's sysmon-config](https://github.com/SwiftOnSecurity/sysmon-config),采用 CC BY 4.0 许可;其署名和许可声明保留在 [`sysmon/sysmonconfig-export.xml`](sysmon/sysmonconfig-export.xml) 的头部。
标签:AI合规, IPv6, Libemu, PowerShell, 健康检查, 系统加固, 系统运维, 自动化配置