Add Microsoft .NET Desktop Runtime 10 as a Windows Fleet-maintained app - #50361
Add Microsoft .NET Desktop Runtime 10 as a Windows Fleet-maintained app#50361kitzy wants to merge 2 commits into
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #50361 +/- ##
=======================================
Coverage 68.18% 68.18%
=======================================
Files 3938 3938
Lines 251141 251141
Branches 13440 13443 +3
=======================================
Hits 171243 171243
+ Misses 64557 64556 -1
- Partials 15341 15342 +1
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Validation confirmed (and a correction)An earlier run on this branch reported That was my mistake — the Worth flagging for the FMA CI generally: a PR that adds inputs but omits the The exists query correctly separates the bundle from its componentsThe runner surfaced five matching-looking ARP entries at once: Only the last one is the burn bundle — the others are its MSI components, which carry a Note the runner also had 8.0.29 present, and the query correctly ignored it. One caveat on coverageThe runner ships with .NET Desktop Runtime pre-installed, so there is no |
WalkthroughAdded Microsoft .NET Desktop Runtime 10 as a Windows Fleet-maintained app. The change includes Winget input metadata, a generated Windows package manifest, installer and uninstaller behavior, detection and patch-version handling, catalog registration, and a SoftwarePage icon alias. Possibly related issues
Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@ee/maintained-apps/inputs/winget/microsoft-dotnet-desktop-runtime-10.json`:
- Line 5: Update unique_identifier for the Microsoft .NET Desktop Runtime entry
to the exact installed ARP DisplayName used by Fleet, matching programs.name
rather than the generic catalog name; validate against a host record and
regenerate the app lookup entry.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 994f590b-a3c9-4117-87dc-e6a1867a7646
⛔ Files ignored due to path filters (1)
website/assets/images/app-icon-microsoft-dotnet-desktop-runtime-10-60x60@2x.pngis excluded by!**/*.png
📒 Files selected for processing (4)
ee/maintained-apps/inputs/winget/microsoft-dotnet-desktop-runtime-10.jsonee/maintained-apps/outputs/apps.jsonee/maintained-apps/outputs/microsoft-dotnet-desktop-runtime-10/windows.jsonfrontend/pages/SoftwarePage/components/icons/index.ts
| "name": "Microsoft .NET Desktop Runtime 10", | ||
| "slug": "microsoft-dotnet-desktop-runtime-10/windows", | ||
| "package_identifier": "Microsoft.DotNet.DesktopRuntime.10", | ||
| "unique_identifier": "Microsoft Windows Desktop Runtime", |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "Repository files:"
git ls-files | rg '(^|/)ee/maintained-apps/(inputs/winget/microsoft-dotnet-desktop-runtime-10\.json|outputs/apps\.json)$|desktop|dotnet|fma|maintained-apps|unique_identifier|unique_identifier|DisplayName|FMA' | head -200 || true
echo
echo "Target input file:"
if [ -f ee/maintained-apps/inputs/winget/microsoft-dotnet-desktop-runtime-10.json ]; then
nl -ba ee/maintained-apps/inputs/winget/microsoft-dotnet-desktop-runtime-10.json | sed -n '1,80p'
fi
echo
echo "Output app record excerpt:"
python3 - <<'PY'
import json, pathlib
p=pathlib.Path('ee/maintained-apps/outputs/apps.json')
if p.exists():
data=json.loads(p.read_text())
items=data.get('items') or data if isinstance(data, list) else []
for i,item in enumerate(items):
if 'microsoft-dotnet-desktop-runtime-10' in str(item):
print(i, json.dumps(item[:5000], indent=2)[:20000])
print('--- next')
PYRepository: fleetdm/fleet
Length of output: 11128
🌐 Web query:
github.com/fleetdm/fleet maintained-apps unique_identifier installed DisplayName guidance
💡 Result:
In Fleet, the unique_identifier field is a platform-specific identifier used to match Fleet-maintained apps (FMA) with software installed on a host [1][2]. Proper configuration of this field is critical to ensure Fleet correctly links the managed app with the host's software inventory, preventing duplicate software titles or incorrect installation status reports [1]. For Windows, the unique_identifier must generally match the DisplayName found in the Windows Registry (specifically, what osquery reports as programs.name) [1][3]. If the unique_identifier does not match the actual DisplayName of the installed application on the host, Fleet may incorrectly create two separate software titles—one for the Fleet-maintained app and another for the existing inventoried software [1]. To determine the correct unique_identifier for a Windows application, you can use the following PowerShell scripts to check the registry [1]: Machine scope: Get-ItemProperty 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall*' -ErrorAction SilentlyContinue | Where-Object {$.DisplayName -like '* *'} | Select-Object DisplayName, DisplayVersion, Publisher User scope: Get-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall*' -ErrorAction SilentlyContinue | Where-Object {$.DisplayName -like '* *'} | Select-Object DisplayName, DisplayVersion, Publisher If a exact match between the unique_identifier and the DisplayName is not possible, Fleet provides a fuzzy_match_name setting. When fuzzy_match_name is set to true, Fleet will use fuzzy matching to associate the Fleet-maintained app with the inventoried software [1]. Additionally, note that for Windows applications, the unique_identifier behavior has evolved; while traditionally matched on name, newer versions of Fleet may use or prioritize the upgrade_code for software titles where it is available, as matching solely on name can cause issues with version-locked titles [4][5]. For macOS, the unique_identifier typically refers to the application's bundle identifier [6][4].
Citations:
- 1: https://github.com/fleetdm/fleet/blob/main/ee/maintained-apps/README.md
- 2: https://github.com/fleetdm/fleet/blob/main/server/mdm/maintainedapps/sync.go
- 3: https://github.com/fleetdm/fleet/blob/main/.claude/skills/new-fma/SKILL.md
- 4: Windows Fleet-maintained apps: After a Fleet-maintained app is added to a team it shouldn't be available to add again #37802
- 5: Some Windows FMAs generate ineffectual policies due to version number in name #42714
- 6: Initial app manifest structure in GitHub #26080
🌐 Web query:
winget-pkgs Microsoft.DotNet.DesktopRuntime.10 10.0.10 installedName WindowsDesktopRuntimeInstallDisplayName
💡 Result:
The winget package identifier for the.NET 10.0 Desktop Runtime is Microsoft.DotNet.DesktopRuntime.10 [1][2]. Regarding your query about the installed name: when you install the.NET Desktop Runtime using winget, the Windows "Apps & Features" (or "Installed Apps") display name typically follows the pattern: Microsoft Windows Desktop Runtime - () [3]. For the 10.0.10 release, you would expect the display name to be similar to Microsoft Windows Desktop Runtime - 10.0.10 (x64) (or x86/arm64 depending on your system architecture) [4][5][3]. The specific term "WindowsDesktopRuntimeInstallDisplayName" is not a standard winget parameter or a commonly referenced property name in public winget manifests; it appears to be a variable or internal reference name rather than the final display name visible to the user [3]. To install this specific version, you generally use the package ID, which automatically pulls the latest version within the 10.0 release family [1][2]. If you need to verify what is currently installed, you can run the command: winget list Microsoft.DotNet.DesktopRuntime.10 [6] This will show you the exact version and name recognized by the package manager on your system [6].
Citations:
- 1: https://learn.microsoft.com/en-us/dotnet/core/install/windows
- 2: https://github.com/dotnet/docs/blob/main/docs/core/install/windows.md
- 3: https://github.com/microsoft/winget-pkgs/blob/master/manifests/m/Microsoft/DotNet/DesktopRuntime/6/6.0.32/Microsoft.DotNet.DesktopRuntime.6.installer.yaml
- 4: https://dotnet.microsoft.com/en-us/download/dotnet/10.0
- 5: https://github.com/dotnet/core/blob/main/release-notes/10.0/10.0.10/10.0.10.md
- 6: Winget identifies wrong version for Microsoft.DotNet.DesktopRuntime.6 microsoft/winget-cli#4470
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "Target input file:"
if [ -f ee/maintained-apps/inputs/winget/microsoft-dotnet-desktop-runtime-10.json ]; then
cat -n ee/maintained-apps/inputs/winget/microsoft-dotnet-desktop-runtime-10.json
else
echo "missing target input"
fi
echo
echo "Similar dotnet desktop runtime inputs:"
for f in $(find ee/maintained-apps/inputs/winget -maxdepth 1 -type f -name '*dotnet*desktop*' | sort); do
echo "--- $f"
cat -n "$f" | sed -n '1,60p'
done
echo
echo "Fleet FMA guidance references:"
for f in ee/maintained-apps/README.md .claude/skills/new-fma/SKILL.md .github/scripts/detect-new-fma-in-pr.sh changes/48054-fma-duplicate-software-titles changes/44406-windows-fma-title-matching; do
if [ -f "$f" ]; then
echo "--- $f"
grep -n -i -C 3 'unique_identifier\|DisplayName\|programs\.name\|Windows FMA\|duplicate software titles\|ARP\|registry' "$f" | sed -n '1,180p' || true
fi
done
echo
echo "Sync/matching code references:"
if [ -f cmd/maintained-apps/validate/windows.go ]; then
cat -n cmd/maintained-apps/validate/windows.go | sed -n '1,220p'
fi
if [ -f cmd/maintained-apps/main.go ]; then
grep -n -i -C 3 'unique_identifier\|windows\|programs\|DisplayName\|existing' cmd/maintained-apps/main.go || true
fi
echo
echo "Exact installed/app names in maintained app inputs (WinGet selected_display_name or unique_identifier):"
python3 - <<'PY'
import json, pathlib
for p in sorted(pathlib.Path('ee/maintained-apps/inputs/winget').glob('*.json')):
data=json.loads(p.read_text())
if 'desktop' in str(p).lower() or 'dotnet' in str(p).lower():
print(p)
for key in ['wid', 'selected_display_name','unique_identifier','exists_query','fuzzy_match_name']:
if key in data:
print(" ", key, data[key])
PYRepository: fleetdm/fleet
Length of output: 35805
🌐 Web query:
raw.githubusercontent.com/microsoft/winget-pkgs/master/manifests/m/Microsoft/DotNet/DesktopRuntime/10/10.0.10/Microsoft.DotNet.DesktopRuntime.10.installer.yaml
💡 Result:
The file path you referenced, raw.githubusercontent.com/microsoft/winget-pkgs/master/manifests/m/Microsoft/DotNet/DesktopRuntime/10/10.0.10/Microsoft.DotNet.DesktopRuntime.10.installer.yaml, corresponds to the WinGet package manifest for the.NET 10.0 Desktop Runtime version 10.0.10 [1]..NET 10.0.10 is an official servicing update for the.NET 10 platform [2]. It was released by Microsoft on July 14, 2026 [2][3][4], as part of their monthly patch cycle [2]. This version serves as the latest patch release for the.NET 10 Long Term Support (LTS) release [4][5]. The.NET Desktop Runtime 10.0.10 enables the execution of existing Windows desktop applications on systems where.NET 10 is required [6]. As of July 31, 2026,.NET 10.0.10 is the current patch level for the.NET 10 release track [4][5]. Users can manage the installation of this runtime on Windows systems using the Windows Package Manager (WinGet) with the command: winget install Microsoft.DotNet.DesktopRuntime.10 [1]
Citations:
- 1: https://learn.microsoft.com/en-us/dotnet/core/install/windows
- 2: .NET July 2026 Updates dotnet/announcements#425
- 3: https://github.com/dotnet/core/blob/main/release-notes/10.0/README.md
- 4: https://dotnet.microsoft.com/en-us/download/dotnet
- 5: https://dotnet.microsoft.com/en-us/platform/support/policy/dotnet-core
- 6: https://dotnet.microsoft.com/en-us/download/dotnet/10.0
Set unique_identifier to the exact installed ARP name.
Fleet Windows FMAs require unique_identifier to match programs.name (DisplayName), not the generic catalog name. The current value can create separate software titles for Fleet-maintained installs and inventoried .NET Desktop Runtime entries. Use a validation host record exactly as Fleet sees it, then regenerate the app lookup entry.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@ee/maintained-apps/inputs/winget/microsoft-dotnet-desktop-runtime-10.json` at
line 5, Update unique_identifier for the Microsoft .NET Desktop Runtime entry to
the exact installed ARP DisplayName used by Fleet, matching programs.name rather
than the generic catalog name; validate against a host record and regenerate the
app lookup entry.
Related issue: Resolves #50360
Adds Microsoft .NET Desktop Runtime 10 as a Windows Fleet-maintained app, from winget
Microsoft.DotNet.DesktopRuntime.10(10.0.10, WiX burn bundle, x64).This closes the gap opened by HandBrake (#50323 / #50352). HandBrake requires the .NET Desktop Runtime and its install script now hard-fails without it, but Fleet had no FMA that could satisfy that — we ship
microsoft-dotnet-runtime-8/-10, which are the base runtime, a different package with its own Add/Remove Programs entry. The customer's ManageEngine catalog also deploys the Desktop Runtime directly.Verification
The winget manifest supplies
AppsAndFeaturesEntries, and I confirmed each value against the real installer by extracting the burn bundle's registration data:e82fc901…84d1).DisplayNamecarries both version and architecture, so the exists query uses the sameLIKE 'Microsoft Windows Desktop Runtime 10.%' AND name LIKE '%(x64)'shape as the existing base-runtime FMAs.use_display_version_for_patchis required here. The registryDisplayVersionis10.0.10.50000but the winget package version is10.0.10. Without the flag the patch policy would compare against the marketing version and mis-order against what osquery reports. The generated patched query correctly compares against10.0.10.50000.Reuse rather than duplication
microsoft_dotnet_runtime_install.ps1/_uninstall.ps1unchanged. The Desktop Runtime is the same burn bundle shape, and the uninstaller already resolves the bundle from the injected$PACKAGE_IDwith a Package Cache fallback. Those scripts are already shared by the two base-runtime FMAs, so this follows the existing pattern rather than adding a near-identical copy.MicrosoftDotnetRuntimecomponent and its.NETartwork. The burn bundle only carries a 32×32 icon, so extracting one would have meant shipping a blurry upscale of the same logo.The new map key is
"microsoft .net desktop runtime"(no version). Icon lookup is a loose prefix match —s === key || s.startsWith(key + " ")— so one key covers 10 and any future major, mirroring how"microsoft .net runtime"already serves both base-runtime FMAs. It is longer than that key, and lookup sorts longest-first, so the desktop runtime cannot be mis-matched to the base runtime icon.Checklist for submitter
Summary by CodeRabbit