You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:服务+用户会话代理架构

如果必须保留服务形式,可采用拆分架构:

  1. 服务端:仅负责监听外部请求或定时触发任务
  2. 用户代理:一个独立的前台程序,运行在当前登录用户的交互式会话中,负责调用GlobalSystemMediaTransportControlsSessionManager获取媒体信息
  3. 服务与代理通过IPC(如命名管道、TCP套接字)通信,服务需要获取数据时,向代理发起请求,代理返回结果后再由服务处理
  4. 关键是要让代理程序正确附着到用户会话,可通过Windows原生API(如WTSQueryUserToken获取用户令牌,CreateProcessAsUser启动代理)实现

方案3:使用非UWP替代方案

如果不需要覆盖所有媒体播放器,可针对特定场景使用非UWP API:

  • 针对主流播放器(如Spotify、YouTube Music),使用官方提供的第三方SDK或Web API获取播放信息
  • 利用Windows音频会话API(MMDeviceAPI)获取当前活跃音频会话,但无法直接获取媒体标题,仅能获取进程名称、音量等基础信息

内容的提问来源于stack exchange,提问作者Seraksab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 08:42:46