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

C#如何获取远程桌面/Citrix环境下程序调用者的Session ID

C# 获取调用者会话ID的可行实现方案

核心问题说明

你之前的逻辑失效是因为遍历了所有活跃会话匹配状态,多用户场景下无法定位到和当前调用者绑定的唯一会话,不需要全量遍历会话列表,直接关联调用上下文对应会话即可。

方案1:普通桌面/控制台程序场景(最简实现)

如果你的exe是由调用用户直接启动的,不需要调用WTS API,.NET 原生提供了直接获取当前进程所属会话ID的属性,支持.NET Framework 2.0+、.NET Core 3.0+、.NET 5+所有版本:

using System.Diagnostics;

// 直接返回启动当前exe的用户所属的会话ID,多活跃会话场景下也完全准确
public static int GetCallerSessionId()
{
    return Process.GetCurrentProcess().SessionId;
}

方案2:系统服务跨会话调用场景

如果你的程序是运行在Session 0的系统服务,需要获取调用服务的客户端用户会话ID,按以下步骤实现:

  • 首先从RPC/命名管道/自定义通信上下文里获取调用者的进程PID
  • 直接通过PID查询对应进程的会话ID即可,无需遍历全量会话:
using System.Diagnostics;

public static int GetCrossSessionCallerSessionId(int callerPid)
{
    using (var callerProcess = Process.GetProcessById(callerPid))
    {
        return callerProcess.SessionId;
    }
}

可选校验逻辑

如果需要确认会话ID归属,可以调用WTS API的WTSQuerySessionInformation方法,传入拿到的会话ID查询对应的用户名、域信息,和调用者的身份凭证做二次匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 23:30:03