- 浏览: 2042318 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (651)
- ACE (35)
- BAT (9)
- C/C++ (116)
- fast-cgi (14)
- COM (27)
- python (59)
- CGI (4)
- C# (2)
- VC (84)
- DataBase (29)
- Linux (96)
- P2P (6)
- PHP (15)
- Web (6)
- Memcached (7)
- IME输入法 (11)
- 设计模式 (2)
- 搜索引擎 (1)
- 个人情感 (4)
- 笔试/面试 (3)
- 一亩三分地 (33)
- 历史 (2)
- 地理 (1)
- 人物 (3)
- 经济 (0)
- 不仅仅是笑哦 (43)
- 小故事大道理 (2)
- http://www.bjdsmyysjk120.com/ (0)
- http://www.bjdsmyy120.com/ (0)
- 它山之石可以攻玉 (15)
- 大学生你关注些什么 (28)
- 数据恢复 (1)
最新评论
-
luokaichuang:
这个规范里还是没有让我明白当浏览器上传文件时,STDIN的消息 ...
FastCGI规范 -
effort_fan:
好文章!学习了,谢谢分享!
com技术简介 -
vcell:
有错误os.walk(strPath)返回的已经是全部的文件和 ...
通过python获取目录的大小 -
feifeigd:
feifeigd 写道注意:文章中的CPP示例第二行 #inc ...
ATL入门:利用ATL编写简单的COM组件 -
feifeigd:
注意:文章中的CPP示例第二行 #include " ...
ATL入门:利用ATL编写简单的COM组件
Vista/Win7下普通权限进程动态提升权限
本文出自 “碧海笙箫” 博客,请务必保留此出处http://pyhcx.blog.51cto.com/713166/197073
一、前提
在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下测试通过。

