yuzu

sccm

What it doesReports SCCM/ConfigMgr client status, version, and site assignment
Version1.0.0
KindCollector · read-only · gathered (security.sccm.client_version, security.sccm.site)
PlatformsWindows ✅ · macOS ⛔ unsupported · Linux ⛔ unsupported
Actionsclient_version (definition security.sccm.client_version) · site (definition security.sccm.site)
Securitysecurable SoftwareDeployment · operation Read · risk Low · dispatch ReadOnly · approval gate None
Rolesexecute: endpoint-admin, endpoint-operator, security-admin · author: content-author

How it works

client_version checks HKLM\SOFTWARE\Microsoft\SMS\Mobile Client\ProductVersion for the installed SCCM client version, then queries the ccmexec service through the SCM (OpenSCManagerW → OpenServiceW → QueryServiceStatusEx) for its run state. site reads the assigned site code from the registry (SMS\Mobile Client\AssignedSiteCode, falling back to CCM\AssignedSiteCode), then the management point (CCM\Authority, falling back to enumerating CCM\Authority\SMS:<code> subkeys). If either registry path comes up empty, site lazily initializes a COM apartment and calls the late-bound Microsoft.SMS.Client IDispatch object (GetAssignedSite / GetCurrentManagementPoint) as a fallback. Both actions are pure reads: neither installs, repairs, nor reconfigures the SCCM client.

The plugin is Windows-only by design — SCCM/ConfigMgr has no macOS or Linux client — and deliberately returns an honest sentinel rather than an empty or fabricated result on those platforms.

flowchart LR
  OP[Operator / workflow] --> SRV[Server<br/>authz: SoftwareDeployment.Read]
  SRV -- gRPC mTLS --> HOST[Agent plugin host] --> EX[sccm.execute]
  EX --> WIN[Windows leg<br/>registry + SCM query / registry + late-bound COM]
  EX --> MAC[macOS leg<br/>honest 'unsupported' sentinel]
  EX --> LIN[Linux leg<br/>honest 'platform not supported' sentinel]
  WIN & MAC & LIN --> ROWS[rows, no typed result status] --> RS[(ResponseStore)] --> API[REST /api/responses]

OS capability

ActionWindowsmacOSLinux
client_version✅ supported · rung 1 · registry+scm⛔ unsupported⛔ unsupported
site✅ supported · rung 1 · registry+com_dispatch⛔ unsupported⛔ unsupported

Privileges and prerequisites

