windows会话id–穿透session隔离
背景
在做项目的过程中,遇上的问题,记录一下。有一个程序getCode.exe需要开机自启动,这个程序是有一些用户交互的。
一开始的时候,我这边直接使用nssm创建服务,开机自启动这个服务,拉起来getCode.exe,但是发现,getCode.exe开机自启动之后,居然对用户的输入毫无反应;但是如果是电脑开机之后,手动启动getCode.exe程序,就可以正常接收用户输入并作出后续操作。
于是开始从网上找各种信息排查,发现网友提到了会话ID,于是打开任务管理器去确认,发现如果是通过nssm直接创建服务拉起来的getCode.exe进程的会话ID是0,但是如果在开机后手动启动getCode.exe的会话ID是1,而开机后的当前用户的会话ID就是1,经过确认,就是会话ID导致的问题。
于是我们需要再写一个程序setExeSID.exe,这个setExeSID.exe主要负责的就是以指定的会话ID来启动getCode.exe程序,然后将setExeSID.exe通过nssm创建服务开机自启动,当服务开机自启后,拉起来setExeSID.exe,此时setExeSID.exe进程的SID为0,然后setExeSID.exe这个进程再指定以SID为1启动getCode.exe,这样的话,getCode.exe既实现了开机自启动,又实现了开机启动后SID是1(和当前登录的用户的SID)保持一致,可以和用户有输入输出的交互。
会话id
简单的说,用户登陆到windows系统之后,不管该用户是本地登陆的,还是远程登陆,系统都会为这个用户分配一个新的会话ID(SID)。也就是说会话与用户的登录是相关连的,没有用户登录就不存在会话。因此,会话的含义是指用户登录之后的一种运行的环境。
1.查看会话id
打开“任务管理器”–》“查看”–》“选择列”–》“会话ID”前的方框打钩,即可在任务管理器查看到每个进程的会话ID
2.通过代码指定SID
主要使用到的函数如下:
1 |
|
总结
session 0会话隔离的问题,在这个项目之前,虽然有一点耳闻,但是在一开始排查这个问题的时候,确实没有往这个方向上想,后来也是查了很多资料之后,才把问题的方向转向这个思路。经过这次,可以说,当windows上开发应用程序时,如果需要这个应用程序开机自启动,而且这个程序又在启动后需要有用户交互,那么就需要考虑会话隔离的问题。
参考资料
关于突破SESSION 0隔离创建进程
https://cloud.tencent.com/developer/article/1424933
这个链接下总结了用户权限设置和进程权限提升,讲的很细致,提权demo也可参考
https://blog.csdn.net/yockie/article/details/17029293
这个链接下,总结了window API
http://yfvb.com/help/win32sdk/index.htm?page=html/_qx5ll.htm