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. 以高权限启动新进程 

// 启动Shell 
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; 
se.lpFile = W2T(m_bstrShellExe); 
se.lpParameters = 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值