rds-profile-triage — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited rds-profile-triage (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Targets Windows RDS session hosts over WinRM (with a CIM-over-DCOM fallback). The bundledscripts/Invoke-RdsProfileTriage.ps1collects read-only health data, computes deterministic severity-rankedfindings, and renders a uniform triage report itself — so the output is identical every run and the agent just relays it (and decides remediation). The script never calls an LLM and changes nothing.
SCRIPT = this skill's scripts/Invoke-RdsProfileTriage.ps1. It requires PowerShell 7+ (pwsh).
RDS profile triage is a minefield of measurement traps that produce confident-but-wrong root causes. This skill bakes the corrections in — read the `caveats` array in the output before concluding anything, and see REFERENCE.md for the full list. The big four:
Get-ItemProperty expands `%USERNAME%` in the calling account's context. Read as admin, a perfectly correct \\FS01\profiles$\%USERNAME%\... looks hardcoded to the admin — a classic false "the GPO is broken" call. The script reads it raw; trust roaming_profile.machine_profile_path_raw.user_class=self_or_admin.ProfileList entries (empty ProfileImagePath, .bak pointing at deleted temp dirs) → the user profile can't be built → wsmprovhost never registers its COM class → WinRM "could not launch a host process" (Event 86) + DCOM 10000 "error 0". So a broken WinRM endpoint can be a profile problem. The script detects the corruption and the host-launch events together.Always run with pwsh. The script prompts for the tier-admin credential (reused for all hosts, never stored). Parse the JSON on stdout.
| Want | Pass | ||
|---|---|---|---|
| One host | -ComputerName RDS01 | ||
| A farm | -ComputerName RDS01,RDS02 or -ServerListFile C:\ops\rds.txt | ||
| Time window for events | -Hours 24 (default) · -Since '2026-06-15T00:00' · -From <dt> -To <dt> | ||
| WinRM host won't launch on a box | -Protocol Dcom (reduced CIM/DCOM collection: uptime, drain, roaming-raw, ProfileList corruption) | ||
| Output shape | -Format text (default — uniform human report) · -Format json · -Format both | ||
| Save full JSON | -OutFile C:\ops\rds.json (full detail to file; stdout still follows -Format) | ||
| Auth/transport | `-Authentication Negotiate\ | Kerberos\ | CredSSP (default Default`) |
| Tuning | -TempSampleSize 10 · -MaxCorruptListed 20 · -MaxMessageLength 400 |
# Single host, last 24h
pwsh -File SCRIPT -ComputerName RDS01
# Two-host farm, 48h window, full detail to a file
pwsh -File SCRIPT -ComputerName RDS01,RDS02 -Hours 48 -OutFile C:\ops\rds.json
# The host's own WinRM is dead ("could not launch a host process") — go in over DCOM
pwsh -File SCRIPT -ComputerName RDS01 -Protocol DcomThe script does the formatting so every run looks the same — the agent does not re-summarize.
== FINDINGS (ranked) ==, == PER-HOST ==, == COVERAGE GAPS ==, == CAVEATS ==. This is the output you relay.-OutFile, a compact summary on stdout + full detail in the file).--- JSON ---, then the JSON.-Format is.JSON key fields (for -Format json/digging): summary.findings, summary.failures (each with a hint), per host roaming_profile.machine_profile_path_raw, hive_leak, temp_profiles, profilelist, profile_events (grouped by user + user_class), winrm_host_launch, and the top-level caveats. Full schema in REFERENCE.md.
Keep it minimal — the report is already uniform and complete:
-Format text) and relay the report as-is. Do not reformat, re-rank, or re-summarize it — that's the script's job and the whole point of consistent output. At most add a one-line lead.FAILED - ... could not launch a host process, re-run that host with `-Protocol Dcom` (the report's hint says so) and relay the second report.Get-Credential cancelled → re-run and supply the tier-admin credential.-Protocol Dcom; check profilelist in the result.TrustedHosts message or 0x80090311) → run from a domain-joined admin host, or add the FQDNs to WinRM TrustedHosts (scope to specific hosts, not *), or use -Protocol Dcom. See REFERENCE.md.pwsh not found → install PowerShell 7 (winget install Microsoft.PowerShell); the repo installer auto-installs it.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.