不是管理员权限的进程启动一个具备管理员权限的EXE
来源:互联网 发布:智能电视 视频软件 编辑:程序博客网 时间:2024/06/05 06:22
Win7下普通权限进程动态提升权限
一、前提
在Vista/Win7下,加强了对安全的管理,对注册表修改,系统目录的文件操作,都需要管理员权限才能完成(当然虚拟存储机制,表面上也相当于能操作)。所以,对于程序中有相关操作的,这时候,就要求我们的程序必须拥有管理员权限。通过mainfest文件,我们可以让程序总是需要管理员权限执行,但是,这将导致程序每次运行时,都需要弹出UAC框老骚扰用户,另外,有时候我们的程序只是在某一些时刻才需要管理员权限来运行,大部分时候只要普通权限就可以了。鉴于此,我们有必要让我们的程序,在运行的过程中,动态的来提升权限。二、原理方法
要动态的提升程序的权限,很遗憾的是,Microsoft并没有提供这样的方法(至少我没找到),也就是,程序的运行权限,在启动时就已经决定了。于是我们想要动态提升权限,理论上是不可能的!
本文章介绍一种方法,来模拟实现这样的功能,让整个程序跑起来,就像是在动态提升权限一样。只要在需要执行管理员权限的操作时,以管理员权限启动一个新进程,把操作交给新进程去完成。启动的新进程,最好就是本进程的新实例,这样在以管理员权限启动的新进程弹出的UAC框上可以看到程序名和数字签名,都能表示就是同一个程序,来达到动态“提升”进程权限的效果。
三、实现
1. 进程启动时,根据命令行参数来区分,是按正常模式启动还是提升权限之后的模式启动。
2. 本身进程与高权限进程之间,产用Message:WM_COPYDATA进行通信,由于Vista/Win7下,限制了不同权限进程之间的发送消息,需要向Window Message Filter添加WM_COPYDATA。
// 允许Vista/Win7下,不同权限进程间发送消息:WM_COPYDATA
typedef BOOL (WINAPI FAR *ChangeWindowMessageFilter_PROC)(UINT,DWORD);
ChangeWindowMessageFilter_PROC m_pfnChangeWindowMessageFilter;
m_pfnChangeWindowMessageFilter =
(ChangeWindowMessageFilter_PROC)::GetProcAddress (::GetModuleHandle(_T("USER32")),"ChangeWindowMessageFilter");
if (m_pfnChangeWindowMessageFilter)
{
m_pfnChangeWindowMessageFilter(WM_COPYDATA, 1/*Add*/);
}
3. 以高权限启动新进程
#include <Windows.h>
#include <atlconv.h>
#include <tchar.h>
#include <iostream>
using namespace std;
//编译的字符集选择多字节字符集
OSVERSIONINFOEX OSVerInfo;
OSVerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if(!GetVersionEx((OSVERSIONINFO *)&OSVerInfo))
{
OSVerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx((OSVERSIONINFO *)&OSVerInfo);
}
TCHAR atszVerb[16];
if(OSVerInfo.dwMajorVersion >= 6) // Vista 以上
{
_tcscpy(atszVerb,_T("runas"));
}
else
{
_tcscpy(atszVerb,_T(""));
}
USES_CONVERSION;
SHELLEXECUTEINFO se ;
memset(&se,0,sizeof(SHELLEXECUTEINFO));
se.cbSize = sizeof(SHELLEXECUTEINFO);
se.lpVerb = atszVerb;
//m_bstrShellExe = L"你的路径";
se.lpFile = W2T(m_bstrShellExe); //m_bstrShellExe是要启动的进程se.lpParameters = _T("Administrator");//atszBootCmd;
se.nShow = SW_HIDE ;
se.fMask = SEE_MASK_NOCLOSEPROCESS ;
if(ShellExecuteEx(&se))
{
// 启动成功
}
else
{
// 启动失败,可能UAC没有获得用户许可
}
4. 发送消息执行命令
本进程,通过FIndWindow,查找到高权限进程的主窗口,并向该窗口发送WM_COPYDATA下消息;同时高权限进程处理WM_COPYDATA,根据传送到来的数据,执行相应的功能。
四、Demo
附件所带Demo,提供了一个已经封装好的COM组件(AdminShell.dll),来实现同步/异步的高权限命令执行模式的命令发送模块。同时提供了一个Shell.h头文件,封装实现了命令接收模块。我们只需要实现命令处理函数即可。
Demo实现了同步模式的命令执行,一步模式,只需要响应AdminShell的连接点事件即可。
Demo用VS2008编译,并在Win7下测试通过。
0 0
- 不是管理员权限的进程启动一个具备管理员权限的EXE
- VS编译出的文件具备管理员权限
- vs2010编译具备管理员权限的程序
- py2exe 打包的exe,添加管理员权限
- VS如何生成管理员权限打开的exe
- VS如何生成管理员权限打开的exe
- linux打开一个有管理员权限的文件夹
- 管理员权限启动Spy++,只能拦截管理员权限启动的程序的窗口消息
- 得到系统的管理员权限
- Ubuntu下的管理员权限
- 获得文件的管理员权限
- win7 exe文件打不开 获得管理员权限的注册表导入
- EXE4J生成的exe文件自动请求管理员权限(UAC)
- EXE4J生成的exe文件自动请求管理员权限(UAC)
- 用非管理员权限启动主程序,并用管理员权限启动子程序,导致WM_COPYDATA消息发送失败的问题
- 用非管理员权限启动主程序,并用管理员权限启动子程序,导致WM_COPYDATA消息发送失败的问题
- 在服务中用管理员权限创建一个可弹出UI的进程
- 在服务中用管理员权限创建一个可弹出UI的进程
- Android -- 获取汉字的首字母
- Cocos2d-X 声音菜单的打开和关闭
- java接口与C++抽象类比较
- 某某公司试题
- RTMP协议以及提取RTMP视频流组成H264视频文件
- 不是管理员权限的进程启动一个具备管理员权限的EXE
- qqqqq
- java实现cassandra的增删改查
- Quick-Cocos2d-x 使用tolua工具导出C++的类给Lua调用
- ios 僵尸调试
- HashMap和Hashtable 异同
- 数据库的3大范式
- 用 C 语言编写一个简单的垃圾回收器
- spring 使用AbstractRoutingDataSource自定义动态数据源时的事务处理问题