{"id":29570209,"url":"https://github.com/scns/windows-update-report-multitenant","last_synced_at":"2026-06-10T23:32:11.086Z","repository":{"id":304805094,"uuid":"1020042856","full_name":"scns/Windows-Update-Report-MultiTenant","owner":"scns","description":"Windows Update Report MultiTenant is een PowerShell-oplossing voor het centraal monitoren van ontbrekende Windows-updates over meerdere Microsoft 365-tenants. Het script gebruikt de Microsoft Graph Threat Hunting API om per tenant updategegevens op te halen en genereert automatisch een interactief HTML-dashboard met filterbare tabellen en grafieken","archived":false,"fork":false,"pushed_at":"2026-06-03T04:58:41.000Z","size":516,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-03T06:26:37.219Z","etag":null,"topics":["azure","powershell","powershell-script","update","windows","windows-update"],"latest_commit_sha":null,"homepage":"https://mrtn.blog","language":"PowerShell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/scns.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":[],"patreon":null,"open_collective":null,"ko_fi":"maartenschmeitz","tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":"maartenschmeitz","thanks_dev":null,"custom":[],"bitcoin":"39dDgoRVGTFvFNh6sP1mBR2iSp6jfEnN16","ethereum":592031571554474447729594765284110064432523425935}},"created_at":"2025-07-15T08:54:30.000Z","updated_at":"2026-06-03T04:58:38.000Z","dependencies_parsed_at":"2025-07-15T21:37:08.232Z","dependency_job_id":"1c23fc36-2c31-451a-90a5-f5c0df3560e0","html_url":"https://github.com/scns/Windows-Update-Report-MultiTenant","commit_stats":null,"previous_names":["scns/windows-update-report-multitenant"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/scns/Windows-Update-Report-MultiTenant","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scns%2FWindows-Update-Report-MultiTenant","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scns%2FWindows-Update-Report-MultiTenant/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scns%2FWindows-Update-Report-MultiTenant/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scns%2FWindows-Update-Report-MultiTenant/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/scns","download_url":"https://codeload.github.com/scns/Windows-Update-Report-MultiTenant/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scns%2FWindows-Update-Report-MultiTenant/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34175887,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-10T02:00:07.152Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["azure","powershell","powershell-script","update","windows","windows-update"],"created_at":"2025-07-19T02:36:31.923Z","updated_at":"2026-06-10T23:32:11.077Z","avatar_url":"https://github.com/scns.png","language":"PowerShell","funding_links":["https://ko-fi.com/maartenschmeitz","https://buymeacoffee.com/maartenschmeitz","39dDgoRVGTFvFNh6sP1mBR2iSp6jfEnN16",592031571554474447729594765284110064432523425935],"categories":[],"sub_categories":[],"readme":"# Windows Update Report MultiTenant v3.0\n\n| Repository Status | Windows Update Report |\n| :--- | :--- |\n|  [![last commit time][github-last-commit]][github-master] [![GitHub Activity][commits-shield]][commits] | |\n| [![License][license-shield]](LICENSE) [![Forks][forks-shield]][forks-url] [![Stargazers][stars-shield]][stars-url] [![Issues][issues-shield]][issues-url] | [![Contributors][contributors-shield]][contributors-url] [![GitHub release](https://img.shields.io/github/release/scns/Windows-Update-Report-MultiTenant.svg)](https://GitHub.com/scns/Windows-Update-Report-MultiTenant/releases) |\n\n![Dashboard voorbeeld](images/001.png)\n\nDit PowerShell-project genereert een uitgebreid overzichtsrapport van Windows Update en device compliance status voor meerdere tenants via Microsoft Graph. Het resultaat is een professioneel HTML-dashboard met filterbare tabellen, grafieken, compliance monitoring en gedetailleerde KB informatie.\n\n## 🎯 Versie 3.1 Hoogtepunten\n\n- **🛡️ Device Compliance Integration**: Volledige Microsoft Graph compliance monitoring\n- **🔄 Intelligent Backup System**: Automatische backups met retention management  \n- **🎨 Modern UI**: Dark/Light theme support met streamlined interface\n- **🕐 Timezone Support**: Configureerbare tijdzone weergave voor accurate timestamps\n- **📦 Enhanced Configuration**: Uitgebreide configuratie-opties voor alle functionaliteiten\n- **🗂️ KB Database Caching**: Intelligent caching systeem voor KB mapping database\n\n## 🔄 **Backup \u0026 Archivering System**\n\n- **Automatische Backups**: Configureerbare backup van exports, archive en configuratiebestanden\n- **Retention Management**: Instelbare bewaarperiode per backup type (standaard 5 backups)\n- **Intelligente Cleanup**: Automatische verwijdering van oude backups met logging\n- **Separate Backup Types**:\n  - **Export Backup**: `backup/export_backup/` - Dagelijkse exports\n  - **Archive Backup**: `backup/archive_backup/` - Gearchiveerde bestanden  \n  - **Config Backup**: `backup/config_backup/` - Configuratie en credentials\n- **Granular Control**: Per backup type aan/uit te schakelen\n- **Status Logging**: Duidelijke feedback over backup creation en cleanup\n\n## 🕐 **Timezone Support**\n\n- **Configureerbare Offset**: Instelbare tijdzone via `timezoneOffsetHours` in config.json\n- **Robuuste Conversie**: Ondersteunt meerdere DateTime formaten voor maximale compatibiliteit\n- **UTC Detection**: Intelligente tijdzone detectie en conversie\n- **Visual Feedback**: HTML headers tonen tijdzone informatie (bijv. \"LastSeen (UTC+2)\")\n- **Accurate Calculations**: Verbeterde sync berekeningen met tijdzone correctie\n\n## 🚀 Hoofdfunctionaliteit\n\n- **Automatische module installatie**: Controleert en installeert automatisch benodigde PowerShell modules\n- **Configureerbare instellingen**: Alle instellingen beheerbaar via `config.json`\n- **Multi-tenant ondersteuning**: Haalt per tenant Windows Update en compliance status op via Microsoft Graph\n- **Device Compliance Monitoring**: Complete device compliance status tracking via Microsoft Graph API\n- **Intelligente KB detectie**: Toont specifieke ontbrekende KB nummers en security patches\n- **KB Mapping Database**: Uitgebreide online database met intelligent caching systeem\n- **OS versie analyse**: Automatische detectie van verouderde Windows builds en aanbevelingen\n- **Timezone ondersteuning**: Configureerbare tijdzone conversie voor accurate LastSeen tijden\n- **Flexibele export opties**: Exporteert resultaten naar CSV-bestanden per klant inclusief compliance data\n- **Interactief HTML-dashboard**: Professioneel dashboard met filterbare tabellen, snelfilters en grafieken\n- **Intelligente bestandsbeheer**: Automatische archivering van oude export bestanden\n- **Automatische browser integratie**: Configureerbaar automatisch openen van het gegenereerde rapport\n\n## 🆕 Nieuwe Functionaliteiten v3.0\n\n### 🛡️ **Device Compliance Monitoring**\n\n- **Microsoft Graph Integration**: Volledige integratie met `deviceCompliancePolicyStates` API\n- **Compliance Status Tracking**:\n  - **Compliant**: Device voldoet aan alle compliance policies\n  - **Non-Compliant**: Device heeft compliance issues gedetecteerd\n  - **Geen data**: Geen compliance informatie beschikbaar\n  - **Error**: Fout opgetreden tijdens compliance controle\n- **Visual Indicators**: Kleurgecodeerde compliance status (groen/rood/grijs/oranje)\n- **Dedicated Filtering**: Non-Compliant quick filter voor snelle problem identification\n- **CSV Export**: Compliance status opgenomen in alle export bestanden\n- **Dropdown Filters**: Compliance Status kolom heeft eigen dropdown filter\n\n### 🎨 **Theme Support**\n\n- **Dark/Light Mode**: Configureerbare standaard theme in config.json\n- **Browser Toggle**: Runtime switching tussen dark en light mode\n- **Consistent Styling**: Alle UI elementen ondersteunen beide themes\n- **Professional Design**: Moderne styling met optimale leesbaarheid\n\n### 🎯 **Intelligente Update Detectie**\n\n- **Specifieke KB nummers**: Toont ontbrekende KB updates zoals \"KB5041585\" voor machines met verouderde OS\n- **Build analyse**: Analyseert OS versie verschillen en suggereert benodigde cumulative updates\n- **Update status categorieën**:\n  - \"Up-to-date\", \"Verouderde OS versie\", \"Handmatige controle vereist\"\n  - \"Waarschijnlijk up-to-date\", \"Updates wachtend\", \"Update fouten\"\n  - \"Compliance problemen\", \"Synchronisatie vereist\", \"Error\"\n\n### 🗄️ **KB Mapping Database \u0026 Intelligent Caching**\n\n- **Online KB database**: Uitgebreide mapping van Windows build numbers naar specifieke KB updates\n- **Intelligent caching systeem**: Downloads KB database eenmalig en cached voor configureerbare duur (standaard 30 minuten)\n- **Fallback mechanisme**: Gebruikt expired cache bij netwerk problemen voor betrouwbaarheid\n- **Database overzicht**: Dedicated dashboard tab toont beschikbare mappings en cache status\n- **Performance optimalisatie**: Vermindert server load met 95%+ door slim caching\n- **Multi-platform support**: Ondersteunt Windows 10, Windows 11 en historische versies\n- **Cache methode tracking**: Toont bron van KB informatie (Online, Cache, ExpiredCache, Local, Estimated)\n\n### 📦 **Office Version Tracking \u0026 Channel Management (v2.0)**\n\n- **Office versie detectie**: Automatische detectie van Microsoft 365 Apps versies per device via Graph API\n- **Verbeterde Office Channel herkenning**: Intelligente classificatie met leeftijdsdetectie en nauwkeurige versie matching:\n  - **Current Channel (Actueel)** - nieuwste release (build \u003e= 19426) → Groen, bold\n  - **Current Channel (Recent)** - recente release \u003c 30 dagen oud (build 19328-19425) → Groen\n  - **Current Channel (Verouderd)** - oude release \u003e 30 dagen oud (build 19328-19425) → Oranje ⚠️\n  - **Monthly Enterprise** - ondersteunde Monthly Enterprise builds (19127-19327) → Groen\n  - **Semi-Annual Enterprise** - oudere maar ondersteunde versies (17928-19126) → Oranje\n  - **Verouderd/EOL** - zeer oude versies \u003c build 17928 → Rood, bold ❌\n  - **Onbekend** - versies die niet gedetecteerd konden worden → Grijs\n- **Office Mapping Database v2.0**:\n  - Uitgebreide versiegeschiedenis met 43 Current Channel releases (laatste 12 maanden)\n  - Gedetailleerde build informatie met release dates en age_days\n  - 11 Monthly Enterprise Channel releases met end-of-support datums\n  - Rule-based classification system met prioriteit\n  - Full build nummer ondersteuning (major + minor versie)\n- **Leeftijdsdetectie**: Automatische berekening van versie leeftijd met:\n  - Exacte matching tegen version_history database\n  - Geschatte leeftijd voor onbekende builds\n  - Intelligente degradatie van status bij verouderde versies\n- **Visual Indicators**: Kleurgecodeerde Office versies met status tooltips\n- **Office Versions Tab**: Dashboard tab met:\n  - Overzicht van alle Office update channels\n  - Release dates en end-of-support informatie\n  - Versiegeschiedenis en aanbevolen updates\n  - CSV export functionaliteit\n- **Export ondersteuning**: Office versie, channel en status in alle CSV exports\n- **Online-first caching**:\n  - Office mapping wordt online opgehaald van GitHub\n  - 30 minuten cache voor performance\n  - Fallback naar lokale file bij netwerk problemen\n\n### 🪟 **Windows Edition \u0026 Support Status Tracking**\n\n- **Windows Edition detectie**: Automatische herkenning van Windows versies op basis van build numbers\n- **Support status kleurcodering**: Visuele indicatoren voor Windows support lifecycle:\n  - **W11 25H2** (groen, bold) - Nieuwste versie, volledig ondersteund\n  - **W11 24H2** (groen, bold) - In support tot oktober 2026\n  - **W11 23H2** (groen) - In support tot november 2025\n  - **W11 22H2** (oranje) - Beperkte support, EOL oktober 2024 (Pro) / oktober 2025 (Enterprise)\n  - **W11 21H2** (rood, bold) - End of Life, EOL oktober 2023\n  - **W10 22H2** (oranje) - Eindigt oktober 2025\n  - **W10 21H2 en ouder** (rood, bold) - End of Life\n- **Windows Edition kolom**: Dedicated kolom toont duidelijke Windows versie aanduiding (bijv. \"W11 24H2\", \"W10 22H2\")\n- **Dubbele visualisatie**: Zowel OS Version (build number) als Windows Edition kolom met kleurcodering\n- **Support awareness**: Snelle identificatie van systemen die dringend een upgrade nodig hebben\n\n### 🔍 **Geavanceerde Filtering \u0026 UI**\n\n- **Dropdown filters**: Update Status en Compliance Status kolommen hebben dropdown met alle beschikbare opties\n- **Snelfilter knoppen**: Kleurgecodeerde knoppen voor directe filtering op:\n  - Up-to-date (groen), Updates Wachtend (geel), Update Fouten (rood)\n  - Verouderde OS (oranje), Handmatige Controle (paars), Non-Compliant (unieke rode kleur)\n- **Filter Synchronisatie**: Automatische reset van conflicterende filters voor consistente ervaring\n- **Dark Theme Support**: Optimale zichtbaarheid in zowel light als dark browser themes\n- **Streamlined Table**: KB Method kolom verwijderd voor cleaner interface\n- **Export Functies**: Volledige tabel export en gefilterde export opties per klant\n\n### 📊 **Enhanced Dashboard \u0026 Statistics**\n\n- **Globale Statistieken**: Overzicht van alle tenants met totalen en percentages\n- **Per-Client Statistieken**: Gedetailleerde breakdown per klant met visual cards\n- **Compliance Percentages**: Up-to-date percentages en compliance ratios\n- **Interactive Charts**: Chart.js grafieken met per-klant filtering\n- **Professional Styling**: Moderne UI met responsive design\n- **App Registration Monitoring**: Dedicated tab voor certificate expiry tracking\n\n## 📋 Vereiste Microsoft Graph API Permissions\n\nVoor volledige functionaliteit zijn de volgende **Application Permissions** vereist:\n\n\u003e **⚠️ Belangrijk**: Configureer deze permissions als **Application permissions** (niet Delegated permissions) in je Azure App Registration.\n\n### 🔒 Device Management \u0026 Configuration\n\n```text\nDeviceManagementManagedDevices.Read.All (Application)\nDeviceManagementConfiguration.Read.All (Application)\n```\n\n**Voor**: Device management API, compliance policy states, en device configuration informatie\n\n### 🛡️ Security \u0026 Threat Hunting\n\n```text\nThreatHunting.Read.All (Application)\nSecurityEvents.Read.All (Application)\n```\n\n**Voor**: Advanced Hunting KQL queries en security event informatie\n\n### 📊 Directory \u0026 Device Information\n\n```text\nDevice.Read.All (Application)\n```\n\n**Voor**: Device directory informatie en organizational context\n\n### ⚙️ Application \u0026 Windows Updates Management\n\n```text\nApplication.Read.All (Application)\nWindowsUpdates.ReadWrite.All (Application)\n```\n\n**Voor**: App Registration expiry monitoring en certificate status\n\n## 🛠️ Installatie \u0026 Setup\n\n### 1. Repository Setup\n\n```powershell\ngit clone https://github.com/scns/Windows-Update-Report-MultiTenant.git\ncd Windows-Update-Report-MultiTenant\n```\n\n### 2. Configuratie\n\n```powershell\n# Kopieer template bestanden (voor nieuwe installaties)\nCopy-Item \"_config.json\" \"config.json\"\nCopy-Item \"_credentials.json\" \"credentials.json\"\n\n# Pas configuratie aan\nnotepad config.json\nnotepad credentials.json\n```\n\n**Voor bestaande installaties:** Vergelijk je huidige config.json met _config.json om nieuwe opties toe te voegen.\n\n**📋 Uitgebreide credentials setup:** Zie [CREDENTIALS-SETUP.md](CREDENTIALS-SETUP.md) voor gedetailleerde instructies.\n\n## 🔄 Upgrade van v2.x naar v3.0\n\nVoor bestaande gebruikers zijn er enkele belangrijke wijzigingen:\n\n### Configuratie Updates\n\n```powershell\n# Backup je huidige configuratie\nCopy-Item \"config.json\" \"config_backup.json\"\n\n# Vergelijk met nieuwe template en voeg nieuwe opties toe\n# Nieuwe opties in v3.0:\n# - timezoneOffsetHours\n# - backup sectie (enableExportBackup, etc.)\n# - theme sectie\n# - kbMapping uitgebreid\n```\n\n### Nieuwe Features\n\n1. **Backup System**: Configureer automatische backups in config.json\n2. **Timezone Support**: Stel `timezoneOffsetHours` in voor je locatie\n3. **Theme Preference**: Kies tussen \"light\" en \"dark\" als standaard\n4. **Streamlined Interface**: KB Method kolom is verwijderd voor een cleanere UI\n\n### Backward Compatibility\n\n- Bestaande config.json bestanden blijven werken\n- Nieuwe features hebben veilige standaardinstellingen\n- Geen breaking changes in credentials.json formaat\n\n### 3. Azure App Registration Setup\n\n1. Ga naar [Azure Portal](https://portal.azure.com) → Azure Active Directory → App registrations\n2. Maak nieuwe App Registration aan per tenant/klant\n3. Voeg de vereiste API permissions toe:\n   - `DeviceManagementManagedDevices.Read.All`\n   - `DeviceManagementConfiguration.Read.All`\n   - `ThreatHunting.Read.All`\n   - `Device.Read.All`\n   - `Directory.Read.All`\n   - `Application.Read.All`\n4. **Grant admin consent** voor alle permissions\n5. Genereer client secret (noteer deze veilig!)\n6. Vul `credentials.json` in met tenant ID, client ID en client secret per klant\n\n### 4. Eerste Run\n\n```powershell\n# Start het script - automatische module installatie\n.\\get-windows-update-report.ps1\n```\n\nHet script installeert automatisch benodigde PowerShell modules en genereert het eerste rapport.\n\n### 5. Output Locaties\n\n- **HTML Dashboard**: `exports/Windows_Update_Overview.html`\n- **CSV Exports**: `exports/YYYYMMDD_KlantNaam_Windows_Update_report_*.csv`\n- **Archived Files**: `archive/` (oudere exports)\n- **Backups**: `backup/` (automatische backups)\n\n## ⚙️ Configuratie Opties\n\n### Basis Configuratie\n\n```json\n{\n    \"exportRetentionCount\": 40,\n    \"cleanupOldExports\": true,\n    \"exportDirectory\": \"exports\",\n    \"archiveDirectory\": \"archive\",\n    \"autoOpenHtmlReport\": true,\n    \"lastSeenDaysFilter\": 0,\n    \"timezoneOffsetHours\": 2\n}\n```\n\n**Opties:**\n\n- `exportRetentionCount`: Aantal export bestanden om te bewaren (standaard: 40)\n- `cleanupOldExports`: Automatisch opruimen van oude exports (true/false)\n- `lastSeenDaysFilter`: Filter machines op laatste online tijd (0 = alle machines)\n- `autoOpenHtmlReport`: Automatisch openen van rapport in browser\n\n### Timezone Configuration\n\n```json\n{\n    \"timezoneOffsetHours\": 2\n}\n```\n\n**Opties:**\n\n- **Nederland (zomer)**: `2` (UTC+2)\n- **Nederland (winter)**: `1` (UTC+1)  \n- **UTC tijd**: `0`\n- **US Eastern**: `-5` (UTC-5)\n\n### KB Mapping Database\n\n```json\n{\n    \"kbMapping\": {\n        \"kbMappingUrl\": \"https://raw.githubusercontent.com/scns/Windows-Update-Report-MultiTenant/refs/heads/main/kb-mapping.json\",\n        \"timeoutSeconds\": 10,\n        \"cacheValidMinutes\": 30,\n        \"estimationThreshold\": 1000,\n        \"showEstimationLabels\": true,\n        \"fallbackToLocalMapping\": true,\n        \"estimationLabels\": {\n            \"buildDifference\": \"(geschat voor build {targetBuild})\",\n            \"noMapping\": \"(geschat)\",\n            \"oldMapping\": \"(verouderd)\"\n        }\n    }\n}\n```\n\n### Office Version Mapping\n\n```json\n{\n    \"officeMapping\": {\n        \"officeMappingUrl\": \"https://raw.githubusercontent.com/scns/Windows-Update-Report-MultiTenant/refs/heads/main/office-version-mapping.json\",\n        \"timeoutSeconds\": 10,\n        \"cacheValidMinutes\": 30,\n        \"fallbackToLocalMapping\": true\n    }\n}\n```\n\n### Backup System\n\n```json\n{\n    \"backup\": {\n        \"enableExportBackup\": true,\n        \"enableArchiveBackup\": true,\n        \"enableConfigBackup\": true,\n        \"exportBackupRetention\": 5,\n        \"archiveBackupRetention\": 5,\n        \"configBackupRetention\": 5,\n        \"backupRoot\": \"backup\",\n        \"exportBackupSubfolder\": \"export_backup\",\n        \"archiveBackupSubfolder\": \"archive_backup\",\n        \"configBackupSubfolder\": \"config_backup\"\n    }\n}\n```\n\n**Backup Types:**\n\n- **Export Backup**: Dagelijkse backup van alle CSV exports\n- **Archive Backup**: Backup van gearchiveerde bestanden  \n- **Config Backup**: Backup van config.json, credentials.json, kb-mapping.json\n\n### Theme Configuration\n\n```json\n{\n    \"theme\": {\n        \"default\": \"dark\"\n    }\n}\n```\n\n**Opties:**\n\n- `\"light\"`: Light theme als standaard\n- `\"dark\"`: Dark theme als standaard\n\n## 📁 Bestandsstructuur\n\n```text\nWindows-Update-Report-MultiTenant/\n├── get-windows-update-report.ps1    # Hoofd PowerShell script\n├── config.json                      # Configuratie instellingen\n├── credentials.json                  # Tenant credentials (exclusief git)\n├── kb-mapping.json                   # Lokale KB mapping database\n├── exports/                          # Gegenereerde rapporten\n├── archive/                          # Gearchiveerde oude exports\n├── backup/                           # Automatische backups\n├── images/                           # Dashboard screenshots\n├── CONFIG-UITLEG.md                  # Gedetailleerde configuratie uitleg\n├── KB-CACHING-INFO.md               # KB caching documentatie\n├── SECURITY.md                       # Beveiligingsbeleid\n├── CONTRIBUTING.md                   # Contributie richtlijnen\n└── CODE_OF_CONDUCT.md               # Gedragscode\n```\n\n## 🔧 Troubleshooting\n\n### Permissions Errors\n\n- Controleer of alle vereiste API permissions zijn toegekend\n- Zorg ervoor dat permissions zijn \"granted\" door een admin\n- Controleer client secret geldigheid\n\n### Timezone Issues\n\n- Pas `timezoneOffsetHours` aan in config.json\n- Check of LastSeen tijden correct worden weergegeven\n- Gebruik UTC offset voor uw tijdzone\n\n### Cache Problems\n\n- KB mapping cache wordt automatisch ververst na 30 minuten\n- Bij problemen: verwijder `Global:CachedKBMapping` variabele\n- Check internet connectiviteit voor online KB database\n\n### Compliance Data Missing\n\n- Zorg ervoor dat `DeviceManagementConfiguration.Read.All` permission is toegekend\n- Controleer of devices enrolled zijn in Intune\n- Fallback naar \"Geen data\" status is normaal voor niet-managed devices\n\n## 📚 Documentatie Links\n\n- **[Configuratie Uitleg](CONFIG-UITLEG.md)** - Gedetailleerde uitleg van alle config opties\n- **[Credentials Setup](CREDENTIALS-SETUP.md)** - Stap-voor-stap Azure App Registration setup\n- **[KB Caching Info](KB-CACHING-INFO.md)** - KB mapping cache configuratie en troubleshooting\n- **[Security Policy](SECURITY.md)** - Beveiligingsbeleid en kwetsbaarheid rapportage\n- **[Contributing Guidelines](CONTRIBUTING.md)** - Richtlijnen voor bijdragen aan het project\n- **[Code of Conduct](CODE_OF_CONDUCT.md)** - Gedragscode voor contributors\n\n## 🤝 Contributing\n\nBijdragen zijn welkom! Zie [CONTRIBUTING.md](CONTRIBUTING.md) voor richtlijnen.\n\n## 📄 License\n\nDit project valt onder de [MIT License](LICENSE).\n\n## 🔒 Security\n\nVoor beveiligingsgerelateerde zaken, zie [SECURITY.md](SECURITY.md).\n\n## 📞 Support\n\n- **Issues**: [GitHub Issues](https://github.com/scns/Windows-Update-Report-MultiTenant/issues)\n- **Email**: [info@maarten-schmeitz.nl](mailto:info@maarten-schmeitz.nl)\n- **Documentation**: Zie de bijgevoegde MD bestanden voor gedetailleerde informatie\n\n---\n\n**Versie**: 3.0 | **Laatste Update**: Augustus 2025 | **PowerShell**: 7.2+ | **Microsoft Graph**: v1.0 \u0026 Beta\n\n## Benodigdheden\n\n- PowerShell 7.2+\n- Microsoft Graph PowerShell SDK (wordt automatisch geïnstalleerd)\n- Een Azure AD App Registration per tenant met de juiste permissies\n\n## Voorbereiding\n\n### 1. Maak een Azure AD App Registration aan\n\n1. Ga naar [Azure Portal - App registrations](https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps).\n2. Klik op **New registration** en geef de app een naam.\n3. Na het aanmaken, ga naar **API permissions**.\n4. **Verwijder alle standaard toegevoegde permissies** (zoals `User.Read`).\n5. Voeg de volgende Microsoft Graph **Application** permissies toe:\n\n#### Voor optimale functionaliteit (aanbevolen)\n\n- `DeviceManagementManagedDevices.Read.All` - Voor gedetailleerde Windows Update informatie\n- `ThreatHunting.Read.All` - Voor fallback functionaliteit\n- `Application.Read.All` - Voor App Registration geldigheid monitoring\n\n#### Minimale vereisten (fallback functionaliteit)\n\n- `ThreatHunting.Read.All` - Voor basis Windows Update informatie\n- `Application.Read.All` - Voor App Registration geldigheid monitoring\n\n1. Klik op **Grant admin consent** voor deze permissies.\n2. Ga naar **Certificates \u0026 secrets** en maak een nieuwe client secret aan. Noteer deze waarde direct.\n\n\u003e **💡 Tip**: Met `DeviceManagementManagedDevices.Read.All` krijg je specifieke KB nummers en gedetailleerde update informatie. Zonder deze permissie valt het script terug op basis functionaliteit via de Threat Hunting API.\n\n### 2. Configureer het project\n\n#### Credentials bestand\n\n**Voor nieuwe installaties:**\n\n1. Hernoem `_credentials.json` naar `credentials.json`\n2. Vul de juiste waarden in voor je tenants\n\n**Voor bestaande installaties:**\n\n- Je bestaande `credentials.json` blijft werken zoals het is\n- Geen wijzigingen nodig\n\nHet `credentials.json` bestand heeft het volgende format:\n\n```json\n{\n  \"LoginCredentials\": [\n    {\n      \"ClientID\": \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\n      \"Secret\": \"YOUR-CLIENT-SECRET\",\n      \"TenantID\": \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\n      \"customername\": \"KlantNaam\",\n      \"color\": \"#1f77b4\"\n    }\n    // Voeg meer tenants toe indien nodig\n  ]\n}\n```\n\n**color**: Geef per klant een vaste HTML kleurcode op (hex, bijvoorbeeld `#1f77b4`). Deze kleur wordt gebruikt in de grafieken van het HTML-dashboard.\n\n#### Configuratie bestand\n\n**Voor nieuwe installaties:**\n\n1. Hernoem `_config.json` naar `config.json`\n2. Pas de instellingen aan naar jouw behoeften\n\n**Voor bestaande installaties:**\n\n- Als je al een `config.json` hebt, voeg eventueel ontbrekende opties toe\n- Vergelijk met `_config.json` om te zien welke nieuwe opties beschikbaar zijn\n\nHet `config.json` bestand bevat alle instellingen:\n\n```json\n{\n  \"exportRetentionCount\": 40,\n  \"cleanupOldExports\": true,\n  \"exportDirectory\": \"exports\",\n  \"archiveDirectory\": \"archive\",\n  \"autoOpenHtmlReport\": true,\n  \"lastSeenDaysFilter\": 0,\n  \"kbMapping\": {\n    \"kbMappingUrl\": \"https://mrtn.blog/wp-content/uploads/2025/08/kb-mapping.json\",\n    \"timeoutSeconds\": 10,\n    \"cacheValidMinutes\": 30,\n    \"estimationThreshold\": 1000,\n    \"showEstimationLabels\": true,\n    \"fallbackToLocalMapping\": true,\n    \"estimationLabels\": {\n      \"buildDifference\": \"(geschat voor build {targetBuild})\",\n      \"noMapping\": \"(geschat)\",\n      \"oldMapping\": \"(verouderd)\"\n    }\n  },\n  \"theme\": {\n    \"default\": \"dark\"\n  }\n}\n```\n\n**Configuratie opties:**\n\n- `exportRetentionCount`: Aantal export bestanden dat behouden blijft per klant/type (oudere worden gearchiveerd)\n- `cleanupOldExports`: Schakel automatische archivering in/uit (true/false)\n- `exportDirectory`: Directory waar nieuwe export bestanden worden opgeslagen\n- `archiveDirectory`: Directory waar oude export bestanden worden gearchiveerd\n- `autoOpenHtmlReport`: Automatisch openen van HTML-rapport in webbrowser (true/false)\n- `lastSeenDaysFilter`: Filtert de rapportage op basis van het aantal dagen sinds een device voor het laatst gezien is\n- `kbMapping.kbMappingUrl`: URL naar online KB mapping database\n- `kbMapping.timeoutSeconds`: Timeout voor online KB database requests (standaard: 10)\n- `kbMapping.cacheValidMinutes`: Cache geldigheid in minuten (standaard: 30)\n- `kbMapping.estimationThreshold`: Build verschil drempel voor KB estimaties\n- `kbMapping.showEstimationLabels`: Toon labels voor geschatte KB nummers\n- `kbMapping.fallbackToLocalMapping`: Gebruik lokale mapping als fallback\n- `officeMapping.officeMappingUrl`: URL naar online Office version mapping database\n- `officeMapping.timeoutSeconds`: Timeout voor online Office mapping requests (standaard: 10)\n- `officeMapping.cacheValidMinutes`: Cache geldigheid in minuten (standaard: 30)\n- `officeMapping.fallbackToLocalMapping`: Gebruik lokale Office mapping als fallback\n- `theme.default`: Standaard thema voor het dashboard (\"dark\" of \"light\")\n\n\u003e 📖 **Gedetailleerde configuratie uitleg**: Voor uitgebreide informatie over elke configuratie optie, zie [CONFIG-UITLEG.md](CONFIG-UITLEG.md)\n\n### 3. Installeer benodigde PowerShell-modules\n\nDe benodigde modules worden automatisch geïnstalleerd bij het eerste gebruik van het script. Handmatige installatie is niet meer nodig.\n\n## Gebruik\n\n1. **Voor nieuwe installaties**: Hernoem `_credentials.json` naar `credentials.json` en `_config.json` naar `config.json`\n2. **Voor bestaande installaties**: Controleer of je `config.json` alle benodigde opties bevat (vergelijk met `_config.json`)\n3. Vul je tenant gegevens in het `credentials.json` bestand\n4. Pas de instellingen in `config.json` aan naar jouw behoeften\n5. Start het script:\n\n```powershell\n.\\get-windows-update-report.ps1\n```\n\n1. Het script zal:\n   - Automatisch benodigde modules installeren (indien nodig)\n   - App Registration geldigheid controleren per tenant\n   - Windows Update status ophalen via Device Management API (of fallback naar Threat Hunting API)\n   - OS versie analyse uitvoeren en verouderde builds detecteren\n   - Ontbrekende KB nummers identificeren voor machines met verouderde OS\n   - CSV-bestanden genereren per klant met gedetailleerde informatie\n   - Oude bestanden archiveren (indien geconfigureerd)\n   - Een HTML-dashboard genereren met filterbare tabellen en snelfilters\n   - Het rapport automatisch openen in je standaard webbrowser\n\n2. De resultaten vind je in de geconfigureerde export directory, inclusief het interactieve HTML-dashboard.\n\n## HTML Dashboard Functionaliteiten\n\n### 📊 **Overzichtstabellen per Klant**\n\n- **Filterbare DataTables**: Zoeken en sorteren op alle kolommen\n- **Update Status dropdown**: Directe filtering op specifieke statussen\n- **Snelfilter knoppen**: Kleurgecodeerde knoppen voor veelgebruikte filters\n- **Export functionaliteit**: Exporteer volledige of gefilterde resultaten naar CSV\n\n### 🎯 **Kolom Informatie**\n\n| Kolom | Beschrijving |\n|-------|-------------|\n| **Device** | Computer naam |\n| **Update Status** | Overall status (Up-to-date, Verouderde OS versie, etc.) |\n| **Missing Updates** | Specifieke KB nummers en update namen die ontbreken |\n| **Details** | Statusberichten en diagnostische informatie |\n| **OS Version** | Windows build versie |\n| **KB Method** | Bron van KB informatie (Online, Cache, ExpiredCache, Local, Estimated) |\n| **Count** | Binary indicator (0 = OK, 1 = aandacht vereist) |\n| **LastSeen** | Laatste synchronisatie datum |\n| **LoggedOnUsers** | Huidige gebruikers |\n\n### 🔍 **Filter Functionaliteiten**\n\n```html\n\u003c!-- Snelfilter knoppen --\u003e\n🔘 Alle statussen    🟢 Up-to-date    🟠 Verouderde OS    \n🔴 Handmatige controle    🔵 Waarschijnlijk up-to-date    🟣 Errors\n```\n\n### 📈 **Grafieken en Analyses**\n\n- **Count trend per dag**: Laat zien hoe de Windows Update situatie evolueert\n- **Per klant overzicht**: Vergelijk update status tussen verschillende tenants\n- **OS versie analyse**: Percentage verdeling van Windows builds\n\n### 🌙 **Thema Ondersteuning**\n\n- **Dark/Light mode toggle**: Schakel eenvoudig tussen donker en licht thema\n- **Configureerbare standaard**: Stel je voorkeur in via `config.json`\n- **Gebruiksvriendelijk**: FontAwesome iconen voor consistente weergave\n\n### 🗄️ **KB Mapping Database Dashboard**\n\nHet HTML-dashboard bevat een dedicated \"KB Mapping Database\" tabblad dat uitgebreide informatie toont over de KB mapping database:\n\n#### Database Status Overzicht\n\n- **Database Status**: ✅ Beschikbaar / ❌ Niet beschikbaar\n- **Bron Methode**: Online, Cache, ExpiredCache, Error, of Exception\n- **Totaal Entries**: Aantal beschikbare KB mappings in de database\n- **Laatste Update**: Timestamp van laatste cache refresh\n\n#### KB Mapping Tabel\n\n**Volledige database weergave** met filterbare/sorteerbare kolommen:\n\n- **Build Number**: Windows OS build nummer (bijv. 26100, 22631)\n- **KB Number**: Corresponderende KB update (bijv. KB5041585)\n- **Update Title**: Beschrijving van de update\n- **Release Date**: Officiële release datum van de update\n- **OS Version**: Windows versie categorie (Windows 11 24H2, Windows 10 22H2, Historical)\n\n#### Cache Intelligence Features\n\n- **Real-time status**: Toont huidige cache status en bron van informatie\n- **Performance metrics**: Zichtbaarheid in cache effectiviteit\n- **Fallback transparency**: Duidelijke indicatie wanneer fallback wordt gebruikt\n- **Historical data**: Toegang tot historische KB mappings per jaar\n\n## API Methodologie en Fallback\n\n### 🎯 **Primary Method: Device Management API**\n\n**Vereist**: `DeviceManagementManagedDevices.Read.All` permissie\n\n**Voordelen**:\n\n- Specifieke KB nummers van ontbrekende updates\n- Detailed compliance informatie  \n- Windows Update state tracking\n- Configuration policy violations\n\n**Voorbeeld output**:\n\n```text\nMissing Updates: \"2024-08 Cumulative Update voor Windows (KB5041585 of nieuwer)\"\nDetails: \"Windows Update status: Recent gesynchroniseerd, geen problemen\"\n```\n\n### 🔄 **Fallback Method: Threat Hunting API**\n\n**Vereist**: `ThreatHunting.Read.All` permissie\n\n**Gebruikt wanneer**:\n\n- Device Management API niet beschikbaar\n- Onvoldoende permissies voor Device Management\n- Tenant heeft geen Intune licenties\n\n**Output**:\n\n```text\nMissing Updates: (leeg - geen specifieke KB info beschikbaar)\nDetails: \"Windows Update status: Controleer handmatig - Device niet in Intune beheer\"\n```\n\n### 🧠 **Intelligente OS Analyse**\n\n**Voor alle scenarios**:\n\nOngeacht welke API gebruikt wordt, het script analyseert OS versies en:\n\n- Detecteert nieuwste Windows build in de omgeving\n- Identificeert machines met verouderde builds  \n- Suggereert specifieke KB updates voor bekende build verschillen\n- Geeft praktische aanbevelingen voor IT beheerders\n\n**Voorbeeld voor verouderde OS**:\n\n```text\nMissing Updates: \"Waarschijnlijk ontbrekende cumulative update (build verschil: 294); 2024-08 Cumulative Update voor Windows (KB5041585 of nieuwer)\"\nUpdate Status: \"Verouderde OS versie\"\n```\n\n## Bestandsstructuur\n\n### Template bestanden (meegeleverd)\n\n```text\nWindows-Update-Report-MultiTenant/\n├── _credentials.json     # Template voor credentials (hernoem naar credentials.json)\n├── _config.json         # Template voor configuratie (hernoem naar config.json)\n├── CONFIG-UITLEG.md     # Gedetailleerde configuratie uitleg\n├── get-windows-update-report.ps1\n└── readme.md\n```\n\n### Na configuratie en uitvoering\n\n```text\nWindows-Update-Report-MultiTenant/\n├── _credentials.json     # Template bestand (blijft bestaan)\n├── _config.json         # Template bestand (blijft bestaan)\n├── credentials.json     # Jouw tenant configuratie\n├── config.json          # Jouw instellingen\n├── CONFIG-UITLEG.md\n├── get-windows-update-report.ps1\n├── exports/             # Configureerbare export directory\n│   ├── 20250822_KlantA_Windows_Update_report_Overview.csv\n│   ├── 20250822_KlantA_Windows_Update_report_ByUpdate.csv\n│   ├── 20250822_KlantB_Windows_Update_report_Overview.csv\n│   ├── 20250822_KlantB_Windows_Update_report_ByUpdate.csv\n│   └── Windows_Update_Overview.html\n└── archive/             # Oude bestanden worden hier gearchiveerd\n    ├── 20250821_KlantA_Windows_Update_report_Overview.csv\n    └── ... (oudere bestanden)\n```\n\n## Nieuwe functies in v3.0\n\n### 🎯 **KB Detection \u0026 Update Intelligence**\n\n- **Specifieke KB nummers**: Identificeert ontbrekende updates zoals KB5041585\n- **Build gap analyse**: Analyseert verschil tussen huidige en nieuwste OS builds\n- **Smart suggestions**: Geeft praktische aanbevelingen op basis van build verschillen\n- **Multiple API support**: Device Management API met Threat Hunting fallback\n\n### 🗂️ **KnowledgeBase Mapping Database \u0026 Intelligent Caching**\n\n- **Online KB database**: Uitgebreide externe database met Windows Update KB mappings\n- **Intelligent caching**: Downloads database eenmalig per sessie, cached voor 30 minuten (configureerbaar)\n- **Performance optimalisatie**: Vermindert server load met 95%+ door slim cache beheer\n- **Fallback mechanisme**: Gebruikt expired cache bij netwerk problemen voor maximale betrouwbaarheid\n- **Cache transparantie**: KB Method kolom toont bron van elke KB lookup (Online/Cache/ExpiredCache/Local/Estimated)\n- **Multi-platform database**: Ondersteunt Windows 10, Windows 11, en historische versies met 27+ KB mappings\n\n- **Update Status dropdown**: Vervang tekstfilter met dropdown voor exacte filtering\n- **Snelfilter knoppen**: Kleurgecodeerde knoppen voor directe access tot veelgebruikte filters\n- **Synchronized filtering**: Dropdown en snelfilters werken samen voor optimale UX\n- **Filter persistence**: Behoud filter instellingen tijdens sessie\n\n### 📊 **Enhanced Data Presentation**\n\n- **Separated columns**: \"Missing Updates\" voor KB nummers, \"Details\" voor statusberichten\n- **Improved Count logic**: Binary indicator (0/1) voor duidelijke status indicatie\n- **OS version analysis**: Percentage breakdown van Windows builds in omgeving\n- **Status categorization**: Duidelijke update status categorieën voor betere insights\n\n## Backup functionaliteit\n\nHet script ondersteunt automatische back-ups van exports, archief en configuratiebestanden:\n\n- **Export back-up**: Maakt een zip-bestand van de exports directory\n- **Archief back-up**: Maakt een zip-bestand van de archive directory\n- **Config back-up**: Maakt een zip-bestand van config.json en credentials.json\n- **Retentie**: Het aantal te bewaren back-ups is instelbaar per type\n- **Configuratie**: Alle paden en instellingen zijn te beheren via `config.json`\n\n### Configuratie opties\n\nIn het `config.json` bestand kun je per back-up type instellen of deze actief is en hoeveel back-ups bewaard blijven:\n\n```json\n\"backup\": {\n    \"enableExportBackup\": true,\n    \"enableArchiveBackup\": true,\n    \"enableConfigBackup\": true,\n    \"exportBackupRetention\": 5,\n    \"archiveBackupRetention\": 5,\n    \"configBackupRetention\": 5,\n    \"backupRoot\": \"backup\",\n    \"exportBackupSubfolder\": \"export_backup\",\n    \"archiveBackupSubfolder\": \"archive_backup\",\n    \"configBackupSubfolder\": \"config_backup\"\n}\n```\n\n## App Registration Status Dashboard\n\nHet HTML-dashboard bevat een speciaal \"App Registrations\" tabblad dat een overzicht toont van alle client secret vervaldatums:\n\n### App Registration Dashboard Functionaliteit\n\n- **Centraal overzicht**: Alle tenants en hun App Registration status in één tabel\n- **Status indicatoren**: Kleurgecodeerde waarschuwingen voor vervaldatums:\n  - 🟢 **Groen**: Meer dan 30 dagen geldig\n  - 🟠 **Oranje**: 7-30 dagen tot verval (waarschuwing)\n  - 🔴 **Rood**: Minder dan 7 dagen tot verval (kritiek) of geen toegang\n- **Gedetailleerde informatie**:\n  - Customer naam\n  - Status bericht\n  - Dagen tot verval\n  - Exacte vervaldatum (DD-MM-YYYY)\n- **Filterbare tabel**: Zoeken en sorteren op alle kolommen via DataTables\n- **Export functionaliteit**: Mogelijkheid tot CSV export van de status gegevens\n\n## Troubleshooting\n\n### ❌ **\"Device Management API niet beschikbaar\"**\n\n**Oorzaak**: Ontbrekende `DeviceManagementManagedDevices.Read.All` permissie of geen Intune licenties  \n**Oplossing**: Script valt automatisch terug op Threat Hunting API - geen actie vereist\n\n### ❌ **\"Geen geldige client secret gevonden\"**\n\n**Oorzaak**: Ontbrekende `Application.Read.All` permissie  \n**Oplossing**: Voeg permissie toe in Azure Portal en verleen admin consent\n\n### ❌ **Missing Updates kolom is leeg**\n\n**Oorzaak**: Machines zijn werkelijk up-to-date of gebruiken fallback API  \n**Verwachting**: Dit is normaal - machines met verouderde OS krijgen automatisch KB suggesties\n\n### ✅ **Permissie Verificatie**\n\nControleer in Azure Portal of je App Registration deze permissies heeft:\n\n- ✅ `DeviceManagementManagedDevices.Read.All` (voor KB nummers)\n- ✅ `ThreatHunting.Read.All` (voor fallback)  \n- ✅ `Application.Read.All` (voor App Registration monitoring)\n\n## Opmerkingen\n\n- Het script werkt optimaal met Device Management permissies, maar functioneert ook met alleen Threat Hunting permissies\n- KB nummers worden alleen getoond bij Device Management API toegang of bij gedetecteerde verouderde OS versies\n- Voor meer informatie over App Registrations, zie de [Microsoft Docs](https://learn.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app)\n- Het script ondersteunt zowel Windows 10 als Windows 11 omgevingen\n\n---\n\n© 2025 by Maarten Schmeitz\n\n[commits-shield]: https://img.shields.io/github/commit-activity/m/scns/Windows-Update-Report-MultiTenant.svg\n[commits]: https://github.com/scns/Windows-Update-Report-MultiTenant/commits/main\n[github-last-commit]: https://img.shields.io/github/last-commit/scns/Windows-Update-Report-MultiTenant.svg?style=plasticr\n[github-master]: https://github.com/scns/Windows-Update-Report-MultiTenant/commits/main\n[license-shield]: https://img.shields.io/github/license/scns/Windows-Update-Report-MultiTenant.svg\n[contributors-url]: https://github.com/scns/Windows-Update-Report-MultiTenant/graphs/contributors\n[contributors-shield]: https://img.shields.io/github/contributors/scns/Windows-Update-Report-MultiTenant.svg\n[forks-shield]: https://img.shields.io/github/forks/scns/Windows-Update-Report-MultiTenant.svg\n[forks-url]: https://github.com/scns/Windows-Update-Report-MultiTenant/network/members\n[stars-shield]: https://img.shields.io/github/stars/scns/Windows-Update-Report-MultiTenant.svg\n[stars-url]: https://github.com/scns/Windows-Update-Report-MultiTenant/stargazers\n[issues-shield]: https://img.shields.io/github/issues/scns/Windows-Update-Report-MultiTenant.svg\n[issues-url]: https://github.com/scns/Windows-Update-Report-MultiTenant/issues\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscns%2Fwindows-update-report-multitenant","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fscns%2Fwindows-update-report-multitenant","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscns%2Fwindows-update-report-multitenant/lists"}