OSRuns asExtra grant neededMeasuredIf the read is refused
Windowsagent service account (LocalSystem today, #1442)None. Registry reads use KEY_READ; the SCM query uses SC_MANAGER_CONNECT / SERVICE_QUERY_STATUS; the COM call opens no elevated interface.2026-09-07, bare-metal, SYSTEMclient_version.version reports -/installed|false; service_status reports unavailable; site.site_code reports not_configured
macOSagent daemon, unprivilegedn/a — action returns the honest-unsupported sentinel unconditionally2026-09-07, bare-metal, euid 501 (jsmith)n/a — no read is attempted
Linuxagent daemon, unprivilegedn/a — action returns the honest-unsupported sentinel unconditionally2026-09-06, container, euid 0n/a — no read is attempted

No subprocesses and no network access. site opens an in-process COM apartment (CoInitializeEx/CoCreateInstance against Microsoft.SMS.Client) as a fallback only when the registry lookup is empty; nothing is spawned. The plugin previously shelled out to sc query ccmexec and two PowerShell ComObject calls — all three sites were retired in Wave 3 PR33d (docs/agent-spawn-sink-manifest.md:326); zero spawn sites remain.

Data contract

Inputs

Neither action takes parameters.

Outputs

Pipe-delimited key|value rows, one per fact, written via write_output(). On Windows a missing value is reported through an explicit sentinel word (false, -, not_found, not_configured, unknown) chosen per field, never a blank or omitted row. On macOS and Linux each action emits one or two sentinel rows instead of the normal key/value set, naming the reason the platform has no client.

security.sccm.client_version — installed|version|service_status

FieldTypeValuesAvailableExampleDescription
installedbool-WindowsfalseWhether the registry reports a ProductVersion for the SCCM client (Windows only; always false off-Windows). Values: true, false.
versionstring-Windows-The installed SCCM client version from HKLM\SOFTWARE\Microsoft\SMS\Mobile Client\ProductVersion, or ”-” if not present. Values: free text or ”-”.
service_statusstring-Windowsnot_foundThe ccmexec Windows service state from a live SCM query (OpenSCManagerW/OpenServiceW/QueryServiceStatusEx). Values: running, stopped, exists, not_found, unavailable.

security.sccm.site — site_code|management_point

FieldTypeValuesAvailableExampleDescription
site_codestring-Windowsnot_configuredThe assigned SCCM site code, from the registry, the enumerated CCM\Authority subkey, or the Microsoft.SMS.Client COM fallback; “not_configured” if none resolve. Values: free text or not_configured.
management_pointstring-WindowsunknownThe current SCCM management point hostname, from the registry, the enumerated CCM\Authority subkey, or the Microsoft.SMS.Client COM fallback; “unknown” if none resolve. Values: free text or unknown.

Result status

This plugin does not set a typed result status; the agent records UNDECLARED and the sample shows UNDECLARED / UNKNOWN /.

Where the data goes

Sample output

Windows — captured: windows Microsoft Windows NT 10.0.26200.0 x64 · bare-metal · 2026-09-07 · SYSTEM · leg-hash 820bfb5e0176

== action=client_version
installed|false
version|-
service_status|not_found
[result_status] UNDECLARED / UNKNOWN

== action=site
site_code|not_configured
management_point|unknown
[result_status] UNDECLARED / UNKNOWN

macOS — captured: macos macOS 26.6.2 arm64 · bare-metal · 2026-09-07 · euid 501 (jsmith) · leg-hash 820bfb5e0176

== action=client_version
sccm|unsupported|Windows SCCM/ConfigMgr client has no macOS equivalent; use Jamf/MDM for macOS device management
[result_status] UNDECLARED / UNKNOWN

== action=site
sccm|unsupported|Windows SCCM/ConfigMgr client has no macOS equivalent; use Jamf/MDM for macOS device management
[result_status] UNDECLARED / UNKNOWN

Linux — captured: linux Debian GNU/Linux 13 (trixie) aarch64 · container · 2026-09-06 · euid 0 · leg-hash 820bfb5e0176

== action=client_version
installed|false
error|platform not supported
[result_status] UNDECLARED / UNKNOWN

== action=site
error|platform not supported
[result_status] UNDECLARED / UNKNOWN

Caveats and known gaps

  1. Windows samples show the absent-client path only. No host reachable for this capture (dev machine or the-rig) has a real SCCM client installed, so not_found/not_configured/unknown are the only Windows values ever observed; test_sccm_win_actions.cpp pins exactly these values for the same reason. The plugin’s own source comment above call_sms_client_method (sccm_plugin.cpp:238) records the live-client COM success path as an unverified code path.
  2. Do not reintroduce the shell-outs. client_version and site previously ran sc query ccmexec and two PowerShell Microsoft.SMS.Client ComObject calls; all three were retired for native Win32/COM calls in Wave 3 PR33d (docs/agent-spawn-sink-manifest.md:326), and zero spawn sites remain.
  3. The Authority-subkey fallback was previously dead code. Before this migration, site’s management-point fallback matched a literal, never-substituted "SMS:{}" string and so never found a subkey; it now genuinely enumerates HKLM\SOFTWARE\Microsoft\CCM\Authority and prefers the subkey matching the resolved site code (sccm_parsers.hpp:40).
  4. No result status is set on any leg. All three samples show UNDECLARED / UNKNOWN /; a caller cannot distinguish “clean absent-client read” from “read failed” via plugin_result_status today — only the per-field sentinel values (not_found, unavailable, not_configured) carry that signal.
  5. classify_service_status is a maintained mirror, not shared code. It stays inside the plugin’s #ifdef _WIN32 block (Windows-typed DWORD/SERVICE_*) and is duplicated with plain types in test_sccm_parsers.cpp; a change to one must be mirrored in the other by hand (sccm_plugin.cpp:85-95).

Source and tests