注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

杨伟的博客

程序人生

 
 
 

日志

 
 

使 hta 可以在 win7 / vista 下获取管理员权限(UAC 问题)  

2011-06-09 17:20:00|  分类: IT界 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

目前很多系统维护工具都用 hta 形式发布,比如 EasyX 的安装程序,再比如“VC6 绿色工具集”。因为这种形式可以看到源代码,对系统做了什么修改一目了然。hta 的安装程序很难封装进去某些广告插件,即便有,也很容易被大家发现。

现在用 .hta 做安装程序或系统维护工具有个问题:无法获取 win7 / vista 的管理员权限,并且右击 .hta 也没有“以管理员身份运行”的选项。本文尝试解决该问题。

思路:
重新调用 mshta.exe,并将当前 hta 当做参数传入,同时设置 runas 参数。这样执行 hta 的时候,用户可以收到警告,当用户同意该 hta 对系统修改后,hta 即可获得管理员权限。

需要注意的是:
1. 判断操作系统。只有 vista 及以上操作系统才需要这么做,xp 不需要。
2. 第二次通过 mshta.exe 启动 hta 后,要能识别出来是第二次启动,否则会重复递归调用自己。
3. 第二次启动 hta 后,当前路径会有变化,要注意。
4. 该 hta 文件的扩展名必须用小写,因为这里用扩展名的大小写来判断第几次加载 hta。另外,还可以用参数的形式判断第几次加载 hta,但是这样一来,必须将脚本放在 <HTA:APPLICATION> 标记之后,而解析到 <HTA:APPLICATION> 标记时就会使 hta 窗口显示出来,因此用户会在确认 UAC 之前就会看到窗体,第二次加载 hta 会造成窗口关闭又打开,给用户的感觉不太好。

以下是我写的一个可以在 win7 / vista 下使 hta 获得管理员权限的范例:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>EasyX 2011惊蛰版 安装程序</title>
<script type="text/javascript">
// 获取 Windows 版本
function GetSystemVersion()
{
 var os = GetObject("winmgmts:").InstancesOf("Win32_OperatingSystem");
 for(var e = new Enumerator(os);  !e.atEnd(); e.moveNext())
 {
  var v = e.item().Version;
  var ss = v.split('.');
  return ss[0] + ss[1];
 }
 return -1;
}

// 判断是否是 vista 或以上版本系统
if (GetSystemVersion() >= 60)
{
 var cmd = location.pathname;
 if (cmd.substring(cmd.length-4) != ".HTA") // 通过扩展名的大小写,来区分第几次运行 hta
 {
  var Shell = new ActiveXObject("Shell.Application");
  // 以 runas 方式重新启动该 hta
  Shell.ShellExecute ("mshta.exe", "\"" + cmd.substring(0, cmd.length-4) + ".HTA\"", "", "runas", 1);
  // 退出当前 hta
  window.close();
  exit(0);
 }
}
</script>
<HTA:APPLICATION ID="oHTA"
 APPLICATIONNAME="EasyX 2011惊蛰版 安装程序"
 BORDER="dialog"
 CONTEXTMENU="no"
 INNERBORDER="no"
 MAXIMIZEBUTTON="no"
 MINIMIZEBUTTON="yes"
 SCROLL="no"
 SELECTION="no"
 SINGLEINSTANCE="yes"
 VERSION="2011-3-6" />
</head>

<body>
<p>Hello World!</p>
</body>
</html>


注:
1. 请不要妄想将该技术用于恶意程序,因为该方法并没有自动获得管理员权限,而是咨询用户“是否可以给我管理员权限?”只有用户同意时,hta 才可以获得管理员权限。
2. 更完整的 hta 安装程序的范例,请参考 EasyX 的安装程序。我只是将 hta 里面的回车和行首空格删掉了,并没有做任何加密。

  评论这张
 
阅读(4)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017