Repository navigation
Modules
Ten collection modules. Each one has an osquery query pack, a processor and a
model, and each contributes one object to the payload. Run one with
--run-module <id>, several with --run-modules a,b,c, or all of them by
running the agent with no module filter.
| Id | Collects | Query pack |
|---|---|---|
inventory |
Device identity — serial, UUID, name, asset metadata | 2 queries |
system |
OS version, activation, updates, services, scheduled tasks | 22 queries |
hardware |
CPU, memory, storage, graphics, displays, battery, radios | 55 queries |
network |
Interfaces, DNS, NetBIOS, routes, wireless, VPN, throughput | 12 queries |
security |
Defender, firewall, BitLocker, TPM, Secure Boot, certificates, detections | 20 queries |
identity |
Local and directory accounts, join state, sign-in history, Hello | 15 queries |
management |
MDM enrolment, policy, configuration profiles, managed apps, management tool logs | 21 queries |
applications |
Installed software, processes, startup items, usage | 3 queries |
installs |
Managed-software state from the Cimian install tool | 17 queries |
peripherals |
USB, Bluetooth, printers, displays, audio, input, storage | 19 queries |
Which modules run on which schedule is in Installation.
Every example below is hand-authored and trimmed. The device in them is
WS-0001 at example.com.
Most property names are not declared by hand. Apart from the peripherals
model, the Cimian session records in installs and two usage fields in
applications, the models carry no [JsonPropertyName] attributes — the
serializer's camelCase naming policy derives the JSON name from the C#
property. That is why you see
totalPhysical, scopeID (only the first character is lowered) and uuid
(a leading acronym run lowercases wholesale).
Every module object also carries four fields from the common base:
{
"moduleId": "system",
"moduleVersion": "2026.02.11.1043",
"collectedAt": "2026-03-04T09:14:22Z",
"deviceId": "11111111-2222-4333-8444-555555555555"
}They are omitted from the examples below for brevity.
A recurring pattern: osquery is used to find and stat things quickly, and where osquery cannot see something as SYSTEM, or does not model it at all, the processor falls back to WMI, a PowerShell cmdlet or a direct registry read. Several modules define queries that are collected but not currently consumed; those are noted where they matter.
The device's identity. Everything else in ReportMate is keyed off what this module produces, so it is also the module that can fail a run outright.
osquery — system_info (hostname, computer name, hardware serial, UUID) and
a second projection of the same table for model and vendor.
Other sources — WMI Win32_BIOS.SerialNumber and
Win32_SystemEnclosure.SerialNumber when osquery has no usable serial;
HKLM\SOFTWARE\Microsoft\Cryptography\MachineGuid;
Win32_Processor.ProcessorId and Win32_BaseBoard.SerialNumber via WMI;
Environment.MachineName. If a site inventory file exists at
C:\ProgramData\Management\Inventory.yaml, a small line-prefix parser reads
allocation, catalog, area, location, usage, username, asset and
fleet from it to fill the asset fields. That file is optional and is not
produced by ReportMate.
{
"deviceName": "WS-0001",
"serialNumber": "EXAMPLE-SERIAL",
"assetTag": "AST-4417",
"uuid": "11111111-2222-4333-8444-555555555555",
"location": "Building A",
"owner": "jdoe",
"department": "Design",
"catalog": "standard",
"usage": "shared",
"fleet": "workstations",
"purchaseDate": null,
"warrantyExpiration": null
}Behaviour worth knowing
- The serial is mandatory. It is taken from osquery
system_info, thenchassis_infowhen present, then the WMI BIOS serial, then the WMI enclosure serial, so a device without a working osquery still reports. SMBIOS placeholders (0,System Serial Number,To be filled by O.E.M.,Default string,None,Not Specified, anything starting00000000) are rejected, and the module throws rather than substituting the hostname. Default Windows hostname prefixes such asWIN-andDESKTOP-are stripped when firmware puts one in front of the serial. - The UUID is resolved in order: osquery
system_info.uuid(rejecting the all-zero GUID), thenMachineGuid, then a SHA-256 fingerprint of the CPU id joined with the baseboard serial. -
purchaseDateandwarrantyExpirationexist in the model but are never populated by the Windows client.
Operating system identity, licensing, patch state and the things Windows schedules or runs.
osquery — os_version, uptime, system_info, services,
default_environment, patches, scheduled_tasks, logged_in_users,
windows_crashes, windows_events, time, plus a dozen registry queries
covering Windows NT\CurrentVersion (EditionID, ProductName, UBR,
CurrentBuild, DisplayVersion, ReleaseId, BuildLab), SYSTEM\Setup
source-OS markers, NLS language and locale, the time zone key, the Feature
Experience Pack, and per-user keyboard layouts joined against
logged_in_users.
Other sources — the Windows Update Agent COM API
(Microsoft.Update.Session → CreateUpdateSearcher → Search('IsInstalled=0'))
for pending updates; Get-CimInstance SoftwareLicensingService plus
slmgr.vbs /dli for activation; Microsoft.Win32.Registry.CurrentUser for a
keyboard-layout fallback. Two small state files under cache\
(previous_os_version.json, previous_boot_time.json) let the module detect
change between runs.
{
"operatingSystem": {
"name": "Windows 11",
"architecture": "64-bit",
"displayVersion": "24H2",
"version": "10.0.26100",
"build": "26100",
"major": 10, "minor": 0, "patch": 26100,
"installDate": "2025-11-02T18:44:00Z",
"locale": "en-CA",
"timeZone": "Pacific Standard Time",
"edition": "Enterprise",
"featureUpdate": "3775.0",
"keyboardLayouts": ["English (Canada)"],
"activeKeyboardLayout": "English (Canada)",
"lastInPlaceUpgrade": null,
"inPlaceUpgradeCount": 0,
"activation": {
"isActivated": true,
"status": "Licensed",
"statusCode": 1,
"partialProductKey": "XXXXX",
"licenseType": "Volume",
"hasFirmwareLicense": true,
"firmwareEdition": "Professional OEM",
"licenseSource": "KMS"
}
},
"updates": [
{ "id": "KB5000001", "title": "Cumulative Update", "category": "Windows Update",
"installDate": "2026-02-18T00:00:00Z", "releaseDate": null,
"status": "", "requiresRestart": false }
],
"pendingWindowsUpdates": [
{ "title": "Cumulative Update Preview", "kbNumber": "KB5000002",
"category": "Security Updates", "severity": "Important",
"description": "Addresses security issues.", "cves": ["CVE-2026-0001"],
"isMandatory": true, "isDownloaded": false, "rebootRequired": true,
"releaseDate": "2026-03-01T00:00:00Z" }
],
"pendingWindowsUpdatesCount": 1,
"services": [
{ "name": "Spooler", "displayName": "Print Spooler", "status": "RUNNING",
"startType": "AUTO_START", "path": "C:\\Windows\\System32\\spoolsv.exe",
"description": "Loads files to memory for later printing." }
],
"environment": [ { "name": "NUMBER_OF_PROCESSORS", "value": "16", "scope": "" } ],
"scheduledTasks": [
{ "name": "ReportMate Hourly Collection", "path": "\\ReportMate Hourly Collection",
"enabled": true, "hidden": true, "state": "Ready", "status": "Ready",
"action": "C:\\Program Files\\ReportMate\\managedreportsrunner.exe",
"lastRunTime": "2026-03-04T08:37:11Z", "nextRunTime": "2026-03-04T09:41:00Z",
"lastRunCode": "0", "lastRunMessage": "" }
],
"lastBootTime": "2026-03-02T04:31:07Z",
"uptime": "1.04:43:15",
"uptimeString": "1d, 4h"
}Behaviour worth knowing
- Activation deliberately uses
slmgr.vbsrather than theSoftwareLicensingProductCIM class, which measured roughly a hundred times slower. A firmware licence is only counted for Professional, Enterprise, Education or Pro editions. -
activation.licenseSourceis one ofFirmware,GVLK,KMS,ADBA,MAK,Retail,Volume,UnavailableorUnknown. A volume client key is resolved further from the most recent activation block:ADBAfor Active Directory-based activation,KMSfor a KMS host. The difference matters when a device leaves the domain, because AD-based activation stops renewing at once. - When the licensing service is stopping (
0xC004F075),slmgris retried; if it still cannot answer,licenseSourceisUnavailablerather than a guess. - In-place upgrades are counted from
Source OS (Updated on …)subkeys underHKLM\SYSTEM\SETUP. Zero markers means the recorded install date is a real clean install. - The module emits change events: an
os_updateevent whendisplayVersionmoves, and a reboot event when boot time shifts by more than 60 seconds. - osquery duplicates the directory prefix in a scheduled task's action string; the processor works around it.
The physical machine. This is the largest module, and the only one with a per-run performance mode.
osquery — system_info, cpu_info, memory_devices, disk_info,
logical_drives, video_info, battery, interface_details, drivers,
physical_disk_performance, several file queries for the storage walk, and
around thirty registry queries covering the CPU description keys, the display
and network adapter class GUIDs, the Bluetooth radio class, and NPU device
properties.
Other sources — WMI Win32_ComputerSystem, Win32_PhysicalMemory,
Win32_VideoController. PowerShell Get-CimInstance Win32_VideoController,
Get-Partition, Get-PhysicalDisk, Get-NetAdapter,
Get-NetAdapterAdvancedProperty, Get-PnpDevice, Get-WmiObject Win32_PnPSignedDriver, and a directory-walk helper built on
System.IO.Directory that skips reparse points. Displays come from the
root\wmi classes WmiMonitorID, WmiMonitorConnectionParams,
WmiMonitorListedSupportedSourceModes and WmiMonitorBasicDisplayParams.
{
"manufacturer": "Acme",
"model": "Workstation 5000",
"processor": {
"name": "Model 7 4400", "manufacturer": "GenuineIntel",
"cores": 8, "logicalProcessors": 16, "architecture": "x64",
"baseSpeed": 3.2, "maxSpeed": 4.8, "socket": "U3E1"
},
"memory": {
"totalPhysical": 34359738368,
"availablePhysical": 8589934592,
"totalVirtual": 68719476736,
"availableVirtual": 34359738368,
"modules": [
{ "manufacturer": "Acme", "capacity": 17179869184, "type": "DDR5",
"speed": 5600, "location": "DIMM 0" }
]
},
"storage": [
{
"name": "PHYSICALDRIVE0", "model": "Acme NVMe 1TB", "serialNumber": "SN0001",
"type": "NVMe", "interface": "NVMe", "capacity": 1024209543168,
"freeSpace": 402653184000, "health": "Good", "isInternal": true,
"volumeLetters": ["C"],
"storageAnalysisEnabled": true, "lastAnalyzed": "2026-03-04T04:12:00Z",
"rootDirectories": [
{ "path": "C:\\Program Files", "name": "Program Files",
"size": 64424509440, "formattedSize": "60 GB", "fileCount": 148221,
"subdirectoryCount": 412, "depth": 1, "driveRoot": "C:",
"percentageOfDrive": 6.3, "category": "ProgramFiles",
"lastModified": "2026-03-01T22:10:00Z",
"subdirectories": [], "largeFiles": [] }
]
}
],
"graphics": {
"name": "GraphicsCard 900", "manufacturer": "Acme",
"memorySize": 8, "driverVersion": "31.0.15.1234",
"driverDate": "2026-01-14T00:00:00Z"
},
"displays": [
{ "name": "Acme U2724", "serialNumber": "EXAMPLE-MONITOR-SERIAL", "manufacturer": "Acme",
"model": "Acme U2724", "type": "external", "vendorId": "10ac",
"productId": "41ac", "manufactureYear": 2024, "manufactureWeek": 18,
"resolution": "2560x1440", "connectionType": "DisplayPort External",
"diagonalInches": 27.0, "isMainDisplay": false, "online": true }
],
"usbDevices": [],
"battery": { "chargePercent": 88, "isCharging": true,
"estimatedRuntime": "05:16:00", "cycleCount": 143, "health": "Good" },
"thermal": { "cpuTemperature": 44.0, "gpuTemperature": 39.0, "fans": [] },
"npu": { "name": "Acme NPU", "manufacturer": "Acme", "architecture": "x64",
"computeUnits": 40.0, "driverDate": "2026-01-09T00:00:00Z",
"isAvailable": true },
"wireless": { "name": "Wi-Fi 6E Adapter", "manufacturer": "Acme",
"macAddress": "00:11:22:33:44:55", "driverVersion": "23.40.0.1",
"driverDate": "2025-12-01T00:00:00Z", "status": "Enabled",
"protocol": "802.11ax", "wifiGeneration": "Wi-Fi 6E",
"wifiVersion": "6E", "isAvailable": true },
"bluetooth": { "name": "Bluetooth Adapter", "manufacturer": "Acme",
"macAddress": "00:11:22:33:44:56", "driverVersion": "23.40.0.1",
"driverDate": "2025-12-01T00:00:00Z", "status": "Enabled",
"bluetoothVersion": "5.3", "isAvailable": true },
"powerPlan": null
}Behaviour worth knowing
-
Storage mode.
--storage-mode quickreports drive totals only and takes about a second.deepwalks Program Files, Program Files (x86), Users, Windows, ProgramData and any other top-level directories, producing therootDirectoriestree, and can take minutes.auto— the default — reusescache\storage_analysis.jsonwhen it is less than 24 hours old and walks otherwise. The directory tree is attached only to the disk hosting the system volume, found through each disk'svolumeLetters; when the partition map is unavailable, the sole (or largest) internal disk is used. The hourly task runsquickand only the daily hardware task runsdeep. -
volumeLetterslists the drive letters of the volumes on each physical disk, without the colon, so a consumer can label the disk that holdsC. -
Displays are read through WMI, not osquery. As SYSTEM, osquery gets zero
rows from
HKLM\SYSTEM\CurrentControlSet\Enum\DISPLAY, which is how the module ran across a whole fleet without ever reporting a monitor.vendorIdis the three-letter EDID PNP code packed five bits per letter and rendered lowercase hex. -
A display's
serialNumberis the EDID text serial. The raw EDID is read from the monitor'sDevice Parametersregistry node and the0xFFdescriptor is preferred, matching the macOS client. When a panel publishes no text serial, none is reported.WmiMonitorID.SerialNumberIDis used only when the raw EDID cannot be read, and only when it is at least five characters, because some drivers surface a short numeric fragment shared by every panel of a model.isMainDisplayis only true when exactly one monitor is attached — a session-0 process cannot see which is primary. -
usbDevicesis always empty here. USB lives in the peripherals module.powerPlanis defined but never populated. -
Some values are estimates. When the real figure is not available,
availablePhysicaldefaults to a quarter oftotalPhysical,totalVirtualto double it, andbattery.estimatedRuntimeis a synthetic six-hour baseline scaled by charge and health. On ARM systems without a reported graphics memory size,graphics.memorySizeis estimated as an eighth of physical memory. -
categoryon a directory is an enum name string:System,ProgramFiles,ProgramData,Users,Applications,Cache,Documents,MediaorOther. - Physical disks are authoritative; logical volumes only attribute free space. Bus types USB, 1394, SD, MMC, Fibre Channel and iSCSI mark a disk external.
Interfaces and everything attached to them, plus an optional throughput test.
osquery — interface_addresses, interface_details, routes, services,
system_info, default_environment, and registry queries for interface
friendly names, the Tcpip DNS parameters (Domain, DhcpDomain, SearchList,
DhcpDNS, NameServer) and the NetBT parameters (EnableLMHosts, NodeType,
ScopeID).
Other sources — netsh wlan show interface / show profiles,
netsh interface ip show dns, nbtstat -n and -c; PowerShell
Get-NetAdapter, Get-NetAdapterAdvancedProperty, Get-NetAdapterStatistics,
Get-NetIPAddress, Get-NetConnectionProfile, Get-DnsClientGlobalSetting,
Get-DnsClientServerAddress, Get-VpnConnection, Get-VpnConnectionRoute;
the root\wmi class MSNdis_80211_Configuration for the wireless channel; and
the bundled speedtest.exe, run as --format=json --accept-license with a
60-second timeout.
{
"hostname": "WS-0001",
"domain": "example.com",
"primaryInterface": "Ethernet",
"activeConnection": {
"connectionType": "Wired", "interfaceName": "Ethernet",
"friendlyName": "Ethernet", "ipAddress": "192.0.2.24",
"gateway": "192.0.2.1", "macAddress": "00:11:22:33:44:57",
"activeWifiSsid": null, "wifiSignalStrength": null, "activeWifiChannel": null,
"isVpnActive": false, "vpnName": ""
},
"localIpAddresses": ["192.0.2.24", "198.51.100.7"],
"hostnameAddresses": ["198.51.100.7"],
"managementAddress": "198.51.100.7",
"interfaces": [
{ "name": "Ethernet", "friendlyName": "Ethernet", "type": "Ethernet",
"macAddress": "00:11:22:33:44:57", "ipAddresses": ["192.0.2.24"],
"status": "Up", "isActive": true, "bytesSent": 88213441,
"bytesReceived": 1204118822, "mtu": 1500, "linkSpeed": "1 Gbps",
"wirelessProtocol": "", "wirelessBand": "" }
],
"wifiNetworks": [
{ "ssid": "example-wifi", "security": "Saved Profile",
"signalStrength": 0, "isConnected": false, "channel": "6" }
],
"vpnConnections": [],
"dns": {
"servers": ["192.0.2.10", "192.0.2.11"],
"domain": "example.com",
"searchDomains": ["example.com"],
"dhcpDomain": "example.com",
"dhcpDnsServers": ["192.0.2.10"],
"nameServer": ""
},
"netbios": {
"nodeType": "H-node (Hybrid)", "enableLMHosts": true, "scopeID": "",
"localNames": [ { "name": "WS-0001", "type": "Workstation",
"status": "Registered", "ipAddress": "", "interface": "",
"ttl": null } ],
"nameCache": []
},
"routes": [ { "destination": "0.0.0.0", "gateway": "192.0.2.1",
"interface": "Ethernet", "metric": 25 } ],
"networkQuality": {
"dlThroughput": "742.19", "ulThroughput": "512.66",
"dlRating": "High", "ulRating": "High", "rating": "High",
"idleLatency": "8.4", "jitter": "1.2",
"serverName": "Example ISP", "serverLocation": "Example City",
"error": "", "source": "speedtest"
}
}Behaviour worth knowing
- The active connection is chosen from the
0.0.0.0default route, matching by IP, then by same-subnet gateway, then by a scoring fallback.connectionTypeisNonewhen nothing qualifies. - VPN detection is a name-and-description match across a broad list of common
clients and WAN Miniport protocols. A tunnel counts as connected only when
the adapter is up and holds a non-APIPA IPv4 address.
connectedAtis approximated as the collection time, not the real connect time. -
netsh wlanis frequently refused when Windows location services are restricted. Channel detection falls through four methods and ends at a hard-coded"6"— treat a bare channel 6 with suspicion. -
wifiNetworks[].securityonly ever saysActive ConnectionorSaved Profile; it is not a cipher. -
networkQualityisnullwhenspeedtest.exeis absent or times out. Its numeric fields are strings. -
managementAddressis the address the device's own name resolves to, but only when that address is also assigned to a local interface. The module resolves the hostname, the system host name and the host name with its DNS suffix (three seconds per lookup), records the usable answers inhostnameAddressesand every locally assigned address, tunnels included, inlocalIpAddresses, and promotes a match, preferring IPv4. A stale DNS answer is not promoted, and the address on the default route inactiveConnectionis left as it is. This is what lets a remote tool reach a device over a VPN tunnel whose address DNS knows.
Defensive posture: what is protecting the machine, whether it is on, and what it has caught.
osquery — certificates, windows_security_products, bitlocker_info,
tpm_info, patches, os_version, windows_events, plus registry queries
for the Defender real-time protection and signature keys, the firewall profile
keys, Secure Boot state and the Device Guard keys.
Other sources — WMI root\SecurityCenter2\AntiVirusProduct,
root\Microsoft\Windows\DeviceGuard\Win32_DeviceGuard, Win32_ComputerSystem,
and vendor BIOS classes (root\wmi\Lenovo_BiosPasswordSettings,
root\HP\InstrumentedBIOS\HP_BIOSPassword, the Dell BIOS PowerShell provider).
PowerShell Get-NetFirewallProfile, Get-SecureBootUEFI,
Get-MpComputerStatus, Get-MpPreference, Get-BitLockerVolume,
Get-AppLockerPolicy, Get-ProcessMitigation -System, Get-WinEvent.
auditpol.exe /get /category:* /r for audit policy. The Windows Update COM
searcher, filtered to the Security Updates category, for CVEs. And the OpenSSH
files %ProgramData%\ssh\sshd_config and administrators_authorized_keys.
{
"antivirus": { "name": "Microsoft Defender Antivirus", "version": "4.18.26010.5",
"isEnabled": true, "isUpToDate": true,
"lastUpdate": "2026-03-04T06:02:00Z",
"lastScan": "2026-03-03T21:00:00Z",
"scanType": "Quick", "statusDisplay": "Current" },
"firewall": { "isEnabled": true, "profile": "", "statusDisplay": "Enabled",
"profiles": [ { "name": "Domain", "enabled": true,
"defaultInboundAction": "Block",
"defaultOutboundAction": "Allow" } ],
"rules": [] },
"encryption": {
"bitLocker": { "isEnabled": true, "status": "FullyEncrypted",
"recoveryKeyId": "aaaaaaaa-1111-4222-8333-bbbbbbbbbbbb",
"encryptedDrives": ["C:"], "recoveryKeysEscrowed": true,
"lastEscrowDate": "2025-11-02T19:10:00Z",
"escrowLocation": "Entra ID", "statusDisplay": "Enabled",
"recoveryKeys": [ { "driveLetter": "C:",
"recoveryKeyId": "aaaaaaaa-1111-4222-8333-bbbbbbbbbbbb",
"isEscrowed": true, "escrowDate": "2025-11-02T19:10:00Z",
"escrowLocation": "Entra ID",
"keyProtectors": ["Tpm", "RecoveryPassword"] } ] },
"deviceEncryption": true, "statusDisplay": "Enabled",
"encryptedVolumes": [ { "driveLetter": "C:", "encryptionMethod": "XtsAes256",
"encryptionPercentage": 100.0, "status": "FullyEncrypted" } ]
},
"tpm": { "isPresent": true, "isEnabled": true, "isActivated": true,
"version": "2.0", "manufacturer": "Infineon", "statusDisplay": "Enabled" },
"secureBoot": { "isEnabled": true, "isConfirmed": true, "statusDisplay": "Enabled",
"dbCertificates": [], "kekCertificates": [], "collectionErrors": [] },
"deviceGuard": { "coreIsolationEnabled": true, "memoryIntegrityEnabled": true,
"coreIsolationStatus": "Running", "memoryIntegrityStatus": "Running",
"vbsEnabled": true, "vbsSupported": true, "vbsStatus": "Running",
"vbsServices": ["Credential Guard", "HVCI"],
"kernelDmaProtectionEnabled": true,
"smartAppControlAvailable": true, "smartAppControlState": "Off",
"statusDisplay": "Credential Guard, HVCI",
"exploitProtection": { "depEnabled": true, "aslrEnabled": true,
"cfgEnabled": true, "sehopEnabled": true,
"heapIntegrityEnabled": true, "systemStatus": "On" } },
"rdp": { "isEnabled": false, "port": 3389, "nlaEnabled": true,
"securityLayer": "Negotiate", "allowRemoteConnections": false,
"statusDisplay": "Disabled" },
"secureShell": { "isInstalled": false, "isServiceRunning": false,
"isFirewallRulePresent": false, "isConfigured": false,
"isKeyDeployed": false, "arePermissionsCorrect": false,
"serviceStatus": "Stopped", "configStatus": "Not configured",
"statusDisplay": "Not installed" },
"firmwarePassword": { "manufacturer": "Acme", "source": "SMBIOS",
"adminPasswordSet": true, "powerOnPasswordSet": false,
"hddPasswordSet": null, "rawState": 3,
"adminPasswordStatus": 3, "statusDisplay": "Set",
"errorMessage": null },
"lsaProtection": { "enabled": true, "runAsPpl": 1, "mode": "PPL" },
"tamperProtection": { "isTamperProtected": true, "source": "Get-MpComputerStatus" },
"pendingReboot": { "cbsServicing": false, "windowsUpdate": false,
"fileRename": false, "required": false },
"asrRules": [ { "id": "d4f940ab-401b-4efc-aadc-ad5f3c50688a",
"name": "Block Office applications from creating child processes",
"action": 1, "state": "Block" } ],
"defenderVersions": { "amEngineVersion": "1.1.26010.1",
"amProductVersion": "4.18.26010.5",
"amServiceVersion": "4.18.26010.5",
"nisEngineVersion": "1.1.26010.1",
"antivirusSignatureVersion": "1.435.221.0",
"antispywareSignatureVersion": "1.435.221.0" },
"defenderExclusions": { "paths": [], "extensions": [], "processes": [],
"ipAddresses": [], "totalCount": 0 },
"appLocker": { "serviceRunning": false, "serviceStartType": "Manual",
"policyConfigured": false, "effectivePolicySummary": "",
"wdacEnabled": false, "wdacAuditMode": false },
"smartScreen": { "windowsState": "Warn", "edgeEnabled": true,
"edgePuaProtection": true },
"auditPolicy": { "categories": [ { "category": "Detailed Tracking",
"subcategory": "Process Creation", "setting": "Success" } ],
"errorMessage": "" },
"edrProducts": [ { "name": "Microsoft Defender Antivirus", "vendor": "Microsoft",
"source": "Service:WinDefend", "serviceRunning": true,
"version": "4.18.26010.5", "sid": "" } ],
"detections": [],
"detectionSummary": { "totalDetections30d": 0, "totalBlocked30d": 0,
"totalCleaned30d": 0, "totalAllowed30d": 0,
"lastThreatDetectedAt": null, "hasActiveThreats": false },
"certificates": [ { "commonName": "Example Issuing CA",
"subject": "CN=Example Issuing CA, DC=example, DC=com",
"issuer": "CN=Example Root CA", "serialNumber": "1a2b3c",
"thumbprint": "A1B2C3D4E5F60718293A4B5C6D7E8F9012345678",
"thumbprintSha256": "", "storeLocation": "LocalMachine",
"storeName": "CA", "notBefore": "2024-01-01T00:00:00Z",
"notAfter": "2029-01-01T00:00:00Z",
"keyAlgorithm": "RSA", "signingAlgorithm": "sha256RSA",
"keyLength": 2048, "isSelfSigned": false, "isExpired": false,
"isExpiringSoon": false, "daysUntilExpiry": 1034,
"status": "Valid", "isOsTrustedRoot": false } ],
"certificateSummary": { "totalCount": 148, "validCount": 141, "expiredCount": 6,
"expiringSoonCount": 1, "osRootExpiredCount": 6,
"userExpiredCount": 0 },
"securityUpdates": [], "securityCves": [], "securityEvents": [],
"securityReleaseInfo": { "osVersion": "10.0.26100", "osBuild": "26100",
"productVersion": "Windows 11 Enterprise",
"releaseDate": null, "uniqueCvesCount": 0,
"daysSincePreviousRelease": 0,
"securityInfoUrl": "", "updateAvailable": false },
"lastSecurityScan": "2026-03-03T21:00:00Z"
}Behaviour worth knowing
-
BitLocker has a false-positive guard. On some Windows 11 builds osquery
reports
protection_status = 1on a decrypted drive, so a volume only counts as encrypted when it has a real encryption method and a conversion status that means encrypted. Escrow location is derived from a BitLocker Management event 845 (Entra ID), then theActiveDirectoryBackuppolicy value, thenNot Backed Up. -
UEFI certificates are parsed in C#.
Get-SecureBootUEFIoutput is walked as EFI signature lists and each X.509 entry is loaded directly. Failures are reported per stage insecureBoot.collectionErrorsrather than silently dropped, and the parsed certificates are also appended tocertificates[]withstoreLocation: "UEFI". -
EDR detection is a service-name table, 26 entries covering the
common endpoint products, plus whatever
root\SecurityCenter2reports. It says what is installed and running, not whether it is healthy. -
Detections are deduplicated across the paired Defender events 1116 and
1117, so
count,firstSeenAtandlastSeenAtdescribe one detection rather than two rows. -
certificates[].isOsTrustedRootseparates the shipped root store — where expired certificates are normal noise — from certificates an administrator actually placed.firewall.rulesis permanently empty by design;thumbprintSha256is declared but never populated. - The module deliberately does not collect UAC, join state, local admins,
LAPS, Hello, password policy or auto-logon. Those are in
identity.
Who can sign in, who has, and how the device is joined.
osquery — users, groups, user_groups, logged_in_users,
logon_sessions, joins for administrators and Remote Desktop Users,
registry queries for Winlogon, Netlogon, the local account policy and the
domain-join Tcpip values, and four windows_events queries for account and
logon events.
Other sources — PowerShell Get-LocalUser, Get-LocalGroup,
Get-LocalGroupMember, Get-CimInstance Win32_UserProfile,
Get-WmiObject Win32_ComputerSystem, Test-ComputerSecureChannel, Get-Tpm,
Get-WinEvent; dsregcmd /status; net accounts; SecurityIdentifier.Translate
for SID lookup; [System.DirectoryServices.ActiveDirectory.Domain] for the
domain controller; and direct registry reads of the UAC policy values, both
LAPS locations, Winlogon and the Entra identity cache.
{
"users": [
{ "username": "jdoe", "fullName": "J Doe", "description": "",
"sid": "S-1-12-1-1111111111-2222222222-3333333333-4444444444",
"homeDirectory": "C:\\Users\\jdoe", "uid": 0, "gid": 0, "shell": "",
"uuid": "", "accountType": "EntraID", "isAdmin": false, "isDisabled": false,
"isLocal": false, "passwordNeverExpires": false,
"userCannotChangePassword": false, "passwordRequired": true,
"isLockout": false, "lastLogon": "2026-03-04T08:02:11Z",
"createdAt": "2025-11-04T15:00:00Z", "passwordLastSet": null,
"accountExpires": null, "lastFailedLogin": null, "failedLoginCount": 0,
"groupMemberships": ["Users"], "userPrincipalName": "jdoe@example.com" }
],
"groups": [ { "name": "Administrators", "description": "Full control",
"sid": "S-1-5-32-544", "gid": 0, "comment": "",
"groupType": "Builtin", "isBuiltIn": true,
"members": ["EXAMPLE\\Domain Admins"] } ],
"loggedInUsers": [ { "username": "jdoe", "domain": "EXAMPLE",
"sessionType": "console", "logonType": "Interactive",
"sessionState": "Active", "loginTime": "2026-03-04T08:02:11Z",
"sessionId": 1, "pid": null, "host": "", "tty": "",
"isActive": true } ],
"loginHistory": [ { "username": "jdoe", "timestamp": "2026-03-04T08:02:11Z",
"logoutTime": null, "duration": "1h 12m",
"eventType": "Logon", "eventId": 4624,
"logonType": "Interactive", "source": "", "sourceIp": "",
"success": true } ],
"sessionHistory": [ { "username": "jdoe", "timestamp": "2026-03-03T09:01:00Z",
"endTime": "2026-03-03T17:22:00Z", "duration": "8h 21m",
"durationMinutes": 501.0, "eventId": 23,
"eventType": "Logoff", "sessionId": 1,
"sourceAddress": "" } ],
"sessionSummary": { "totalSessions": 42, "uniqueUsers": 3,
"avgSessionMinutes": 264.5, "medianSessionMinutes": 218.0,
"oldestSession": "2026-02-04T08:11:00Z",
"newestSession": "2026-03-04T08:02:11Z",
"sessionsByHour": { "08": 12, "09": 7 },
"sessionsByDayOfWeek": { "Monday": 9, "Tuesday": 8 } },
"directoryServices": {
"activeDirectory": { "isDomainJoined": true, "domainName": "EXAMPLE",
"domainController": "dc01.example.com",
"organizationalUnit": "", "lastPasswordSet": null,
"dnsDomainName": "example.com",
"forestName": "example.com" },
"entraId": { "isEntraJoined": true, "isEntraRegistered": false,
"tenantId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"tenantName": "Example", "deviceId": "11111111-2222-3333-4444-555555555555",
"thumbprint": "A1B2C3D4E5F6", "deviceCertificateValidity": "Valid",
"deviceAuthStatus": "SUCCESS", "joinDate": null },
"workgroup": ""
},
"ssoState": { "entraPrt": true, "entraPrtUpdateTime": "2026-03-04T07:55:00Z",
"entraPrtExpiryTime": "2026-03-18T07:55:00Z",
"entraPrtAuthority": "https://login.microsoftonline.com/…",
"enterprisePrt": false, "enterprisePrtAuthority": "",
"onPremTgt": true, "cloudTgt": true, "kerbTopLevelNames": "" },
"domainTrust": { "secureChannelValid": true, "domainName": "example.com",
"domainController": "dc01.example.com", "trustStatus": "Healthy",
"lastChecked": "2026-03-04T09:14:20Z", "errorMessage": "",
"computerAccountExists": true, "machinePasswordAgeDays": null },
"windowsHello": { "statusDisplay": "Enabled (PIN) [Business] - Configured",
"credentialProviders": { "pinEnabled": true,
"faceRecognitionEnabled": false, "fingerprintEnabled": false,
"smartCardEnabled": false, "providers": [] },
"biometricService": { "isServiceRunning": false,
"serviceStatus": "Stopped", "devices": [] },
"helloEvents": [] },
"uac": { "enableLua": true, "consentPromptBehaviorAdmin": 5,
"promptOnSecureDesktop": 1, "level": "NotifyChangesSecure" },
"laps": { "windowsLapsConfigured": true, "legacyLapsInstalled": false,
"backupDirectory": "Azure AD", "adminAccountName": "" },
"passwordPolicy": { "minPasswordLength": 14, "maxPasswordAgeDays": 0,
"minPasswordAgeDays": 1, "passwordHistoryLength": 24,
"lockoutThreshold": 10, "lockoutDurationMinutes": 15,
"complexityRequired": null, "errorMessage": "" },
"tpmOwnership": { "isOwned": true, "isReady": true, "autoProvisioning": true,
"manufacturerIdTxt": "IFX", "managedAuthLevel": "Full" },
"autoLogin": { "autoAdminLogon": false, "hasDefaultUserName": false,
"hasDefaultPassword": false, "hasDefaultDomainName": false,
"defaultUserName": "" },
"summary": { "totalUsers": 3, "adminUsers": 1, "disabledUsers": 0,
"localUsers": 1, "domainUsers": 2, "currentlyLoggedIn": 1,
"failedLoginsLast7Days": 0, "domainStatus": "Hybrid" }
}Behaviour worth knowing
- Built-in accounts are filtered by SID RID, not by name — RIDs 500, 501, 503 and 504 — so the filter works on non-English Windows.
-
The PowerShell pass rebuilds
usersandgroupsfrom scratch, discarding the osquery rows whenever it succeeds. Groups are limited to Administrators, Remote Desktop Users, Users, Power Users and Backup Operators. -
Admin detection has two paths. Local accounts are matched by name against
the Administrators group; profile-derived accounts are matched by SID, which
is the accurate path and the one that covers Entra (
S-1-12-1-…) and domain members. - Join state comes from
dsregcmd /status. ItsAzureAd*field names are renamed toentra*in the payload.summary.domainStatusisHybridwhen both AD and Entra report joined. -
The auto-logon password is never read — only the presence of the
DefaultPasswordvalue is reported, and its presence logs a warning. -
passwordPolicyparses Englishnet accountslabels and will produce nulls on a non-English Windows.failedLoginsLast7Daysis never computed. - Several Windows Hello sub-objects — policies, NGC key storage, Credential Guard, WebAuthN — depend on osquery results that no shipped query pack produces, so they stay empty. Hello data comes from the event-log fallback.
Enrolment, policy and configuration. The design point is that policy is collected generically from registry roots rather than per product.
osquery — enrolment and identity from HKLM\SOFTWARE\Microsoft\Enrollments,
…\Provisioning\OMADM\Accounts, …\CurrentVersion\MDM and
…\CurrentVersion\AAD\Storage; management certificates from the certificates
table; and seven broad policy sweeps:
| Query | Root | Source label |
|---|---|---|
policy_registry_machine |
HKLM\SOFTWARE\Policies\** |
Group Policy, device |
policy_registry_machine_wow6432 |
HKLM\SOFTWARE\WOW6432Node\Policies\** |
Group Policy, device |
policy_registry_mdm_current |
HKLM\SOFTWARE\Microsoft\PolicyManager\current\** |
MDM, device |
policy_registry_user |
HKEY_USERS\%\SOFTWARE\Policies\** |
Group Policy, user |
policy_registry_system |
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\** |
System policy, device |
policy_registry_system_control |
HKLM\SYSTEM\CurrentControlSet\Policies\** |
System policy, device |
policy_registry_user_system |
HKEY_USERS\%\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\** |
System policy, user |
Two deliberate scoping decisions are worth repeating: MDM policy is limited to
the current subtree because the whole PolicyManager tree is roughly 23,000
values and 6 MB per device and is not device state; and user policy must be read
through HKEY_USERS, because the agent runs as SYSTEM and HKCU would resolve
to SYSTEM's own hive.
Other sources — dsregcmd /status is the primary source for join, tenant
and device details. MdmDiagnosticsTool.exe; the WMI namespace
root\cimv2\mdm\dmmap (health attestation and Device Guard status) and
root\ccm (SMS_Client, SMS_Authority) for co-management;
Get-BitLockerVolume; the Autopilot policy cache in the registry; the Intune
Management Extension Win32Apps registry tree for managed apps and its log
file. A log survey walks %ProgramData% for the Intune extension log directory
and for any Managed*\logs directory following the same convention.
{
"deviceState": { "entraJoined": true, "enterpriseJoined": false,
"domainJoined": true, "virtualDesktop": false,
"deviceName": "WS-0001", "status": "Entra Joined" },
"deviceDetails": { "deviceId": "11111111-2222-3333-4444-555555555555",
"thumbprint": "A1B2C3D4E5F6", "deviceCertificateValidity": "Valid",
"keyContainerId": "", "keyProvider": "Microsoft Platform Crypto Provider",
"tmpProtected": true, "deviceAuthStatus": "SUCCESS",
"intuneDeviceId": "66666666-7777-8888-9999-000000000000",
"entraObjectId": "11111111-2222-3333-4444-555555555555",
"primaryUser": "jdoe@example.com", "managementName": "WS-0001" },
"tenantDetails": { "tenantName": "Example",
"tenantId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"mdmUrl": "https://example.manage.microsoft.com/",
"mdmComplianceUrl": "", "settingsUrl": "" },
"userState": { "ngcSet": true, "ngcKeyId": "", "canReset": true,
"workplaceJoined": false, "wamDefaultSet": true,
"wamDefaultAuthority": "organizations", "wamDefaultId": "",
"wamDefaultGUID": "" },
"mdmEnrollment": { "isEnrolled": true, "provider": "Microsoft Intune",
"enrollmentId": "77777777-8888-9999-aaaa-bbbbbbbbbbbb",
"userPrincipalName": "jdoe@example.com",
"managementUrl": "https://example.manage.microsoft.com/",
"serverUrl": "https://example.manage.microsoft.com/",
"enrollmentMethod": "Auto-Enrolled" },
"ownershipType": "Corporate",
"lastSync": "2026-03-04T06:41:00Z",
"autopilotConfig": { "activated": true, "registered": true, "status": "Complete",
"statusDetail": "", "tenantId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"tenantDomain": "example.com", "profileName": "Standard Workstation",
"cloudAssigned": true, "deploymentMode": "SelfDeploying",
"policyDate": "2025-11-02", "forcedEnrollment": true,
"correlationId": "" },
"configurationProfiles": [
{ "name": "Example Browser Policy", "profileName": "Example Browser Policy",
"uuid": "HKLM\\SOFTWARE\\Policies\\Example\\Browser",
"identifier": "Example/Browser", "source": "Group Policy",
"category": "Applications", "organization": "", "type": "Device",
"status": "Applied", "description": "", "payloadCount": 1,
"installDate": null, "lastModified": "2026-01-22T04:00:00Z",
"settings": {}, "appliedSettings": [],
"payloads": [ { "type": "Registry", "identifier": "Example/Browser",
"displayName": "Browser", "version": 1,
"settings": { "HomepageLocation": "https://intranet.example.com" } } ] }
],
"registryPolicies": [ { "keyPath": "HKLM\\SOFTWARE\\Policies\\Example\\Browser",
"valueName": "HomepageLocation",
"value": "https://intranet.example.com", "type": "REG_SZ",
"source": "Group Policy", "category": "Applications",
"description": "", "lastModified": null } ],
"intunePolicies": [], "mdmConfigurations": [], "omaURISettings": [],
"securityPolicies": [], "compliancePolicies": [],
"managedApps": [ { "name": "Example Editor", "appId": "abcd1234", "version": "3.1.0",
"installState": "Installed", "complianceState": "Compliant",
"enforcementState": "Success", "appType": "Win32",
"errorCode": "0", "lastInstallAttempt": "2026-02-28T03:12:00Z",
"targetType": "Device" } ],
"profiles": [],
"lastPolicyUpdate": "2026-03-04T06:41:00Z",
"totalPoliciesApplied": 412,
"policyCountsBySource": { "Group Policy": 188, "MDM": 190, "System Policy": 34 },
"mdmDiagnostics": { "collectedAt": "2026-03-04T09:14:10Z",
"healthAttestation": { "secureBootEnabled": true, "bitLockerStatus": "On",
"codeIntegrityEnabled": true, "bootDebuggingEnabled": false,
"lastUpdateTime": "2026-03-04T06:00:00Z", "errorMessage": "" },
"coManagementStatus": { "configMgrInstalled": false, "isCoManaged": false,
"configMgrVersion": "", "errorMessage": "" },
"recentIntuneLogs": [] },
"logs": { "platform": "Windows", "roots": [
{ "tool": "mdm", "name": "Intune",
"path": "C:\\ProgramData\\Microsoft\\IntuneManagementExtension\\Logs",
"layout": "flat", "fileCount": 12, "totalBytes": 48211440,
"newestModified": "2026-03-04T06:41:00Z", "inventoryTruncated": false,
"primaryLog": "IntuneManagementExtension.log",
"errorCount": 0, "warningCount": 3, "version": "1.90.0.0",
"files": [], "tails": [] } ] },
"metadata": {}
}Behaviour worth knowing — what "profiles" means here
There is no separate profiles module. Two things carry the name:
-
management.profiles[]is the legacy MDM profile list. It is marked obsolete in the code and is still emitted for compatibility. -
management.configurationProfiles[]is the current concept. The flat registry sweep is grouped into one profile per policy branch, each carrying every value beneath it as payload settings, deliberately shaped so the dashboard renders Windows registry policy and macOS configuration-profile payloads through the same reader.uuidis the policy key path. The native and WOW6432Node views of the same branch collapse into one profile. There is no per-product logic — extending coverage means adding a registry root, never a per-application query.
The logs section surveys management tool log roots, mirroring the macOS
client field for field so one reader serves both. Every
C:\ProgramData\Managed<Tool>\logs directory is a root (ManagedInstalls
becomes tool installs, ManagedBootstrap becomes bootstrap, and so on),
plus the Intune Management Extension log directory as tool mdm, read with
CMTrace severities. For each root it reports the file inventory, the latest
session summary when the tool writes YYYY-MM-DD\HHMM or HHMMSS session
directories, error and warning counts from the primary log's tail, and capped
tails of the most relevant logs. version is read from the owning tool's
installed binary and omitted when the tool has no known binary or is not
installed; nothing is executed to ask a tool its version. Limits: 20 roots,
50 files and 6 tails per root, 150 lines or 32 KB per tail, and a 5,000-entry
walk per root, after which inventoryTruncated is true and the counts are a
floor.
provider is inferred as Microsoft Intune when the device is enrolled with
no provider recorded and either Intune policies exist or the MDM URL points at
the Intune service. tenantName deliberately is not used for that inference,
because dsregcmd fills it for any Entra-joined device.
Installed software, what is running, what starts automatically, and how much each application is actually used.
osquery — programs, startup_items, processes (excluding zombies).
Other sources — the Windows Security log, events 4688 and 4689
(process creation and termination), falling back to
Microsoft-Windows-Kernel-Process/Operational events 1 and 2, and using System
log events 1074 and 6008 to close sessions left open by a shutdown. SID to
username resolution goes through SecurityIdentifier.Translate.
FileVersionInfo fills in versions the registry records incompletely. Idle
split comes from the per-user JSON files that usagetracker.exe writes under
C:\ProgramData\ManagedReports\usagetracker\.
{
"totalApplications": 214,
"applicationsWithUsage": 37,
"lastInventoryUpdate": "2026-03-04T09:14:19Z",
"installedApplications": [
{ "name": "Example Editor", "version": "3.1.0", "publisher": "Example Inc.",
"installLocation": "C:\\Program Files\\Example Editor",
"installDate": "2026-02-28T00:00:00Z", "size": null,
"architecture": "x64", "source": "MSI",
"usage": { "name": "Example Editor", "executable": "editor.exe",
"path": "C:\\Program Files\\Example Editor\\editor.exe",
"publisher": "Example Inc.",
"firstSeen": "2026-03-04T05:11:02Z",
"lastUsed": "2026-03-04T08:58:40Z",
"lastExitTime": "2026-03-04T08:58:40Z",
"launchCount": 3, "totalSeconds": 7412.0,
"activeUsageSeconds": 3980.0, "averageSessionSeconds": 2470.7,
"activeSessionCount": 3, "uniqueUserCount": 1,
"users": ["EXAMPLE\\jdoe"], "recentSessions": [] } }
],
"runningProcesses": [
{ "name": "editor.exe", "processId": 8124,
"path": "C:\\Program Files\\Example Editor\\editor.exe",
"memoryUsage": 412372992, "cpuPercent": 1.8,
"startTime": "2026-03-04T08:02:44Z" }
],
"startupPrograms": [
{ "name": "ExampleSync", "path": "C:\\Program Files\\Example Sync\\sync.exe",
"location": "Registry", "enabled": true }
],
"usage": {
"isCaptureEnabled": true, "status": "complete",
"generatedAt": "2026-03-04T09:14:19Z",
"windowStart": "2026-03-04T05:14:19Z", "windowEnd": "2026-03-04T09:14:19Z",
"totalLaunches": 11, "totalUsageSeconds": 21344.0,
"warnings": [],
"activeSessions": [
{ "sessionId": "8124-638400000000000000", "name": "Example Editor",
"publisher": "Example Inc.",
"path": "C:\\Program Files\\Example Editor\\editor.exe",
"processId": 8124, "user": "EXAMPLE\\jdoe",
"userSid": "S-1-12-1-1111111111-2222222222-3333333333-4444444444",
"startTime": "2026-03-04T08:02:44Z", "endTime": null,
"durationSeconds": 4055.0, "foregroundSeconds": 2210.0,
"activeSeconds": 1980.0, "isActive": true }
]
},
"dailyUsageHistory": [
{ "date": "2026-03-04", "appName": "Example Editor", "publisher": "Example Inc.",
"launches": 3, "totalSeconds": 7412.0, "foregroundSeconds": 3120.0,
"activeSeconds": 2740.0, "users": ["EXAMPLE\\jdoe"] }
]
}Behaviour worth knowing
- Usage is a window delta, not a cumulative. The API accumulates on conflict, so the client sends only what happened since the last window. The window runs from a watermark file to now, capped at four hours. The watermark is written at collection time, so a failed transmission loses a window rather than replaying it — the idempotency key handles the retry case.
-
Three different numbers.
durationSecondsis process lifetime.foregroundSecondsis time the application held OS focus.activeSecondsis foreground and user input within the previous 300 seconds. Only the last is a defensible "someone was using this" figure. Both idle figures stay zero whereusagetracker.exeis not running — the collector runs as SYSTEM in session 0 and cannot call the foreground or last-input APIs for a user. -
Daily history is keyed on the local day, matching
usagetracker.exe. A session that spans midnight has its seconds apportioned across the local days it covers, and when tracker figures are merged in,totalSecondsis kept at or aboveforegroundSeconds. - Launches are activations, not process starts. A new launch is only counted when a session begins more than 60 seconds after everything else for that application exited. Counting raw sessions produced millions of "launches" across a fleet in two days.
- Service and OS binaries are filtered out by path and by an explicit denylist, with a small allowlist for the System32 tools people genuinely use.
- Attribution matches an executable to an installed application by longest install-location prefix, then by a fuzzy name match that ignores vendor words. The event-log path drops what it cannot resolve; the tracker path falls back to the executable name.
- Despite the name,
usage.activeSessionscontains every session in the window, not only the still-running ones. The snapshot's ownapplicationslist is not serialized — per-application figures ride oninstalledApplications[].usage.
Managed-software state, read from Cimian, the Windows managed-install tool. This module is the analogue of Munki reporting on the macOS client. If Cimian is not installed, it reports that and little else.
osquery — seventeen queries, almost all against the file table. They
locate and stat the report files, the session log directories, the
configuration file, the manifests, the catalogs and the package cache, plus
services, processes, programs and a registry lookup for the package
key. osquery finds the files; the processor then reads them directly, so an
osquery miss does not lose the data.
Other sources — direct reads of the JSON, JSONL, YAML and log files under
C:\ProgramData\ManagedInstalls\; FileVersionInfo on the Cimian executable;
Process.GetProcesses(); schtasks for the scheduled-task state; and the
uninstall registry key for the installed version.
{
"lastCheckIn": "2026-03-04T04:12:33Z",
"bootstrapModeActive": false,
"runLog": "…",
"cacheStatus": {
"cache_size_mb": 2841.7, "file_count": 63,
"cimian_last_run": "2026-03-04T04:12:33Z",
"cimian_total_packages": 48,
"cimian_packages_with_updates": 2,
"cimian_packages_with_warnings": 1,
"cimian_packages_with_errors": 0
},
"cimian": {
"isInstalled": true, "version": "0.1.21", "status": "Active",
"lastRun": "2026-03-04T04:12:33Z",
"lastSessionTime": "2026-03-04T04:12:33Z", "totalSessions": 214,
"bootstrapFlagPresent": false,
"pendingPackages": ["Example Editor"],
"services": ["Cimian Managed Software Update Hourly: REGISTERED"],
"activeProcesses": [],
"registryConfig": {}, "config": {},
"catalogs": ["standard"],
"reports": { "items.json": { "size": "184320", "mtime": "1772596353" } },
"items": [
{ "id": "example-editor", "itemName": "Example Editor",
"displayName": "Example Editor", "itemType": "managed_install",
"currentStatus": "Update Available", "mappedStatus": "Pending",
"latestVersion": "3.2.0", "installedVersion": "3.1.0",
"lastSeenInSession": "20260304-041233",
"lastSuccessfulTime": "2026-02-28T03:12:00Z",
"lastAttemptTime": "2026-03-04T04:12:33Z",
"lastAttemptStatus": "Pending", "lastUpdate": null,
"installCount": 1, "updateCount": 0, "failureCount": 0, "warningCount": 0,
"totalSessions": 12, "installLoopDetected": false, "hasInstallLoop": false,
"lastError": "", "lastWarning": "",
"pendingReason": "Update available", "installMethod": "msi",
"type": "msi", "category": "Applications", "developer": "Example Inc.",
"recentAttempts": [] }
],
"sessions": [
{ "session_id": "20260304-041233", "start_time": "2026-03-04T04:12:33Z",
"end_time": "2026-03-04T04:19:02Z", "run_type": "auto",
"status": "completed", "total_actions": 4, "total_packages_managed": 48,
"packages_installed": 1, "packages_pending": 1, "packages_failed": 0,
"installs": 1, "updates": 0, "removals": 0, "successes": 1, "failures": 0,
"duration_seconds": 389, "cache_size_mb": 2841.7,
"hostname": "WS-0001", "user": "SYSTEM", "process_id": 4188,
"log_version": "2", "packages_handled": ["Example Editor"],
"environment": {}, "config": {}, "summary": {}, "system_info": {},
"flags": {}, "batch_operations": [], "performance_metrics": {},
"failed_items": [], "blocking_applications": {} }
],
"events": [
{ "eventId": "e-0001", "sessionId": "20260304-041233",
"timestamp": "2026-03-04T04:14:10Z", "level": "INFO",
"eventType": "install", "package": "Example Editor", "version": "3.1.0",
"action": "install", "status": "Success",
"message": "Installed Example Editor 3.1.0", "duration": "00:02:11",
"progress": 100, "error": "", "installerType": "MSI",
"installerPath": "", "installerOutput": "", "context": {},
"sourceFile": "", "sourceFunction": "", "sourceLine": 0,
"logFile": "", "batchId": "", "systemContext": {},
"relatedPackages": [], "performanceCounters": {}, "checkOnlyMode": false }
]
},
"cimianSessionStats": null,
"cimianSnapshot": null
}Behaviour worth knowing
-
cimian.sessions[]emits snake_case. Those fields carry explicit[JsonPropertyName]attributes. ThecacheStatusdictionary keys are snake_case too. Everything else in the module is camelCase. -
A full run skips the module while
managedsoftwareupdateis running, to avoid reading half-written reports. Runs that name modules with--run-moduleor--run-modulesbypass the check, which is how the Cimian postflight (--run-modules inventory,installs) reports straight after a Cimian run. -
currentStatusis Cimian's own vocabulary;mappedStatusnormalises it toInstalled,Pending,Warning,ErrororRemovedfor filtering. An install loop and a not-installed item both map toWarning, whatever status Cimian reports for a looping item. - A Cimian warning verdict survives the run that produced it: an item Cimian
marked Warning (a postinstall warning, or a LoopGuard suppression) keeps
mappedStatusWarningand itslastWarningtext even when its install event completed. Only a clean success clears it. Install events carry each warning or failed item with a message:lastWarningfor warnings, the last error or the failing event's error text for failures. - Cimian counts as installed when its items, sessions or version prove it ran, even if the service and scheduled-task probes miss. A session summary with no errors field is read for its failure count instead.
-
runLogships the entire run log as one string, opened with a shared read handle so a running Cimian does not block it. -
installsis not on any of the interval tasks, because it depends on a tool that is itself running on a schedule; it is reported by the Cimian postflight, by the MSI's all-modules task (a full run) and by the first check-in after install. The NUPKG's all-modules task leaves it out.
Everything attached to the machine. This is the one module whose payload names are all explicit, because the shape has to match the macOS client and the dashboard reader exactly.
osquery — nineteen queries, every one of them against the registry table,
covering the DISPLAY, USB, USBSTOR, HID and PCI enumeration keys, the
printer control keys, the MMDevices audio render and capture keys, the
Bluetooth device parameters, and HARDWARE\DEVICEMAP\SERIALCOMM.
Other sources — a WMI or PowerShell CIM fallback for every category:
Win32_PnPEntity (USB, keyboards and mice, cameras, Thunderbolt, scanners),
Win32_SoundDevice, Win32_Printer, Win32_LogicalDisk filtered to removable
drives, Win32_SerialPort, and a PowerShell read of the Bluetooth device keys
that UTF-8 decodes the binary name value. Displays come from the same
root\wmi monitor classes the hardware module uses.
{
"usbDevices": [
{ "name": "Example Pen Tablet", "vendor": "Example", "vendorId": "056a",
"model": "Pen Tablet", "modelId": "0391",
"deviceInstanceId": "USB\\VID_056A&PID_0391\\0AA00A0000001",
"serialNumber": "0AA00A0000001", "isCompositeChild": false,
"class": "HID", "subclass": "", "protocol": "", "removable": true }
],
"bluetoothDevices": [
{ "name": "Example Headset", "address": "001122334455",
"deviceType": "Audio", "deviceCategory": "Audio/Video",
"isConnected": false, "isPaired": true, "manufacturer": "Example",
"lastSeen": "" }
],
"printers": [
{ "name": "Print-Queue-01", "displayName": "Print-Queue-01",
"manufacturer": "Example", "model": "LaserJet 500",
"driver": "Example Universal Print Driver", "driverVersion": "6.9.0",
"portName": "IP_192.0.2.60", "location": "Building A",
"status": "Idle", "shareName": "", "connectionType": "Network",
"isDefault": true, "isShared": false, "isNetwork": true,
"serverName": "", "comment": "", "deviceType": "Printer" }
],
"displayDevices": [
{ "serialNumber": "EXAMPLE-MONITOR-SERIAL", "manufacturer": "Acme",
"model": "Acme U2724", "friendlyName": "Acme U2724",
"hardwareId": "MONITOR\\EXAMPLE_MONITOR_ID", "connectionType": "DisplayPort External",
"deviceDescription": "Generic PnP Monitor",
"pnpDeviceId": "DISPLAY\\EXAMPLE_MONITOR_ID\\5&1a2b3c&0&UID_EXAMPLE", "isExternal": true }
],
"inputDevices": [
{ "name": "Example Pen Tablet", "description": "Example Pen Tablet",
"vendor": "Example", "vendorId": "056a", "productId": "0391",
"serialNumber": "0AA00A0000001", "tabletType": "Pen Display",
"registryPath": "HKLM\\SYSTEM\\CurrentControlSet\\Enum\\HID\\…",
"deviceType": "Graphics Tablet", "hidDeviceId": "HID\\VID_056A&PID_0391",
"isBuiltIn": false, "connectionType": "USB" }
],
"audioDevices": [
{ "name": "Speakers", "manufacturer": "Example", "type": "Render",
"isDefault": true, "isInput": false, "isOutput": true, "isBuiltIn": true,
"connectionType": "Internal", "deviceType": "Audio Device",
"status": "Active", "registryPath": "HKLM\\SOFTWARE\\Microsoft\\…" }
],
"cameras": [
{ "name": "Example Webcam", "manufacturer": "Example", "modelId": "0826",
"isBuiltIn": false, "connectionType": "USB", "deviceType": "Camera",
"status": "OK", "registryPath": "HKLM\\SYSTEM\\CurrentControlSet\\Enum\\USB\\…" }
],
"storageDevices": [
{ "name": "Example Portable SSD", "devicePath": "E:", "volumeName": "SCRATCH",
"fileSystem": "NTFS", "totalSize": "1000204886016",
"freeSpace": "742938214400", "serialNumber": "SN0002",
"driveType": "Removable", "storageType": "SSD", "connectionType": "USB",
"deviceType": "External Storage" }
],
"thunderboltDevices": [],
"scanners": [],
"serialPorts": [
{ "name": "COM3", "device": "\\Device\\Serial0", "portType": "Serial",
"connectionType": "Internal", "deviceType": "Serial Port" }
]
}Behaviour worth knowing
-
Eleven flat arrays, no wrappers. The model has nested category objects
internally, but they are all
[JsonIgnore]d. Only the flat arrays serialize, chosen to match the macOS client and the dashboard reader. Graphics tablets are folded intoinputDeviceswithdeviceTypeset toGraphics TabletandtabletTypecarried across. -
serialNumberis only set when the device exposes a USB serial descriptor. Where Windows derives the instance id from bus topology, it is null.deviceInstanceIdis a bus address, not an identity, and should not be used as a key. -
isCompositeChildmatters. A composite device's children carry&MI_nnin their instance path and no serial — the serial lives on the parent, so consumers must collapse children onto it. -
Displays are reported by both this module and
hardware, on purpose. The EDID serial is an identity key and must be the same string in both payloads, so both read it from the same reader.Win32_DesktopMonitoris deliberately not used — it names everything "Generic PnP Monitor" and carries no serial. Pen displays are why display and tablet collection are coupled: some generations publish no USB serial at all, leaving the EDID serial as the only stable identity. - A
PrinterDatamodel and aprintersprocessor exist in the tree but are not registered and not shipped — there is noprintersmodule id and noprinters.jsonquery pack. Printers reach the payload only through this module. - The tablet vendor filter is a generic list of graphics-tablet vendors, not a site-specific list.
MIT licensed. reportmate.app