windows Service启动带有管理员权限的GUI进程
事情是这样的,公司的产品有个守护进程(windows Service)需要启动产品的主程序exe,让主程序它运行为管理员权限(因为主程序会加载一个插件,插件中有列出端口监听的功能,需要由端口查找到进程PID,由进程PID查找进程名或进程镜像路径,这些对于一些特殊进程例如svchost需要有管理员权限才能查到进程名和路径)。windows下的程序是不能在运行时获得管理员权限的,只能在创建进程的时候提升为管理员权限。如果是普通进程运行一个管理员权限程序,可以调用ShellExcute API。双击鼠标运行exe,可以在manifest文件中加入invoker admin,UAC 会提示用户以管理员权限运行。但是,特殊就在这里了!!守护进程是windows service,service不能调用ShellExcute来创建进程,如果这样,就会会失败。需要调用CreateProcessAsUser API来创建进程,这个API的普通用法,不能创建带有管理员权限的程序,需要一丁点特殊用法,如下:
bool createProcessWithAdmin(const std::string & process_name, LPPROCESS_INFORMATION process)
{
HANDLE hToken = NULL;
HANDLE hTokenDup = NULL; if (process_name.empty()) {
return false;
} if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken))
{
return false;
} if (!DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityAnonymous, TokenPrimary, &hTokenDup))
{
CloseHandle(hToken);
return false;
} STARTUPINFO si;
LPVOID pEnv = NULL;
DWORD dwSessionId = WTSGetActiveConsoleSessionId(); ZeroMemory(&si, sizeof(STARTUPINFO)); if (!SetTokenInformation(hTokenDup, TokenSessionId, &dwSessionId, sizeof(DWORD)))
{
CloseHandle(hToken);
CloseHandle(hTokenDup);
return false;
} si.cb = sizeof(STARTUPINFO);
si.lpDesktop = "WinSta0\\Default";
si.wShowWindow = SW_SHOW;
si.dwFlags = STARTF_USESHOWWINDOW; if (!CreateEnvironmentBlock(&pEnv, hTokenDup, FALSE))
{
CloseHandle(hToken);
CloseHandle(hTokenDup);
return false;
} if (!CreateProcessAsUser(hTokenDup, process_name.c_str(), NULL, NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT,
pEnv, NULL, &si, process))
{
CloseHandle(hToken);
CloseHandle(hTokenDup);
return false;
} if (pEnv)
{
DestroyEnvironmentBlock(pEnv);
} CloseHandle(hToken);
CloseHandle(hTokenDup);
return true;
}
用法:
PROCESS_INFORMATION pi;
createProcessWithAdmin("D:/absolute-path-exe", &pi);
用以上的代码就能用windows服务进程创建带有管理员权限的主GUI程序了。
另外windows service推荐用Qt的解决方案,编写windows service更简单了: https://github.com/qtproject/qt-solutions
references:
http://stackoverflow.com/questions/6418791/requesting-administrator-privileges-at-run-time
http://blog.csdn.net/woshinia/article/details/7850295
http://stackoverflow.com/questions/6261427/how-to-run-a-process-as-an-administrator-from-win32-c
http://blog.csdn.net/breeze_vickie/article/details/4334257
https://stackoverflow.com/questions/267838/how-can-a-windows-service-execute-a-gui-application
windows Service启动带有管理员权限的GUI进程的更多相关文章
- Windows 无法启动MongoDB服务 错误1067:进程意外终止
1:Windows 无法启动MongoDB服务 错误1067:进程意外终止 2:解决方法: 进入MongoDB安装目录\data\将此文件夹下的mongod.lock删除(网友提供解决方案,实验之后貌 ...
- [Windows]VS2010如何以管理员权限启动?(转)
在某些项目进行开发的时候,需要提升应用程序本身的权限,这个是很容易的.但是如何让VS2010启动的时候就已管理员权限运行程序呢?为这个问题苦恼了好久,终于找到了办法. 找到VS2010的快捷方式:右击 ...
- WIN8,开机启动 需要管理员权限的程序
1. 用WPF开发,需要管理员权限并开机启动,以写注册表的方式实现.仅写注册表只能启动一般权限的程序. 2. 考虑这样实现: 程序以一般权限启动,启动以后申请管理员权限. 实现: App类中重写OnS ...
- window 10 删除带有管理员权限的Oracle文件夹
因为文件已经被删除就不附图解释了 因为文件安装的方式错误,所以本是按照正常步骤卸载Oracle,前面的禁用Orace服务与删除Oracle注册表都没有出错,但到最后一步---------Oracle文 ...
- Windows Service 访问远程共享权限设置
最近为实现共享目录之间的文件同步,开发了一个Windows Service. 考虑到在拷贝过程中,如果网络忽然抽风访问不了,导致文件拷贝不完整的情况,果断抛弃.Net 自带的 COPY 方法,而使用D ...
- Windows 8提升普通管理员权限为超级管理员权限以及激活超级管理员Administrator
在Windows 8下运行某些操作时(比如删除一些文件或者更改某些系统设置时)系统会提示我们权限不够.须要Administrator账户的权限. 相信很多其它的使用者都会觉得自己当前使用的账户已经是系 ...
- windows Service 之调试过程(附加到进程里调试,而且启动时间不能超过30秒)
最近第一次用C#写了一个windows service ,其实实现的内容比较简单.就是启动remoting 连接,但是调试相对初次写windws service 的我来说,比较烦.没有经验,而且没办法 ...
- MySQL的安装(比较详细的安装步骤,包括客户端和服务端的安装,还有环境变量的配置以及使用Windows service启动MySQL)
1.MySQL官网下载操作系统对应的MySQL安装包,解压之后就可以直接使用(免安装). MySQL安装包,一种是MySQL Enterprise Edition (commercial)企业版,还有 ...
- 使用程序控制windows service启动/停止
1.首先加入引用: using System.ServiceProcess; 2.控制启动服务: public void Start() { var timeout = TimeSpan.FromSe ...
随机推荐
- DevExpress ChartControl控件实现图表【转】
1.饼状图图 1.1添加ChartControl控件 在工具箱中找到ChartControl控件,拖到窗口中,创建Pie: 1.2准备数据 private DataTable CreateChartD ...
- GIST特征描述符使用
来源:http://www.cnblogs.com/justany/archive/2012/12/06/2804211.html 一种场景特征描述 场景特征描述? 通常的特征描述符都是对图片的局部特 ...
- 二叉树 遍历 先序 中序 后序 深度 广度 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- PHP操作数据库函数比较
常用的php语法连接mysql如下 <?php $link = mysql_connect('localhost', 'user', 'password'); mysql_select_db(' ...
- [asp.net]C#实现json的序列化和反序列化
在做asp.net和unity进行http通信的时候,当unity客户端发出表单请求的时候,我要将他要请求的数据以json的格式返回给客户端,让客户端来解析.服务器端这一块就涉及到json的序列化和反 ...
- Java-Shiro(一):简介
简介 Apache Shiro是Java的一个安全权限框架. Shiro可以非常容易的开发出足够好的额应用,其不仅可以用在JavaSE环境,也可以用在Java SE环境. Shiro可以完成:认证.授 ...
- Spring(十二):IOC容器中Bean的生命周期方法
IOC容器中Bean的生命周期方法 1)Spring IOC容器可以管理Bean的声明周期,Spring允许在Bean生命周期的特定点执行定制的任务. 2)Spring IOC容器对Bean的生命周期 ...
- 测试数据——有效范围(2)
测试数据库搞好,学习了一下逾期率的官方定义: • 对于某支标,如果某一期没有正常还款,则悲观逾期率=所有未还本金/借款本金: • 对于一批标,悲观逾期率=当前逾期标的所有未还本金/借款本金: • 以3 ...
- Direct2D教程III——几何(Geometry)对象
目前博客园中成系列的Direct2D的教程有 1.万一的 Direct2D 系列,用的是Delphi 2009 2.zdd的 Direct2D 系列,用的是VS中的C++ 3.本文所在的 Direct ...
- PC 微信扫码登陆
目录 1.注册微信开发平台 2.微信开发平台添加网站应用 3.PC微信登录流程介绍 4.获取用户基本信息(UnionID机制) 1.注册微信开发平台 官网网址 自行注册,需要注意的是注册邮箱号不用与腾 ...