Windows11下.NET Core服务调用GlobalSystemMediaTransportControlsSessionManager失败
在Windows 11服务中访问GlobalSystemMediaTransportControlsSessionManager的解决方案
问题背景
我需要读取Windows 10/11中当前媒体会话的标题,编写的程序在IDE中运行或手动从控制台启动发布后的.exe时完全正常,但将发布后的.exe注册为Windows服务并启动后,出现以下错误:
指定的服务未作为已安装的服务存在。(0x80070424)
在 Program.$(String[] args) 位置 [...]\Program.cs:第5行
相关代码与配置
Program.cs代码:
using Windows.Media.Control; try { var sm = await GlobalSystemMediaTransportControlsSessionManager.RequestAsync(); var session = sm.GetCurrentSession(); var props = await session.TryGetMediaPropertiesAsync(); while (true) { File.AppendAllText("[...]/log.txt", props?.Title + "\n"); Thread.Sleep(2000); } } catch(Exception e) { File.AppendAllText("[...]/log.txt", e.Message + "\n" + e.StackTrace + "\n"); }
.csproj配置:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net6.0-windows10.0.22000.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> </Project>
发布并注册服务的命令:
dotnet publish .\winrttest\ -c Debug -r win-x64 -f net6.0-windows10.0.22000.0 -o C:\[...] --no-self-contained .\sc.exe create testservice binpath="C:\[...]\winrttest.exe"
问题定位
经多设备测试发现:
- Windows 10设备(3台)上服务运行正常
- Windows 11设备(4台)上全部失败
- 最终确认:Windows 11对UWP API做了限制,非交互式会话(如服务或SYSTEM身份运行的程序)无法调用
GlobalSystemMediaTransportControlsSessionManager这类UWP媒体API
可行解决方案
方案1:改用任务计划程序替代Windows服务
将程序改为普通后台程序,通过任务计划程序配置为用户登录时启动,让程序运行在用户的交互式会话中,即可正常访问UWP媒体API:
- 打开任务计划程序,创建基本任务
- 设置触发器为「用户登录时」
- 操作选择「启动程序」,指向发布后的.exe路径
- 若需要后台运行,可在设置中勾选「隐藏」,但需确保程序关联到当前登录用户的会话
方案2:服务+用户会话代理架构
如果必须保留服务形式,可采用拆分架构:
- 服务端:仅负责监听外部请求或定时触发任务
- 用户代理:一个独立的前台程序,运行在当前登录用户的交互式会话中,负责调用
GlobalSystemMediaTransportControlsSessionManager获取媒体信息 - 服务与代理通过IPC(如命名管道、TCP套接字)通信,服务需要获取数据时,向代理发起请求,代理返回结果后再由服务处理
- 关键是要让代理程序正确附着到用户会话,可通过Windows原生API(如
WTSQueryUserToken获取用户令牌,CreateProcessAsUser启动代理)实现
方案3:使用非UWP替代方案
如果不需要覆盖所有媒体播放器,可针对特定场景使用非UWP API:
- 针对主流播放器(如Spotify、YouTube Music),使用官方提供的第三方SDK或Web API获取播放信息
- 利用Windows音频会话API(MMDeviceAPI)获取当前活跃音频会话,但无法直接获取媒体标题,仅能获取进程名称、音量等基础信息
内容的提问来源于stack exchange,提问作者Seraksab
相关产品推荐
相关产品推荐

