A Python pipeline that converts the Microsoft WSUS offline scan catalog (wsusscn2.cab) into structured CSV outputs and Neo4j-ready import artifacts. It helps analyze Windows update metadata, dependency relationships, vulnerability fixes, product categories, and EULA metadata.
This repository parses the WSUS scan catalog and extracts:
- update metadata and release attributes from
package.xml - extended properties from
/x/files - titles, descriptions, and URLs from
/l/en/files - package and driver metadata from
/c/files - EULA metadata from
/e/files - relationships between updates, categories, KB articles, CVEs, and languages
It produces:
- normalized CSV files for a graph model
- a flattened CSV export for spreadsheet or data analysis
- a Neo4j import pipeline via
src/main.pythat copies CSV files into Neo4j's import directory and loads constraints, nodes, and relationships
This project is useful for developers, security analysts, and researchers who need to:
- analyze Windows patch metadata at scale
- explore update dependencies and bundle relationships
- map updates to CVEs and KB articles
- build a knowledge graph from WSUS offline catalog data
- avoid re-scanning the raw archive for repeated analysis
The diagram shows the core graph model used for WSUS data:
Updatenodes represent individual Windows updates and include metadata frompackage.xml,/x/,/l/en/, and/c/files.Categorynodes group updates by company, product family, product, and update classification.KBArticle,CVE,Eula,Language, andUpdateBehaviornodes capture related metadata and link back to updates.- Relationship edges such as
BELONGS_TO,HAS_KB,FIXES,HAS_EULA, andHAS_LANGUAGEexpress the catalog's semantic connections. - Some relationships carry important attributes:
BELONGS_TOusescompleteto distinguish full category assignments from partial/AtLeastOne matchesDEPENDS_ONusesis_orto preserve prerequisite logicHAS_EULAusesrequires_reacceptanceto flag EULA reacceptance requirements
- Python 3.12.10
pip- a local extraction of
wsusscn2.cab WSUS_DIRset to the extracted catalog root- optionally, Neo4j for graph imports
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txtPoint the pipeline to your extracted WSUS catalog folder.
Windows (PowerShell):
$env:WSUS_DIR = 'C:\path\to\wsusscn2'Windows (CMD):
set WSUS_DIR=C:\path\to\wsusscn2Linux/macOS:
export WSUS_DIR=/path/to/wsusscn2
wsusscn2.cabis not included in this repository. Download it from Microsoft and extract it locally before running the scripts.The repository expects the full WSUS catalog tree to be extracted under
WSUS_DIR, including nested CAB contents and folders such asx,l,c,e, andpackage.xml.
The parser uses index.json to locate WSUS files efficiently.
python src/parsing/build_index.pyIf category_registry.json is needed, generate or refresh it with:
python src/etl/explore_cat_names.pyGenerate node and relationship CSV files for Neo4j import:
python src/etl/export_csv.pyUpdate src/main.py to match your Neo4j connection settings and import path, then run:
python src/main.pyExplore a specific revision with src/tools/inspect_update.py, an interactive inspector that uses index.json to look up update metadata and localized text.
python src/tools/inspect_update.pyrequirements.txt— Python dependenciessrc/parsing/parser.py— WSUS XML parsing logicsrc/parsing/build_index.py— buildsindex.jsonsrc/etl/export_csv.py— exports graph CSV filessrc/etl/export_csv_unique.py— exports a flat CSV filesrc/etl/explore_cat_names.py— maps category IDs to namessrc/tools/inspect_update.py— interactive update inspectorsrc/main.py— copies exported CSV files into Neo4j's import directory and loads the graph modeldata/csv/— output location for generated CSV filesdocs/images/Model.png— graph model diagram
For issues or questions, use the repository issue tracker and read the source-level documentation in the script headers.
requirements.txtfor dependency detailssrc/parsing/parser.pyfor parsing behavior and model detailssrc/etl/export_csv.pyandsrc/etl/export_csv_unique.pyfor export workflowssrc/main.pyfor Neo4j import setup
