{"id":50861146,"url":"https://github.com/didimozg/windows-inventory-lite","last_synced_at":"2026-06-14T21:34:42.895Z","repository":{"id":363966636,"uuid":"1265761900","full_name":"didimozg/windows-inventory-lite","owner":"didimozg","description":"Standalone Windows inventory system. Collects OS, software, Office activation, and hardware data. No IIS, SQL Server, or Node.js required.","archived":false,"fork":false,"pushed_at":"2026-06-11T04:54:03.000Z","size":362,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-11T06:21:56.475Z","etag":null,"topics":["active-directory","csharp","dashboard","dotnet","gpo","inventory","monitoring","powershell","windows","winrm"],"latest_commit_sha":null,"homepage":null,"language":"C#","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/didimozg.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"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}},"created_at":"2026-06-11T04:02:50.000Z","updated_at":"2026-06-11T04:54:07.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/didimozg/windows-inventory-lite","commit_stats":null,"previous_names":["didimozg/windows-inventory-lite"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/didimozg/windows-inventory-lite","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/didimozg%2Fwindows-inventory-lite","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/didimozg%2Fwindows-inventory-lite/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/didimozg%2Fwindows-inventory-lite/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/didimozg%2Fwindows-inventory-lite/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/didimozg","download_url":"https://codeload.github.com/didimozg/windows-inventory-lite/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/didimozg%2Fwindows-inventory-lite/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34339195,"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-14T02:00:07.365Z","response_time":62,"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":["active-directory","csharp","dashboard","dotnet","gpo","inventory","monitoring","powershell","windows","winrm"],"created_at":"2026-06-14T21:34:38.456Z","updated_at":"2026-06-14T21:34:42.890Z","avatar_url":"https://github.com/didimozg.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Windows Inventory Lite\n\n[![Release](https://img.shields.io/github/v/release/didimozg/windows-inventory-lite?display_name=tag)](https://github.com/didimozg/windows-inventory-lite/releases)\n[![CI](https://github.com/didimozg/windows-inventory-lite/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/didimozg/windows-inventory-lite/actions/workflows/ci.yml)\n[![License](https://img.shields.io/github/license/didimozg/windows-inventory-lite)](./LICENSE)\n\n## Description\n\nWindows Inventory Lite is a lightweight inventory tool for small Windows networks where a full-scale asset management system would be excessive. It tracks installed software, basic hardware specs, OS version, and Office activation status across workstations and servers.\n\nThe client and server are small self-contained C# services that run on .NET Framework 3.5. The server can run on a Windows Server machine or on any regular Windows workstation — no IIS, SQL Server, Python, Node.js, or NuGet packages required. The client can be deployed to computers through WinRM directly from the dashboard, or via a GPO computer startup script.\n\n## Main Features\n\n- Client runs as a Windows Service on Windows 7, 8, 10, and 11.\n- Server runs as a Windows Service on Windows Server or desktop Windows.\n- Inventory data includes OS version, build, architecture, hardware vendor, model, serial number, IP addresses, Office version, activation facts, and installed software.\n- Hardware inventory covers CPU (model, core count, clock speed), RAM (module count, per-module capacity, manufacturer, speed, total capacity), and storage (type HDD/SSD, capacity, model). USB storage devices are flagged separately.\n- The dashboard has five views: Clients, Software, Hardware, Client actions, and Client package.\n- The Clients view shows per-computer hardware summary (CPU, RAM, storage) in the expandable detail row alongside the software list.\n- The Hardware view groups machines by CPU model, storage device, and RAM configuration.\n- All dashboard views support column sorting and CSV export with semicolon delimiter for direct opening in Excel.\n- The dashboard displays server version and client agent version.\n- Operators can delete stale or unwanted host records from the dashboard.\n- Operators can install, update, or uninstall clients from the dashboard through WinRM.\n- The Client package tab shows the deployed client exe versions and current CMD settings, lets operators reconfigure the server URL, ingestion token, and reporting interval, and provides a ZIP download of the complete GPO package.\n- GPO deployment scripts support initial install and later client updates.\n- GPO packages include separate .NET 3.5 and .NET 4 client builds to avoid .NET 3.5 prompts on newer Windows versions.\n- Optional Basic Auth protects the dashboard and web API.\n- Optional ingestion token restricts client report submission.\n\n## Architecture\n\n```mermaid\nflowchart LR\n    Client[Windows client service] --\u003e|POST /api/v1/inventory| Server[Windows server service]\n    Server --\u003e Store[(JSON report files)]\n    Browser[Administrator browser] --\u003e|Basic Auth| Server\n    Server --\u003e Dashboard[Embedded dashboard]\n    Server --\u003e|WinRM| Targets[Remote client hosts]\n    Package[(Client package\\n.exe + .cmd + .ps1)] --\u003e|GPO startup| Client\n    Server --\u003e Package\n    Browser --\u003e|ZIP download| Server\n```\n\nThe client collects data through WMI and registry reads. It writes a local JSON report under `ProgramData` and sends the same JSON to the server. The server stores one JSON file per computer name. The dashboard builds its views from those server-side report files.\n\nThe `Client actions` tab sends install, update, or uninstall commands to remote hosts over WinRM using the server-side client package. The `Client package` tab lets operators configure the package and download it as a ZIP for GPO deployment.\n\n## Requirements\n\nClient:\n\n- Windows 7, 8, 10, or 11\n- .NET Framework 3.5 or newer\n- Built-in Windows PowerShell for installer scripts\n- Network access to the server HTTP port\n\nServer:\n\n- Windows Server or desktop Windows\n- .NET Framework 3.5 or newer\n- Built-in Windows PowerShell for installer scripts\n- One TCP port for the standalone HTTP listener\n\nBuild host:\n\n- Windows with the local .NET Framework C# compiler\n- Windows PowerShell 5.1 or PowerShell 7 for build and install scripts\n\n## Build\n\nBuild the server:\n\n```powershell\n.\\src\\Build-Server.ps1\n```\n\nBuild the default client:\n\n```powershell\n.\\src\\Build-Client.ps1\n```\n\nBuild a GPO package with both client target frameworks:\n\n```powershell\n.\\src\\New-ClientGpoPackage.ps1 `\n    -ServerUrl 'http://inventory.example.local:8080/api/v1/inventory' `\n    -OutputPath '.\\dist\\gpo-client'\n```\n\nIf the `.cmd` startup wrapper lives in SYSVOL and the PowerShell script plus client executables live in another share, pass the package share path:\n\n```powershell\n.\\src\\New-ClientGpoPackage.ps1 `\n    -ServerUrl 'http://inventory.example.local:8080/api/v1/inventory' `\n    -OutputPath '.\\dist\\gpo-client' `\n    -PackageSharePath '\\\\fileserver.example.local\\software\\windows-inventory-lite'\n```\n\nAfter the server is installed, the server URL, ingestion token, and reporting interval in `Install-ClientGpo.cmd` can be updated from the dashboard `Client package` tab without rebuilding. The tab also generates a ZIP download of the complete package.\n\n## Server Installation\n\nInstall the server from an elevated PowerShell session:\n\n```powershell\n.\\src\\Install-Server.ps1 -ListenPrefix 'http://+:8080/' -OpenFirewall\n```\n\nInstall the server with Basic Auth:\n\n```powershell\n.\\src\\Install-Server.ps1 `\n    -ListenPrefix 'http://+:8080/' `\n    -OpenFirewall `\n    -WebUsername 'inventory-admin' `\n    -WebPassword 'replace-with-a-strong-password'\n```\n\nThe installer writes `C:\\ProgramData\\WindowsInventoryLite\\server-config.json`. Later updates reuse saved `ListenPrefix`, paths, `Token`, `WebUsername`, and `WebPassword` when you do not pass new values.\n\nDashboard URL:\n\n```text\nhttp://inventory.example.local:8080/\n```\n\n## Client Installation\n\nInstall one client from an elevated PowerShell session:\n\n```powershell\n.\\src\\Install-Client.ps1 `\n    -ServerUrl 'http://inventory.example.local:8080/api/v1/inventory' `\n    -IntervalHours 6\n```\n\nRun one local collection without installing the service:\n\n```powershell\n.\\src\\Collect-WindowsInventoryLite.ps1 -OutputPath '.\\output\\localhost.json'\n```\n\nRun one collection through the compiled client:\n\n```powershell\n.\\build\\WindowsInventoryLiteClient.exe `\n    --once `\n    --server-url 'http://inventory.example.local:8080/api/v1/inventory'\n```\n\n## GPO Deployment\n\nUse a computer startup script, not a user logon script. The deploy script creates or updates a Windows Service and needs local administrator rights. Computer startup scripts run in the machine context and can manage services.\n\nDeployment flow:\n\n1. Build the package with `New-ClientGpoPackage.ps1`.\n2. Copy the package to a computer-readable share.\n3. Grant target computer accounts read access to the package files.\n4. Grant target computer accounts read access to the package share.\n5. Add `Install-ClientGpo.cmd` as a GPO computer startup script.\n6. Reboot target computers or wait for the next startup script run.\n\nThe deploy script writes a local log to `C:\\ProgramData\\WindowsInventoryLite\\Logs\\gpo-deploy.log`.\nCentral logging to the package share is present in the script as commented code and is disabled by default.\n\nFor updates, replace the package files in the share. The deploy script compares the packaged client version with the installed version and skips clients that already match.\n\n## Forced Client Actions Through WinRM\n\nThe dashboard `Client actions` tab can install, update, or uninstall the client on a single host, a list of hosts, a single IP address, or a simple IPv4 range such as `192.0.2.10-192.0.2.20`.\n\nRequirements:\n\n- WinRM enabled on target computers.\n- The server service account must have administrator rights on target computers.\n- The server service account must be allowed to connect through WinRM.\n- The server must have a local client package with `Deploy-ClientGpo.ps1`, `WindowsInventoryLiteClient-net35.exe`, and `WindowsInventoryLiteClient-net40.exe`.\n\nWhen targets are IP addresses, Windows cannot use the default Kerberos path. Use one of these options:\n\n- Use DNS computer names instead of IP addresses.\n- Use HTTPS WinRM.\n- Enter explicit WinRM credentials in the dashboard and enable `Add to TrustedHosts`.\n\nBuild the client package before installing or updating the server:\n\n```powershell\n.\\src\\New-ClientGpoPackage.ps1 `\n    -ServerUrl 'http://inventory.example.local:8080/api/v1/inventory' `\n    -OutputPath '.\\dist\\gpo-client'\n```\n\n`Install-Server.ps1` copies `.\\dist\\gpo-client` to `C:\\ProgramData\\WindowsInventoryLite\\client-package` when the folder exists. You can also pass `-ClientPackageSourcePath` and `-ClientPackagePath`.\n\nAfter installation, the dashboard `Client package` tab can reconfigure the server URL, ingestion token, and reporting interval in `Install-ClientGpo.cmd` without running a new build.\n\nIf the server service runs as LocalSystem, WinRM installation to remote computers usually fails. Run the service under a domain account with the required local administrator rights, or use a managed service account with equivalent permissions.\nDo not send WinRM passwords through the dashboard over plain HTTP outside a trusted management network.\n\nThe server stores WinRM job logs in `DataPath\\_client-install-jobs`. The default retention period is 30 days. Set a different default during server installation:\n\n```powershell\n.\\src\\Install-Server.ps1 `\n    -ListenPrefix 'http://+:8080/' `\n    -InstallLogRetentionDays 60\n```\n\nThe `Client actions` tab also lets you set the retention period for a specific job. Saved logs contain the action, targets, status, command output, errors, timestamps, and the WinRM username. Passwords are not written to log files.\n\n## Dashboard Usage\n\nThe dashboard has five views:\n\n- `Clients`: one row per computer, with OS, Office, activation status, software count, report time, and client agent version. Computers with USB storage devices show a USB badge. Click a computer name to expand the detail row with CPU, RAM, storage summary, and the full software list.\n- `Software`: one row per software name, version, and publisher, with the count of installations and the computers where the package appears.\n- `Hardware`: three grouped tables. CPUs groups machines by processor model. Storage groups machines by disk model, type, and size. RAM groups by total memory and module count. Click any row to expand the list of machines with that configuration. USB storage rows are highlighted.\n- `Client actions`: WinRM actions for installing, updating, or uninstalling the client on a single host, a list of hosts, or an IPv4 range.\n- `Client package`: shows deployed client exe versions and the current CMD settings. Lets you update the server URL, ingestion token, and reporting interval, and download the complete GPO package as a ZIP.\n\nEach view has sortable columns. Click a column header to sort ascending; click again to reverse. Click a software or hardware group name to expand the per-computer list.\n\nEach view has an `Export CSV` button. The exported file uses semicolon as the delimiter and a UTF-8 BOM for direct opening in Excel on a Russian or European locale. The export applies the current search filter and the active sort order.\n\nDeleting a host from the dashboard removes the server-side JSON report for that host. If the client service still runs and can reach the server, the host reappears after the next sync.\n\n`Stale \u003e48h` counts reports older than 48 hours or reports with an invalid timestamp.\n\n## Screenshots\n\nThe screenshots below use sample hostnames, documentation IP ranges, and placeholder domains.\n\n![Clients dashboard](./docs/images/dashboard-clients.png)\n\n![Software dashboard](./docs/images/dashboard-software.png)\n\n![Hardware dashboard](./docs/images/dashboard-hardware.png)\n\n![Client actions dashboard](./docs/images/dashboard-client-actions.png)\n\n![Client package dashboard](./docs/images/dashboard-client-package.png)\n\n## Configuration\n\n- `ServerUrl`: HTTP endpoint that receives client JSON files.\n- `IntervalHours`: client collection interval from 1 to 24 hours.\n- `ListenPrefix`: server HTTP listener prefix, for example `http://+:8080/`.\n- `DataPath`: server folder for received JSON files.\n- `ContentPath`: server folder for dashboard HTML, CSS, and JavaScript.\n- `ConfigPath`: server configuration file. Default: `C:\\ProgramData\\WindowsInventoryLite\\server-config.json`.\n- `InstallLogRetentionDays`: default retention period for WinRM client action logs. Default: `30`.\n- `Token`: optional shared token sent in `X-Inventory-Token`.\n- `WebUsername` and `WebPassword`: optional Basic Auth credentials for dashboard and web API access.\n\n## Security Notes\n\n- The collector stores activation facts only. It does not export product keys.\n- Basic Auth protects browser access, but plain HTTP does not encrypt credentials. Use HTTPS termination or restrict access to trusted management networks.\n- Use `-Token`, firewall rules, and network ACLs to limit who can submit inventory reports.\n- Do not place a sensitive token in a broadly readable SYSVOL script. For GPO deployments, prefer firewall scope or a low-sensitivity ingestion token.\n- If you enable the commented central GPO logging block, limit write access to that log folder to the required computer accounts.\n- Review [docs/threat-model.md](./docs/threat-model.md) before exposing the server outside a management network.\n\n## Uninstall\n\nRemove the client service and local client files:\n\n```powershell\n.\\src\\Uninstall-Client.ps1\n```\n\n## Project Layout\n\n- `src/`: collector, build scripts, install scripts, and service source code.\n- `src/client/`: standalone C# Windows Service client.\n- `src/server/`: standalone C# Windows Service server and embedded dashboard.\n- `deploy/client/`: GPO startup deployment script and command wrapper.\n- `server/dashboard/`: static dashboard files copied by the server installer.\n- `docs/`: threat model and operational security notes.\n- `examples/`: example install and one-shot commands.\n- `tests/`: syntax and language checks.\n\n## License\n\n[MIT License](./LICENSE). Copyright (c) 2026 didimozg.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdidimozg%2Fwindows-inventory-lite","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdidimozg%2Fwindows-inventory-lite","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdidimozg%2Fwindows-inventory-lite/lists"}