阅读这篇文章你可以了解:
- 降权操作,Windows服务进程中以低权限创建进程
[toc]
背景说明
在服务程序中调用了某一个程序的安装程序,由于权限的问题,这个安装程序也继承了服务的 SYSTEM 权限,导致安装程序与预期不符合。
解决方案
最终实现的目标就是在服务中以普通用户的权限去启动安装程序,要以普通用户去启动,就涉及到降权的问题,需要获取用户的信息。在任务管理器详细信息中可以看到,资源管理器是以普通用户的身份启动的,因此可以在服务中以 Explore.exe 的权限去调用安装程序。
实现逻辑
此逻辑也可以用于解决 UAC 弹窗的问题。
- 获取token
- 通过token获取用户的会话ID
- 通过token和ID启动进程
代码
接口
最终调用的接口为: CreateProcessAsUser
1 | int ExecutePackage(LPCSTR pszPath, LPCSTR pszParams) |
实现
实现如下所示:
1 | /* |
判断token是否被提升:
1 | BOOL IsElevatedToken(HANDLE hToken, PBOOL pbElevated) |
获取资源管理器的 token
1 |
|
给本进程特权,以便访问系统进程
1 | /* |
设置当前进程的会话信息:
1 | bool CreateProcessAsSystemBySession(LPCTSTR pszAppName, LPCTSTR pszCmd, LPCTSTR pszCwd, DWORD dwSession, HANDLE hEnvToken) |
调用接口创建进程:
1 | typedef BOOL(STDMETHODCALLTYPE FAR* LPFNCREATEENVIRONMENTBLOCK) (LPVOID* lpEnvironment, HANDLE hToken, BOOL bInherit); |