VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 4753|回复: 2

[讨论] 刚刚研究了一下在Win7中的UAC提权

[复制链接]
发表于 2012-8-14 22:06:03 | 显示全部楼层 |阅读模式
因为自己有个程序需要读写注册表,所以在Windows7下就必须需要管理员权限 即运行时需要右键选择 "以管理员身份运行"
之前一直都是按照 http://www.vbgood.com/thread-84975-1-1.html 贴中所提到的办法 ,把manifest文件转成res文件添加进去就好了
一直相安无事很正常, 但最近想试验一下文件拖放获取文件名的功能,就把OLEDropMode设定好
代码也都输完,可是调试以及编译成exe之后都无法实现
google了一番以后 发现msdn上有这么一篇文章
http://social.msdn.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/ab62d034-f0e4-4a94-8821-abe0a72c9863/
在 Windows Vista / Windows 7 下,Explorer.exe 运行在当前用户凭据下,当且仅当需要时,如写入注册表或者更改时间/日期,Explorer 才会被权限提升。默认情况下,您的程序使用当前用户凭据运行时,其权限与 Explorer 一致。因此,他们可以很容易的拖放文件 (WM_ACCEPTFILES 等) 和传送信息 (WM_COPYDATA 等)。

但一旦您以提升的管理员权限运行程序,那么,您的程序与 Explorer 之间再不是平等关系,因此,他们之间的某些通信必定受到安全沙箱的限制而导致无法继续。

就是说如果explorer和程序的权限不同的话 鼠标拖放是禁止的
所以我不得不找个解决办法
忽然想起来QQ音乐在设置文件关联时,是可以动态提升权限的,所以就又是google了一番
可最后得到结论 程序是不可以动态提权的
于是我又回到QQ音乐查看,发现QQ音乐是通过提高另外一个程序的权限来实现的提权
这下灵感就来了
可以使用ShellExecute函数
  1. ShellExecute(Handle, "runas", "cmd", vbNullString, vbNullString, vbNormalFocus)
复制代码
比如这样来提权调用cmd
不过这样的话还需要在模块中对函数进行声明
所以可以这样
  1. CreateObject("Shell.Application").ShellExecute "cmd", "", "", "RunAs"
复制代码
加入到程序里 则可以这样
  1. CreateObject("Shell.Application").ShellExecute App.path & "/app.exe" , "参数", "", "RunAs"
复制代码
通过调用自己并传送命令行参数来实现具体的功能

不过这样虽然是可以实现鼠标拖拽了
但还是有几个问题
比如我这个程序需要多次访问注册表 那用户就必须多次确认uac那个烦人的东西
而且对现有代码的改造量我认为是很大的

我想了想,代码改造是不可避免的,而且改完了以后还会让代码更有规划
(我写的代码都是很乱很乱的...)
所以我打算这样做 在form_load中先判断用户是否已经给了程序权限(右键打开),如果给了那就还是以前的处理方式
如果没有,那就按照我所说的每步都进行提权请求
这样来让用户自己选择

不知道各位都是怎么做的呢?

点评

没有Win7的飘过……顺便说我的另一个发现,250安全沙箱和VB6文件拖拽不兼容……  发表于 2012-8-15 02:21
 楼主| 发表于 2012-8-15 09:12:15 | 显示全部楼层
@acme_pjz 250安全沙箱有什么用么..250家东西我好多年都不用了

点评

当然没用,只不过我编的几个程序250报毒,非要在安全沙箱里面运行而已  发表于 2012-8-15 15:47
回复 支持 反对

使用道具 举报

发表于 2012-8-15 09:37:44 | 显示全部楼层
本帖最后由 仙剑魔 于 2012-8-15 09:40 编辑

ChangeWindowMessageFilter


WM_DROPFILES
WM_COPYDATA
WM_COPYGLOBALDATA
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-9-25 16:05

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表