scns/Windows-Update-Report-MultiTenant
GitHub: scns/Windows-Update-Report-MultiTenant
基于PowerShell和Microsoft Graph API的多租户Windows更新监控方案,可跨多个M365租户汇总设备补丁状态并生成交互式HTML仪表板。
Stars: 5 | Forks: 0
# Windows Update Report MultiTenant v3.0
| 仓库状态 | Windows Update Report |
| :--- | :--- |
| [][github-master] [][commits] | |
| [](LICENSE) [][forks-url] [][stars-url] [][issues-url] | [][contributors-url] [](https://GitHub.com/scns/Windows-Update-Report-MultiTenant/releases) |

该 PowerShell 项目通过 Microsoft Graph 为多个租户生成关于 Windows Update 和设备合规性状态的 comprehensive 概览报告。结果是一个专业的 HTML Dashboard,包含可过滤表格、图表、合规性监控和详细的 KB 信息。
## 🎯 版本 3.1 亮点
- **🛡️ Device Compliance 集成**:完整的 Microsoft Graph 合规性监控
- **🔄 智能备份系统**:具有保留管理的自动备份
- **🎨 现代 UI**:支持 Dark/Light 主题,界面简洁流畅
- **🕐 时区支持**:可配置的时区显示,确保时间戳准确
- **📦 增强配置**:针对所有功能的广泛配置选项
- **🗂️ KB Database 缓存**:用于 KB mapping 数据库的智能缓存系统
## 🔄 **备份与归档系统**
- **自动备份**:可配置的 exports、archive 和配置文件备份
- **保留管理**:可设置每种备份类型的保留期(默认 5 个备份)
- **智能清理**:自动删除旧备份并记录日志
- **独立备份类型**:
- **Export Backup**:`backup/export_backup/` - 每日导出
- **Archive Backup**:`backup/archive_backup/` - 归档文件
- **Config Backup**:`backup/config_backup/` - 配置和凭证
- **精细控制**:每种备份类型可单独启用/禁用
- **状态日志**:关于备份创建和清理的清晰反馈
## 🕐 **时区支持**
- **可配置偏移**:通过 config.json 中的 `timezoneOffsetHours` 设置时区
- **稳健转换**:支持多种 DateTime 格式以实现最大兼容性
- **UTC 检测**:智能时区检测和转换
- **视觉反馈**:HTML 头部显示时区信息(例如 "LastSeen (UTC+2)")
- **精确计算**:通过时区校正改进同步计算
## 🚀 主要功能
- **自动模块安装**:自动检查并安装所需的 PowerShell 模块
- **可配置设置**:所有设置均可通过 `config.json` 管理
- **多租户支持**:通过 Microsoft Graph 获取每个租户的 Windows Update 和合规性状态
- **Device Compliance 监控**:通过 Microsoft Graph API 进行完整的设备合规性状态跟踪
- **智能 KB 检测**:显示特定的缺失 KB 编号和安全补丁
- **KB Mapping 数据库**:具有智能缓存系统的广泛在线数据库
- **OS 版本分析**:自动检测过时的 Windows 构建版本并提供建议
- **时区支持**:可配置的时区转换以确保 LastSeen 时间准确
- **灵活导出选项**:将结果导出为包含合规性数据的 CSV 文件(按客户)
- **交互式 HTML Dashboard**:具有可过滤表格、快速过滤器和图表的专业 Dashboard
- **智能文件管理**:自动归档旧的导出文件
- **自动浏览器集成**:可配置为自动打开生成的报告
## 🆕 v3.0 新功能
### 🛡️ **Device Compliance 监控**
- **Microsoft Graph 集成**:与 `deviceCompliancePolicyStates` API 完全集成
- **合规性状态跟踪**:
- **Compliant**:设备符合所有合规性策略
- **Non-Compliant**:设备检测到合规性问题
- **无数据**:无可用合规性信息
- **Error**:合规性检查期间发生错误
- **视觉指示器**:颜色编码的合规性状态(绿/红/灰/橙)
- **专用过滤**:Non-Compliant 快速过滤器,用于快速识别问题
- **CSV 导出**:合规性状态包含在所有导出文件中
- **下拉过滤器**:合规性状态列具有独立的下拉过滤器
### 🎨 **主题支持**
- **Dark/Light 模式**:可在 config.json 中配置默认主题
- **浏览器切换**:运行时在 Dark 和 Light 模式之间切换
- **一致样式**:所有 UI 元素均支持两种主题
- **专业设计**:现代风格,可读性极佳
### 🎯 **智能更新检测**
- **特定 KB 编号**:显示缺失的 KB 更新(如 "KB5041585"),适用于 OS 过时的机器
- **Build 分析**:分析 OS 版本差异并建议所需的累积更新
- **更新状态类别**:
- "Up-to-date"、"Verouderde OS versie"(过时的 OS 版本)、"Handmatige controle vereist"(需手动检查)
- "Waarschijnlijk up-to-date"(可能最新)、"Updates wachtend"(更新等待中)、"Update fouten"(更新错误)
- "Compliance problemen"(合规性问题)、"Synchronisatie vereist"(需同步)、"Error"
### 🗄️ **KB Mapping 数据库与智能缓存**
- **在线 KB 数据库**:Windows build 编号到特定 KB 更新的广泛映射
- **智能缓存系统**:一次性下载 KB 数据库并缓存可配置的时长(默认 30 分钟)
- **回退机制**:在网络问题时使用过期缓存以确保可靠性
- **数据库概览**:专用 Dashboard 标签页显示可用的映射和缓存状态
- **性能优化**:通过智能缓存减少 95%+ 的服务器负载
- **多平台支持**:支持 Windows 10、Windows 11 和历史版本
- **缓存方法跟踪**:显示 KB 信息的来源(Online、Cache、ExpiredCache、Local、Estimated)
### 📦 **Office 版本跟踪与通道管理 (v2.0)**
- **Office 版本检测**:通过 Graph API 自动检测每个设备的 Microsoft 365 Apps 版本
- **增强的 Office Channel 识别**:具有年龄检测和精确版本匹配的智能分类:
- **Current Channel (最新)** - 最新版本 (build >= 19426) → 绿色,加粗
- **Current Channel (近期)** - 近期发布 < 30 天 (build 19328-19425) → 绿色
- **Current Channel (过时)** - 旧版本 > 30 天 (build 19328-19425) → 橙色 ⚠️
- **Monthly Enterprise** - 受支持的 Monthly Enterprise 版本 (19127-19327) → 绿色
- **Semi-Annual Enterprise** - 较旧但受支持的版本 (17928-19126) → 橙色
- **过时/EOL** - 非常旧的版本 < build 17928 → 红色,加粗 ❌
- **未知** - 无法检测的版本 → 灰色
- **Office Mapping Database v2.0**:
- 包含 43 个 Current Channel 版本(最近 12 个月)的广泛版本历史
- 包含发布日期和 age_days 的详细 build 信息
- 11 个 Monthly Enterprise Channel 版本及其支持结束日期
- 基于规则的优先级分类系统
- 完整 build 编号支持(major + minor 版本)
- **年龄检测**:自动计算版本年龄,包括:
- 针对 version_history 数据库的精确匹配
- 对未知 build 的估计年龄
- 过时版本状态的智能降级
- **视觉指示器**:带有状态工具提示的颜色编码 Office 版本
- **Office Versions 标签页**:Dashboard 标签页包含:
- 所有 Office 更新通道概览
- 发布日期和支持结束信息
- 版本历史和建议更新
- CSV 导出功能
- **导出支持**:所有 CSV 导出中包含 Office 版本、通道和状态
- **Online-first 缓存**:
- 从 GitHub 在线获取 Office mapping
- 30 分钟缓存以提高性能
- 网络问题时回退到本地文件
### 🪟 **Windows 版本与支持状态跟踪**
- **Windows 版本检测**:基于 build 编号自动识别 Windows 版本
- **支持状态颜色编码**:Windows 支持生命周期的视觉指示器:
- **W11 25H2**(绿色,加粗)- 最新版本,完全受支持
- **W11 24H2**(绿色,加粗)- 支持至 2026 年 10 月
- **W11 23H2**(绿色)- 支持至 2025 年 11 月
- **W11 22H2**(橙色)- 有限支持,EOL 2024 年 10 月 (Pro) / 2025 年 10 月 (Enterprise)
- **W11 21H2**(红色,加粗)- 生命周期结束,EOL 2023 年 10 月
- **W10 22H2**(橙色)- 2025 年 10 月结束
- **W10 21H2 及更早**(红色,加粗)- 生命周期结束
- **Windows Edition 列**:专用列显示清晰的 Windows 版本标识(例如 "W11 24H2"、"W10 22H2")
- **双重可视化**:OS Version(build 编号)和 Windows Edition 列均带有颜色编码
- **支持意识**:快速识别急需升级的系统
### 🔍 **高级过滤与 UI**
- **下拉过滤器**:Update Status 和 Compliance Status 列具有包含所有可用选项的下拉菜单
- **快速过滤按钮**:颜色编码按钮用于直接过滤:
- Up-to-date(绿色)、Updates Wachtend(黄色)、Update Fouten(红色)
- Verouderde OS(橙色)、Handmatige Controle(紫色)、Non-Compliant(独特的红色)
- **过滤器同步**:自动重置冲突的过滤器以保持体验一致
- **Dark 主题支持**:在 Light 和 Dark 浏览器主题中均具有最佳可见性
- **简化的表格**:移除 KB Method 列以获得更简洁的界面
- **导出功能**:完整的表格导出和按客户过滤的导出选项
### 📊 **增强的 Dashboard 与统计**
- **全局统计**:包含总数和百分比的 所有租户概览
- **每个客户的统计**:每个客户的详细细分及可视化卡片
- **合规性百分比**:Up-to-date 百分比和合规性比率
- **交互式图表**:具有按客户过滤功能的 Chart.js 图表
- **专业样式**:具有响应式设计的现代 UI
- **App Registration 监控**:用于证书过期跟踪的专用标签页
## 📋 所需的 Microsoft Graph API 权限
为了实现完整功能,需要以下 **Application Permissions**:
### 🔒 设备管理与配置
```
DeviceManagementManagedDevices.Read.All (Application)
DeviceManagementConfiguration.Read.All (Application)
```
**用途**:Device management API、compliance policy states 和设备配置信息
### 🛡️ 安全与威胁搜寻
```
ThreatHunting.Read.All (Application)
SecurityEvents.Read.All (Application)
```
**用途**:Advanced Hunting KQL 查询和安全事件信息
### 📊 目录与设备信息
```
Device.Read.All (Application)
```
**用途**:设备目录信息和组织上下文
### ⚙️ 应用与 Windows 更新管理
```
Application.Read.All (Application)
WindowsUpdates.ReadWrite.All (Application)
```
**用途**:App Registration 过期监控和证书状态
## 🛠️ 安装与设置
### 1. 仓库设置
```
git clone https://github.com/scns/Windows-Update-Report-MultiTenant.git
cd Windows-Update-Report-MultiTenant
```
### 2. 配置
```
# 复制 template 文件(用于新安装)
Copy-Item "_config.json" "config.json"
Copy-Item "_credentials.json" "credentials.json"
# 调整配置
notepad config.json
notepad credentials.json
```
**对于现有安装:** 将您当前的 config.json 与 _config.json 进行比较以添加新选项。
**📋 详细的凭证设置:** 请参阅 [CREDENTIALS-SETUP.md](CREDENTIALS-SETUP.md) 获取详细说明。
## 🔄 从 v2.x 升级到 v3.0
对于现有用户,有一些重要的更改:
### 配置更新
```
# 备份当前配置
Copy-Item "config.json" "config_backup.json"
# 与新的 template 比较并添加新选项
# v3.0 中的新选项:
# - timezoneOffsetHours
# - backup 部分 (enableExportBackup 等)
# - theme 部分
# - kbMapping 已扩展
```
### 新功能
1. **备份系统**:在 config.json 中配置自动备份
2. **时区支持**:根据您的位置设置 `timezoneOffsetHours`
3. **主题偏好**:在 "light" 和 "dark" 之间选择作为默认
4. **简化的界面**:删除了 KB Method 列以获得更简洁的 UI
### 向后兼容性
- 现有的 config.json 文件将继续工作
- 新功能具有安全的默认设置
- credentials.json 格式无破坏性更改
### 3. Azure App Registration 设置
1. 转到 [Azure Portal](https://portal.azure.com) → Azure Active Directory → App registrations
2. 为每个租户/客户创建新的 App Registration
3. 添加所需的 API 权限:
- `DeviceManagementManagedDevices.Read.All`
- `DeviceManagementConfiguration.Read.All`
- `ThreatHunting.Read.All`
- `Device.All`
- `Directory.Read.All`
- `Application.Read.All`
4. 对所有权限 **授予管理员同意**
5. 生成 client secret(安全地记录它!)
6. 使用每个客户的租户 ID、客户端 ID 和客户端密钥填写 `credentials.json`
### 4. 首次运行
```
# 启动脚本 - 自动 module 安装
.\get-windows-update-report.ps1
```
脚本将自动安装所需的 PowerShell 模块并生成第一份报告。
### 5. 输出位置
- **HTML Dashboard**:`exports/Windows_Update_Overview.html`
- **CSV 导出**:`exports/YYYYMMDD_KlantNaam_Windows_Update_report_*.csv`
- **归档文件**:`archive/`(较旧的导出)
- **备份**:`backup/`(自动备份)
## ⚙️ 配置选项
### 基本配置
```
{
"exportRetentionCount": 40,
"cleanupOldExports": true,
"exportDirectory": "exports",
"archiveDirectory": "archive",
"autoOpenHtmlReport": true,
"lastSeenDaysFilter": 0,
"timezoneOffsetHours": 2
}
```
**选项:**
- `exportRetentionCount`:要保留的导出文件数量(默认:40)
- `cleanupOldExports`:自动清理旧的导出(true/false)
- `lastSeenDaysFilter`:根据上次在线时间过滤机器(0 = 所有机器)
- `autoOpenHtmlReport`:自动在浏览器中打开报告
### 时区配置
```
{
"timezoneOffsetHours": 2
}
```
**选项:**
- **荷兰(夏季)**:`2` (UTC+2)
- **荷兰(冬季)**:`1` (UTC+1)
- **UTC 时间**:`0`
- **美国东部**:`-5` (UTC-5)
### KB Mapping 数据库
```
{
"kbMapping": {
"kbMappingUrl": "https://raw.githubusercontent.com/scns/Windows-Update-Report-MultiTenant/refs/heads/main/kb-mapping.json",
"timeoutSeconds": 10,
"cacheValidMinutes": 30,
"estimationThreshold": 1000,
"showEstimationLabels": true,
"fallbackToLocalMapping": true,
"estimationLabels": {
"buildDifference": "(geschat voor build {targetBuild})",
"noMapping": "(geschat)",
"oldMapping": "(verouderd)"
}
}
}
```
### Office 版本映射
```
{
"officeMapping": {
"officeMappingUrl": "https://raw.githubusercontent.com/scns/Windows-Update-Report-MultiTenant/refs/heads/main/office-version-mapping.json",
"timeoutSeconds": 10,
"cacheValidMinutes": 30,
"fallbackToLocalMapping": true
}
}
```
### 备份系统
```
{
"backup": {
"enableExportBackup": true,
"enableArchiveBackup": true,
"enableConfigBackup": true,
"exportBackupRetention": 5,
"archiveBackupRetention": 5,
"configBackupRetention": 5,
"backupRoot": "backup",
"exportBackupSubfolder": "export_backup",
"archiveBackupSubfolder": "archive_backup",
"configBackupSubfolder": "config_backup"
}
}
```
**备份类型:**
- **Export Backup**:所有 CSV 导出的每日备份
- **Archive Backup**:归档文件的备份
- **Config Backup**:config.json、credentials.json、kb-mapping.json 的备份
### 主题配置
```
{
"theme": {
"default": "dark"
}
}
```
**选项:**
- `"light"`:Light 主题为默认
- `"dark"`:Dark 主题为默认
## 📁 文件结构
```
Windows-Update-Report-MultiTenant/
├── get-windows-update-report.ps1 # Hoofd PowerShell script
├── config.json # Configuratie instellingen
├── credentials.json # Tenant credentials (exclusief git)
├── kb-mapping.json # Lokale KB mapping database
├── exports/ # Gegenereerde rapporten
├── archive/ # Gearchiveerde oude exports
├── backup/ # Automatische backups
├── images/ # Dashboard screenshots
├── CONFIG-UITLEG.md # Gedetailleerde configuratie uitleg
├── KB-CACHING-INFO.md # KB caching documentatie
├── SECURITY.md # Beveiligingsbeleid
├── CONTRIBUTING.md # Contributie richtlijnen
└── CODE_OF_CONDUCT.md # Gedragscode
```
## 🔧 故障排除
### 权限错误
- 检查是否已授予所有必需的 API 权限
- 确保权限已由管理员“授予”
- 检查 client secret 的有效性
### 时区问题
- 在 config.json 中调整 `timezoneOffsetHours`
- 检查 LastSeen 时间是否正确显示
- 使用您所在时区的 UTC 偏移量
### 缓存问题
- KB mapping 缓存会在 30 分钟后自动刷新
- 如有问题:删除 `Global:CachedKBMapping` 变量
- 检查在线 KB 数据库的互联网连接
### 合规性数据缺失
- 确保已授予 `DeviceManagementConfiguration.Read.All` 权限
- 检查设备是否已注册 Intune
- 对于非受管设备,回退到“无数据”状态是正常的
## 📚 文档链接
- **[配置说明](CONFIG-UITLEG.md)** - 所有配置选项的详细说明
- **[Credentials 设置](CREDENTIALS-SETUP.md)** - 分步 Azure App Registration 设置
- **[KB 缓存信息](KB-CACHING-INFO.md)** - KB mapping 缓存配置和故障排除
- **[安全策略](SECURITY.md)** - 安全策略和漏洞报告
- **[贡献指南](CONTRIBUTING.md)** - 为项目做出贡献的指南
- **[行为准则](CODE_OF_CONDUCT.md)** - 贡献者的行为准则
## 🤝 贡献
欢迎贡献!请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 获取指南。
## 📄 许可证
本项目采用 [MIT License](LICENSE)。
## 🔒 安全
有关安全相关事宜,请参阅 [SECURITY.md](SECURITY.md)。
## 📞 支持
- **问题**:[GitHub Issues](https://github.com/scns/Windows-Update-Report-MultiTenant/issues)
- **电子邮件**:[info@maarten-schmeitz.nl](mailto:info@maarten-schmeitz.nl)
- **文档**:请参阅随附的 MD 文件以获取详细信息
**版本**:3.0 | **最后更新**:2025 年 8 月 | **PowerShell**:7.2+ | **Microsoft Graph**:v1.0 & Beta
## 需求
- PowerShell 7.2+
- Microsoft Graph PowerShell SDK(自动安装)
- 每个租户一个具有正确权限的 Azure AD App Registration
## 准备工作
### 1. 创建 Azure AD App Registration
1. 转到 [Azure Portal - App registrations](https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps)。
2. 点击 **New registration** 并为应用命名。
3. 创建后,转到 **API permissions**。
4. **删除所有默认添加的权限**(例如 `User.Read`)。
5. 添加以下 Microsoft Graph **Application** 权限:
#### 为了最佳功能(推荐)
- `DeviceManagementManagedDevices.Read.All` - 用于详细的 Windows Update 信息
- `ThreatHunting.Read.All` - 用于回退功能
- `Application.Read.All` - 用于 App Registration 有效性监控
#### 最低要求(回退功能)
- `ThreatHunting.Read.All` - 用于基本 Windows Update 信息
- `Application.Read.All` - 用于 App Registration 有效性监控
1. 点击 **Grant admin consent** 授予这些权限。
2. 转到 **Certificates & secrets** 并创建一个新的 client secret。立即记下此值。
### 2. 配置项目
#### 凭证文件
**对于新安装:**
1. 将 `_credentials.json` 重命名为 `credentials.json`
2. 为您的租户填写正确的值
**对于现有安装:**
- 您现有的 `credentials.json` 将保持原样工作
- 无需更改
`credentials.json` 文件具有以下格式:
```
{
"LoginCredentials": [
{
"ClientID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"Secret": "YOUR-CLIENT-SECRET",
"TenantID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"customername": "KlantNaam",
"color": "#1f77b4"
}
// Voeg meer tenants toe indien nodig
]
}
```
**color**:为每个客户指定一个固定的 HTML 颜色代码(十六进制,例如 `#1f77b4`)。此颜色将用于 HTML Dashboard 的图表中。
#### 配置文件
**对于新安装:**
1. 将 `_config.json` 重命名为 `config.json`
2. 根据您的需求调整设置
**对于现有安装:**
- 如果您已有 `config.json`,请添加任何缺失的选项
- 与 `_config.json` 比较以查看可用的新选项
`config.json` 文件包含所有设置:
```
{
"exportRetentionCount": 40,
"cleanupOldExports": true,
"exportDirectory": "exports",
"archiveDirectory": "archive",
"autoOpenHtmlReport": true,
"lastSeenDaysFilter": 0,
"kbMapping": {
"kbMappingUrl": "https://mrtn.blog/wp-content/uploads/2025/08/kb-mapping.json",
"timeoutSeconds": 10,
"cacheValidMinutes": 30,
"estimationThreshold": 1000,
"showEstimationLabels": true,
"fallbackToLocalMapping": true,
"estimationLabels": {
"buildDifference": "(geschat voor build {targetBuild})",
"noMapping": "(geschat)",
"oldMapping": "(verouderd)"
}
},
"theme": {
"default": "dark"
}
}
```
**配置选项:**
- `exportRetentionCount`:每个客户/类型保留的导出文件数量(较旧的将被归档)
- `cleanupOldExports`:启用/禁用自动归档
- `exportDirectory`:存储新导出文件的目录
- `archiveDirectory`:归档旧导出文件的目录
- `autoOpenHtmlReport`:自动在 Web 浏览器中打开 HTML 报告
- `lastSeenDaysFilter`:根据设备上次可见以来的天数过滤报告
- `kbMapping.kbMappingUrl`:在线 KB mapping 数据库的 URL
- `kbMapping.timeoutSeconds`:在线 KB 数据库请求的超时时间(默认:10)
- `kbMapping.cacheValidMinutes`:缓存有效期(分钟)(默认:30)
- `kbMapping.estimationThreshold`:KB 估算的 Build 差异阈值
- `kbMapping.showEstimationLabels`:显示估算 KB 编号的标签
- `kbMapping.fallbackToLocalMapping`:使用本地 mapping 作为回退
- `officeMapping.officeMappingUrl`:在线 Office 版本 mapping 数据库的 URL
- `officeMapping.timeoutSeconds`:在线 Office mapping 请求的超时时间(默认:10)
- `officeMapping.cacheValidMinutes`:缓存有效期(分钟)(默认:30)
- `officeMapping.fallbackToLocalMapping`:使用本地 Office mapping 作为回退
- `theme.default`:Dashboard 的默认主题("dark" 或 "light")
### 3. 安装所需的 PowerShell 模块
首次使用脚本时,所需的模块将自动安装。不再需要手动安装。
## 使用方法
1. **对于新安装**:将 `_credentials.json` 重命名为 `credentials.json`,将 `_config.json` 重命名为 `config.json`
2. **对于现有安装**:检查您的 `config.json` 是否包含所有必需的选项(与 `_config.json` 比较)
3. 在 `credentials.json` 文件中填写您的租户详细信息
4. 根据您的需求调整 `config.json` 中的设置
5. 启动脚本:
```
.\get-windows-update-report.ps1
```
1. 脚本将:
- 自动安装所需的模块(如果需要)
- 检查每个租户的 App Registration 有效性
- 通过 Device Management API 获取 Windows Update 状态(或回退到 Threat Hunting API)
- 执行 OS 版本分析并检测过时的 build
- 识别 OS 过时机器的缺失 KB 编号
- 生成包含详细信息的每个客户的 CSV 文件
- 归档旧文件(如果已配置)
- 生成具有可过滤表格和快速过滤器的 HTML Dashboard
- 在您的默认 Web 浏览器中自动打开报告
2. 您可以在配置的导出目录中找到结果,包括交互式 HTML Dashboard。
## HTML Dashboard 功能
### 📊 **每个客户的概览表**
- **可过滤的 DataTables**:在所有列中搜索和排序
- **Update Status 下拉菜单**:直接过滤特定状态
- **快速过滤按钮**:用于常用过滤器的颜色编码按钮
- **导出功能**:将完整或过滤后的结果导出为 CSV
### 🎯 **列信息**
| 列 | 描述 |
|-------|-------------|
| **Device** | 计算机名称 |
| **Update Status** | 总体状态 |
| **Missing Updates** | 缺失的特定 KB 编号和更新名称 |
| **Details** | 状态消息和诊断信息 |
| **OS Version** | Windows build 版本 |
| **KB Method** | KB 信息来源 |
| **Count** | 二进制指示器(0 = OK,1 = 需要注意) |
| **LastSeen** | 上次同步日期 |
| **LoggedOnUsers** | 当前用户 |
### 🔍 **过滤功能**
```
🔘 Alle statussen 🟢 Up-to-date 🟠 Verouderde OS
🔴 Handmatige controle 🔵 Waarschijnlijk up-to-date 🟣 Errors
```
### 📈 **图表与分析**
- **每日 Count 趋势**:显示 Windows Update 情况的演变
- **每个客户的概览**:比较不同租户之间的更新状态
- **OS 版本分析**:Windows builds 的百分比分布
### 🌙 **主题支持**
- **Dark/Light 模式切换**:轻松在深色和浅色主题之间切换
- **可配置的默认值**:通过 `config.json` 设置您的偏好
- **用户友好**:FontAwesome 图标确保一致的显示
### 🗄️ **KB Mapping 数据库 Dashboard**
HTML Dashboard 包含一个专门的 "KB Mapping Database" 标签页,显示关于 KB mapping 数据库的广泛信息:
#### 数据库状态概览
- **数据库状态**:✅ 可用 / ❌ 不可用
- **来源方法**:Online、Cache、ExpiredCache、Error 或 Exception
- **总条目数**:数据库中可用的 KB mappings 数量
- **最后更新**:上次缓存刷新的时间戳
#### KB Mapping 表
**完整的数据库视图**,包含可过滤/可排序的列:
- **Build Number**:Windows OS build 编号(例如 26100、22631)
- **KB Number**:对应的 KB 更新(例如 KB5041585)
- **Update Title**:更新描述
- **Release Date**:更新的正式发布日期
- **OS Version**:Windows 版本类别(Windows 11 24H2、Windows 10 22H2、Historical)
#### 缓存智能功能
- **实时状态**:显示当前缓存状态和信息来源
- **性能指标**:缓存有效性的可见性
- **回退透明度**:使用回退时的清晰指示
- **历史数据**:访问每年的历史 KB mappings
## API 方法论与回退
### 🎯 **主要方法:Device Management API**
**需要**:`DeviceManagementManagedDevices.Read.All` 权限
**优点**:
- 缺失更新的特定 KB 编号
- 详细的合规性信息
- Windows Update 状态跟踪
- 配置策略违规
**示例输出**:
```
Missing Updates: "2024-08 Cumulative Update voor Windows (KB5041585 of nieuwer)"
Details: "Windows Update status: Recent gesynchroniseerd, geen problemen"
```
### 🔄 **回退方法:Threat Hunting API**
**需要**:`ThreatHunting.Read.All` 权限
**使用情况**:
- Device Management API 不可用
- Device Management 权限不足
- 租户没有 Intune 许可证
**输出**:
```
Missing Updates: (leeg - geen specifieke KB info beschikbaar)
Details: "Windows Update status: Controleer handmatig - Device niet in Intune beheer"
```
### 🧠 **智能 OS 分析**
**对于所有场景**:
无论使用哪种 API,脚本都会分析 OS 版本并:
- 检测环境中最新的 Windows build
- 识别具有过时 builds 的机器
- 为已知的 build 差异建议特定的 KB 更新
- 为 IT 管理员提供实用建议
**过时 OS 的示例**:
```
Missing Updates: "Waarschijnlijk ontbrekende cumulative update (build verschil: 294); 2024-08 Cumulative Update voor Windows (KB5041585 of nieuwer)"
Update Status: "Verouderde OS versie"
```
## 文件结构
### 模板文件(随附)
```
Windows-Update-Report-MultiTenant/
├── _credentials.json # Template voor credentials (hernoem naar credentials.json)
├── _config.json # Template voor configuratie (hernoem naar config.json)
├── CONFIG-UITLEG.md # Gedetailleerde configuratie uitleg
├── get-windows-update-report.ps1
└── readme.md
```
### 配置并执行后
```
Windows-Update-Report-MultiTenant/
├── _credentials.json # Template bestand (blijft bestaan)
├── _config.json # Template bestand (blijft bestaan)
├── credentials.json # Jouw tenant configuratie
├── config.json # Jouw instellingen
├── CONFIG-UITLEG.md
├── get-windows-update-report.ps1
├── exports/ # Configureerbare export directory
│ ├── 20250822_KlantA_Windows_Update_report_Overview.csv
│ ├── 20250822_KlantA_Windows_Update_report_ByUpdate.csv
│ ├── 20250822_KlantB_Windows_Update_report_Overview.csv
│ ├── 20250822_KlantB_Windows_Update_report_ByUpdate.csv
│ └── Windows_Update_Overview.html
└── archive/ # Oude bestanden worden hier gearchiveerd
├── 20250821_KlantA_Windows_Update_report_Overview.csv
└── ... (oudere bestanden)
```
## v3.0 中的新功能
### 🎯 **KB 检测与更新智能**
**特定 KB 编号**:识别缺失的更新,如 KB5041585
- **Build 差异分析**:分析当前和最新 OS builds 之间的差异
- **智能建议**:根据 build 差异提供实用建议
- **多 API 支持**:Device Management API 与 Threat Hunting 回退
### 🗂️ **KnowledgeBase Mapping 数据库与智能缓存**
- **在线 KB 数据库**:包含 Windows Update KB mappings 的广泛外部数据库
- **智能缓存**:每次会话一次性下载数据库,缓存 30 分钟(可配置)
- **性能优化**:通过智能缓存管理减少 95%+ 的服务器负载
- **回退机制**:在网络问题中使用过期缓存以实现最大可靠性
- **缓存透明度**:KB Method 列显示每次 KB 查找的来源
- **多平台数据库**:支持 Windows 10、Windows 11 和包含 27+ KB mappings 的历史版本
- **Update Status 下拉菜单**:用下拉菜单替换文本过滤器以进行精确过滤
- **快速过滤按钮**:颜色编码按钮可直接访问常用过滤器
- **同步过滤**:下拉菜单和快速过滤器协同工作以获得最佳 UX
- **过滤器持久性**:在会话期间保留过滤器设置
### 📊 **增强的数据呈现**
- **分离列**:"Missing Updates" 用于 KB 编号,"Details" 用于状态消息
- **改进的 Count 逻辑**:二进制指示器(0/1)用于清晰的状态指示
- **OS 版本分析**:环境中 Windows builds 的百分比细分
- **状态分类**:清晰的更新状态类别以获得更好的洞察
## 备份功能
脚本支持自动备份导出、归档和配置文件:
- **导出备份**:创建 exports 目录的 zip 文件
- **归档备份**:创建 archive 目录的 zip 文件
- **配置备份**:创建 config.json 和 credentials.json 的 zip 文件
- **保留**:每种类型保留的备份数量可设置
- **配置**:所有路径和设置均可通过 `config.json` 管理
### 配置选项
在 `config.json` 文件中,您可以设置每种备份类型是否激活以及保留多少备份:
```
"backup": {
"enableExportBackup": true,
"enableArchiveBackup": true,
"enableConfigBackup": true,
"exportBackupRetention": 5,
"archiveBackupRetention": 5,
"configBackupRetention": 5,
"backupRoot": "backup",
"exportBackupSubfolder": "export_backup",
"archiveBackupSubfolder": "archive_backup",
"configBackupSubfolder": "config_backup"
}
```
## App Registration 状态 Dashboard
HTML Dashboard 包含一个特殊的 "App Registrations" 标签页,显示所有 client secret 到期日期的概览:
### App Registration Dashboard 功能
- **集中概览**:所有租户及其 App Registration 状态在一个表中
- **状态指示器**:到期日期的颜色编码警告:
- 🟢 **绿色**:有效期超过 30 天
- 🟠 **橙色**:7-30 天后到期(警告)
- 🔴 **红色**:少于 7 天后到期(严重)或无访问权限
- **详细信息**:
- 客户名称
- 状态消息
- 距离到期天数
- 确切到期日期(DD-MM-YYYY)
- **可过滤表格**:通过 DataTables 在所有列中搜索和排序
- **导出功能**:可以将状态数据导出为 CSV
## 故障排除
### ❌ **"Device Management API 不可用"**
**原因**:缺少 `DeviceManagementManagedDevices.Read.All` 权限或没有 Intune 许可证
**解决方案**:脚本会自动回退到 Threat Hunting API - 无需操作
### ❌ **"未找到有效的 client secret"**
**原因**:缺少 `Application.Read.All` 权限
**解决方案**:在 Azure Portal 中添加权限并授予管理员同意
### ❌ **Missing Updates 列为空**
**原因**:机器确实是最新的或正在使用回退 API
**预期**:这是正常的 - 具有 OS 过时的机器会自动获得 KB 建议
### ✅ **权限验证**
在 Azure Portal 中检查您的 App Registration 是否具有以下权限:
- ✅ `DeviceManagementManagedDevices.Read.All`(用于 KB 编号)
- ✅ `ThreatHunting.Read.All`(用于回退)
- ✅ `Application.Read.All`(用于 App Registration 监控)
## 注意事项
- 该脚本在使用 Device Management 权限时效果最佳,但也可以仅使用 Threat Hunting 权限运行
- KB 编号仅在具有 Device Management API 访问权限或检测到 OS 版本过时时显示
- 有关 App Registrations 的更多信息,请参阅 [Microsoft Docs](https://learn.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app)
- 该脚本支持 Windows 10 和 Windows 11 环境
© 2025 by Maarten Schmeitz
标签:AI合规, Awesome, CISA项目, Homebrew安装, HTML仪表板, IPv6, IT运维, KB知识库, Libemu, Microsoft 365, Microsoft Graph, PowerShell, Socks5代理, Windows更新, 多模态安全, 多租户监控, 威胁狩猎API, 安全报告, 端点安全, 系统管理, 自动化报告, 补丁管理, 设备合规性, 跨租户管理, 配置备份