发表评论
-
__declspec(novtable) 的用法
2010-11-27 14:37 1597__declspec(novtable) 的用法 __d ... -
解决URLDownloadToFile缓存问题的两种方法
2010-09-09 15:18 2948解决URLDownloadToFile缓存问题的两种方法 ... -
修改richedit背景
2010-07-19 22:52 1663RichEditCtrl::SetBackgroundCo ... -
使用ADO封装类的数据库程序开发实例(下)
2010-07-12 15:30 1490使用ADO封装类的数据库 ... -
使用ADO封装类的数据库程序开发实例(上)
2010-07-12 15:28 1226使用ADO封装类的数据库 ... -
VC防止窗口和控件闪烁的方法
2010-07-09 21:16 20421、将Invalidate()替换为Invalidate ... -
防止窗口闪烁地办法
2010-07-09 21:13 1527防止窗口闪烁地办法 也许我们都碰到过这种情况,当你 ... -
使用ADO _ConnectionPtr
2010-07-06 16:04 5276// GetUser.cpp : Defines the ... -
VC用ADO访问数据库全攻略
2010-07-06 15:29 1810VC用ADO访问数据库全 ... -
深入GetMessage和PeekMessage (引自-MSDN技术组)
2010-06-10 16:59 3743深入GetMessage和PeekMessage (引自 ... -
界面编程总结(1)
2010-06-02 13:32 4026原文地址:http://blog.csdn.net/byx ... -
获取信息的有关Windows API
2010-05-27 10:01 3165获取信息的有关Windows API 1.窗口信息 ... -
VC中如何实现窗口的隐藏
2010-05-13 10:08 7886VC中如何实现窗口的隐藏 用MFC做的Dialog ... -
SetConsoleCtrlHandler 处理控制台消息
2010-05-07 17:32 18194SetConsoleCtrlHandler 处理控制台消 ... -
解决决错误: error C2850: 'PCH header file'
2010-04-27 19:45 1969解决决错误: error C2850: 'PCH hea ... -
VC++ GDI+编程的字体和文本绘制
2010-04-13 13:12 7997字体是文字显示和打印的外观形式,它包括了文字的字样、风格和尺寸 ... -
VC利用GDI+显示透明的PNG图片
2010-04-12 16:59 115691.在你将要使用GDI+的工程中,完成初始化 ... -
GDI+编程基础(一)GDI+ Vs GDI
2010-04-12 15:59 2350下载源代码一、GDI GDI是位于应用程序与不同硬件之间 ... -
VC画图
2010-04-12 15:50 1554BOOL DrawPic(HDC hdc, TCHAR* ... -
对话框的数据交换--MFC深入浅出
2010-04-12 10:43 2484对话框数据交换指以下两种动作,或者是把内存数据写入对应的控 ...
相关推荐
标题“win7/win8/win10 vc过UAC”指的是在Windows 7、Windows 8和Windows 10操作系统上,使用Visual C++(vc)编程语言绕过用户账户控制(User Account Control, UAC)的技术。UAC是微软为了增强系统安全而引入的一...
同时,可能还会涉及到Token_Elevation_Type,这是Windows Vista及以后版本中引入的一种机制,用于控制进程的权限提升。 此外,该工具提供了多语言版本,这意味着它已经本地化为多种语言,以便不同国家和地区的用户...
例如,创建一个名为AlertService的服务,尽管在服务属性中勾选了"允许服务与桌面交互",但在Win7环境下,服务发出的对话框并不会出现在当前用户的桌面,而是出现在一个独立的Session中,用户无法直接访问。...
在这一机制下,即使用户登录的是管理员账户,其日常操作也是在标准用户权限下进行的,只有在执行特定的系统级任务时,才会请求提升权限。 在Windows系统中,存在三种主要的权限等级:Standard User(标准用户)、...
2. "Vista 关机补丁(Win7误用).reg" - 这是一个注册表文件,可能包含了修改Windows Vista或Windows 7关机行为的设置。由于Windows 7用户可能会误用,这可能是一个警告,提醒用户谨慎操作。 3. "使用说明.txt" - 这个...
### Vista和Win7用户无法在Protel中添加库文件的解决方法 #### 一、概述 随着电子设计自动化(EDA)软件的普及和发展,Protel作为一款广泛应用于电路板设计的专业软件,在电子工程师中有着不可替代的地位。然而,...
### Win7/Vista Session隔离与Windows服务:理解与突破 #### 概述 在Windows操作系统中,服务(Service)作为核心组件,承担着系统后台任务的执行,支持着日常的桌面操作。然而,自Vista及之后的版本,如Windows 7...
### WIN7关闭UAC方法 #### 一、UAC(用户账户控制)简介 UAC(User Account Control),即用户账户控制,是Windows Vista及之后版本操作系统中的一个安全技术,用于防止未经授权的程序对系统进行更改。在Windows 7...
总的来说,解决“win7 vista 下 superCHM等软件异常的解决方案”涉及检查系统兼容性、更新软件、验证权限、检查依赖项、排查恶意软件以及可能的源代码分析。通过这些方法,用户或开发者可以逐步定位并修复问题,确保...
这将启动一个提升的进程,该进程拥有管理员权限。 3. 修改UAC设置: 如果频繁需要管理员权限,可以调整UAC的设置。在控制面板中,找到“用户账户和家庭安全”或“用户账户”,然后选择“更改用户账户控制设置”。...
总之,"WIN7下VC6.0调试程序终止进程不能关闭exe"这个问题需要综合考虑多种因素,通过逐步排除法和尝试不同的解决方案来找出问题的根源。同时,由于VC6.0已经较为老旧,升级到更现代的开发工具,如Visual Studio ...
在Windows 7操作系统中,有时由于安全策略的设置,普通用户可能会遇到无法修改或删除特定文件或文件夹的情况。这是因为Windows 7为了提高系统安全性,引入了严格的文件权限管理机制,使得只有拥有管理员权限的用户...
【64位/32位 Win7下配置IIS7.5运行ASP+Access网站】的知识点详解: 在64位或32位的Windows 7操作系统中,配置IIS7.5以运行ASP(Active Server Pages)和Access数据库驱动的网站涉及到多个步骤。以下是一个详细的...
总的来说,让Win7任务管理器以“all users”或管理员权限启动是一项有用的功能,可以帮助系统管理员更好地监控和管理系统的运行状态。通过理解这些文件的作用,我们可以安全地调整系统设置,以满足高级的管理和监控...
在Windows操作系统中,尤其是从Vista版本开始,微软引入了更为严格的权限管理机制,以增强系统的安全性。在Win8.1系统中,即使以管理员身份运行应用程序,有时仍可能遇到权限不足的问题,尤其是在尝试删除某些文件或...
首先,EPROCESS结构包含了进程的核心信息,如进程ID(PID)、进程令牌(Token),这是用来控制进程权限的关键组件。它还包含了进程的基地址空间信息,如虚拟地址描述符表(VAD),这决定了进程可以访问哪些内存区域...
在C#中,可以使用`System.Security.Principal`命名空间下的`WindowsIdentity`和`WindowsPrincipal`类来检查当前进程是否以管理员权限运行。以下代码片段展示了如何实现这一功能: ```csharp using System.Security....
### Win7 右键获取管理员权限详解 #### 一、背景与重要性 自Windows Vista开始,微软在操作系统中引入了一系列安全措施来提高系统的安全性。其中最重要的改变之一就是增加了用户账户控制(User Account Control,...
以下是一份详细的步骤指南,帮助您成功在Win7环境下安装CAD2006。 首先,我们需要开启超级管理员账户,这是由于CAD2006需要高级权限才能顺利完成安装。有两种方法可以实现: 1. 如果您的系统是Windows 7旗舰版,您...
标题 "win7导出xml报错:无法定位程序输入点AddDllDirectory于动态链接库KERNEL32" 描述了一个在Windows 7操作系统中常见的错误,该错误发生在尝试导出XML文件时,系统提示找不到`AddDllDirectory`函数的入口点于`...