[!] This project is provided as-is, without warranties or guarantees of any kind, and has not been validated in a production environment unless explicitly stated otherwise. You are solely responsible for evaluating, testing, securing, and operating it safely in your environment and for verifying compliance with any legal, regulatory, or contractual requirements. By using this project, you accept all risk, and the authors and contributors assume no liability for any loss, damage, outage, misuse, or other consequences arising from its use. [!]
YMC is an agentless Windows Server compliance scanner. It connects to remote hosts over WinRM, runs security checks, and generates HTML or JSON reports with the evidence captured for each check.
- Scan one host, a comma-separated host list, or a CSV file of targets.
- Map checks to multiple frameworks through YAML profiles in
profiles/. - Generate per-host reports and a combined summary report.
- Run without installing an agent on the target Windows host.
- YMC does not remediate findings.
- YMC does not guarantee framework certification or audit acceptance.
- YMC does not replace host hardening, patching, or manual review.
- YMC does not currently scan Linux, cloud platforms, or network devices.
Controller machine:
- Python 3.10+
- Network access to target hosts over WinRM
- Credentials with permission to read security-relevant settings and logs
Target hosts:
- WinRM enabled on TCP 5985 (HTTP) or 5986 (HTTPS)
- PowerShell available
- The operator understands the target environment and has authorization to scan it.
- The framework profile selected for a scan matches the environment being reviewed.
- Output generated by YMC is one input to an audit or review process, not the entire process.
- Create and activate a virtual environment.
- Install dependencies.
- Optionally configure the tracked pre-commit hook for secret scanning.
python -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
git config core.hooksPath .githooksReference docs:
docs/environment_variables.mddocs/settings_reference.mddocs/hosts_template.csvdocs/hosts_example.csv
List compliance profiles:
python main.py --list-profilesList named config profiles:
python main.py --list-configsScan one host:
python main.py --host web01.corp.local --username CORP\\auditor --profile nist_800_53Scan multiple hosts:
python main.py --host web01,db01,dc01 --domain corp.local --username CORP\\auditor --profile pci_dss_4Scan from CSV:
python main.py --csv docs/hosts_example.csv --profile iso_27001 --format bothWrite reports to a custom directory:
python main.py --host web01 --username CORP\\auditor --output-dir ./reports --format bothEach scan creates a timestamped output directory containing:
- Per-host HTML and/or JSON reports
- A combined summary HTML report when at least one host scan succeeds
- Exit code
0when the scan completes with no failing findings - Exit code
1for configuration, connection, or runtime failure - Exit code
2when the scan completes and one or more checks fail
Settings are resolved in this order:
- CLI flags
- Environment variables (
COLLECTOR_*) - Named config profile (
--config) - Personal settings (
~/.ymc/settings.yaml) - Program defaults (
config/settings.yaml)
See docs/environment_variables.md and docs/settings_reference.md for the
full option reference.
Run the regression tests:
python -m pytest -qRun the local quality gate:
./check.shcheck.sh enforces:
- Git hygiene checks for staged diffs, file modes, suspicious paths, staged artifacts, line endings, and optional secret scans
ruff formatruff checkbanditgitleakswhen installedpip-audit- Shell syntax checks and optional
shellcheck - Markdown text and relative-link validation
- JSON, YAML, and TOML syntax validation
- Layered pytest execution over the repo's available test scopes
STRICT_MODE=1 ./check.sh enables a stricter variant that also requires a
clean unstaged worktree and turns missing optional tools into failures.
The tracked pre-commit hook at .githooks/pre-commit runs gitleaks against
staged changes when Git is configured to use that hooks path.
Verify local setup:
gitleaks version
git config --get core.hooksPathManual scans:
gitleaks detect --source . --config .gitleaks.toml --redact --verbose
gitleaks protect --staged --config .gitleaks.toml --redact --verbosepip-auditrequires outbound network access to vulnerability sources.- WinRM failures usually indicate disabled WinRM, blocked firewall rules, or incorrect credentials.
- If terminal output looks wrong, run with
--no-colorand verify the shell is using UTF-8. - If
--list-configsreturns no user profiles, confirm~/.ymc/profiles/exists and contains.yamlfiles.
- Most automated coverage is still focused on CLI, config-resolution, and CSV target-loading behavior rather than live WinRM collection against Windows hosts.
- The tool is Windows-only today and does not provide Linux, macOS, or cloud collection.
- Some checks depend on target-specific Windows features, services, or PowerShell modules and may return warnings or errors when those are absent.
See DISCLAIMER.md.
MIT