pchome2000 发表于 2018-8-30 10:16:36

[已解决]如何判断当前桌面是远程桌面?

本帖最后由 pchome2000 于 2018-9-3 09:28 编辑

如何判断当前桌面是远程桌面

redapple2008 发表于 2018-8-30 11:01:06

首先,获得当前进程所在的 session id,具体步骤是
1.打开进程自身的 token,
HANDLE hToken = NULL;
HANDLE hProcess = GetCurrentProcess();
OpenProcessToken(hProcess, TOKEN_QUERY, &hToken);

2. DWORD dwTokenSessionId;
                        DWORD dwTsSize = 0;
    GetTokenInformation(hToken, TokenSessionId, &dwTokenSessionId, sizeof(dwTokenSessionId), &dwTsSize));//TokenSessionId 是一个系统常量,可能需要最新的 SDK,

3. 现在已经得到token结构中的 session id, 也就是你的进程所在的 session



如果系统是 2000, 由于不支持用户切换所以 console session 始终是 0, 如果当前 session 不是0 那么就是 RDP session.

如果系统是 xp 以上, 你可以使用 WTSGetActiveConsoleSessionId 检查 console session id 如果和当前 session id 不一致那么就是运行在 RDP session

WTSGetActiveConsoleSessionIdAPI 需要最新的 sdk ,如果没有安装的话可以自己从 kernel32.dll load.

转别人的帖子,没看明白

redapple2008 发表于 2018-8-30 11:02:26

判断当前进程的用户,如果是"System"则假定他为远程桌面上运行。

redapple2008 发表于 2018-8-30 11:09:39

Windows驱动中判断Session是否是远程Session
   
    用户态调用GetSystemMetrics(SM_REMOTESESSION)就可以知道当前是否处于远程桌面环境。
    内核态没有类似的函数,就需要通过其它的方法判断了。
   
    首先使用PsGetThreadSessionId,或者PsGetProcessSessionId,或者SeQuerySessionIdToken
    可以很容易的得到进程的Session。
    SharedUserData(类型KUSER_SHARED_DATA)有一个成员ActiveConsoleId,就是当前控制台Session的ID。
    进程Session的ID与ActiveConsoleId比较一下即可知道进程Session是否是远程桌面的Session。
   
    Windows有一个名字为Remote Interactive Logon的组,SID为S-1-5-14,
    一般情况下远程桌面的进程令牌中会保护这个组。当时如果当前Session是
    一个被Shadow的Session,则进程令牌中不会保护这个组。因为Windows不会
    在Session在Shadow后更改已存在进程的令牌。

pchome2000 发表于 2018-8-30 11:19:23

不知道如何判断当前用户的会话ID, 如当前用户的会话ID=1, 即为远程桌面

redapple2008 发表于 2018-8-30 11:22:13

用这个试试了。 _WinAPI_GetSystemMetrics($SM_REMOTESESSION)

redapple2008 发表于 2018-8-30 11:24:08

Global Const $SM_REMOTECONTROL = 0x2001
Global Const $SM_REMOTESESSION = 0x1000
定义一下,这个我也没明白。不过我测试没问题

pchome2000 发表于 2018-8-30 11:35:00

谢谢,我测试一下。         

pchome2000 发表于 2018-8-30 11:42:23

redapple2008 发表于 2018-8-30 11:24
Global Const $SM_REMOTECONTROL = 0x2001
Global Const $SM_REMOTESESSION = 0x1000
定义一下,这个我也 ...

判断当前会话ID是否等于1,会话ID=1即为远程桌面

redapple2008 发表于 2018-8-30 11:50:00

pchome2000 发表于 2018-8-30 11:42
判断当前会话ID是否等于1,会话ID=1即为远程桌面

难道不是吗?
页: [1]
查看完整版本: [已解决]如何判断当前桌面是远程桌面?