aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 36815|回复: 9

任意程序以管理员权限运行

[复制链接]

7

主题

72

回帖

554

积分

三级会员

积分
554
发表于 2013-2-26 16:32:58 | 显示全部楼层 |阅读模式
本帖最后由 Hades 于 2013-3-18 09:54 编辑

今天终于忍不住来发一个原创程序了.

任意程序以管理员权限运行.
其实本来,右键程序,属性,兼容性,以管理员权限运行,这样就可以实现了,但是,这仅仅是针对于普通程序的

那系统自己的程序,如cmd,是不能设置兼容性的.
于是我就写个小程序,正好也练习一下学习aardio的成果.
先看看程序界面:
无标题.png


下面是源码,写的有点乱,请多多指教:
  1. import win.ui;
  2. /*DSG{{*/
  3. mainForm = ..win.form( right=648;max=false;bottom=479;parent=...;text="任意程序以管理员身份运行 Hades";border="thin" )
  4. mainForm.add(
  5. btn_Del={ bottom=475;text="删除选中";left=476;top=451;z=8;right=554;cls="button" };
  6. btn_AddAll={ bottom=475;text="添加所有用户";left=392;top=451;z=7;right=471;cls="button" };
  7. static={ bottom=24;text="当前用户下具有管理员权限的程序:";left=7;top=7;transparent=1;z=2;right=206;cls="static" };
  8. lst_Usr_Admin={ bgcolor=16777215;bottom=225;right=641;left=7;
  9. items={  };z=1;top=26;edge=1;cls="listbox" };
  10. static2={ bottom=248;text="所有用户下具有管理员权限的程序:";left=7;top=231;transparent=1;z=3;right=199;cls="static" };
  11. static3={ bottom=476;right=90;left=7;top=456;z=5;notify=1;text="点我选择程序:";transparent=1;cls="static" };
  12. lst_All_Admin={ bgcolor=16777215;bottom=450;right=641;left=7;
  13. items={  };z=4;top=251;edge=1;cls="listbox" };
  14. edt_Path={ text="C:\Windows\System32\cmd.exe";bottom=476;right=303;left=89;top=452;z=6;edge=1;cls="edit" };
  15. btn_AddCur={ bottom=475;right=386;left=307;top=451;z=10;text="添加当前用户";cls="button" };
  16. btn_Refresh={ bottom=475;text="刷新列表";left=560;top=451;z=9;right=639;cls="button" }
  17. )
  18. /*}}*/

  19. import fsys.dlg;

  20. mainForm.static3.oncommand = function(id,event){
  21.         mainForm.edt_Path.text =
  22.         fsys.dlg.open('exe文件|*.exe|
  23.                                         bat文件|*.bat|
  24.                                         cmd文件|*.cmd||
  25.                                         ');
  26.        
  27. }


  28. mainForm.btn_AddCur.oncommand = function(id,event){
  29.         if (not checkExp())
  30.                 return;
  31.         reg = win.reg("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", true) //打开注册表路径
  32.         reg.setSzValue(mainForm.edt_Path.text, "RUNASADMIN");
  33.         reg.close();
  34.         mainForm.msgbox("添加成功!及时生效!", "Hades提示");
  35.         refresh_List();
  36.         WorkNow();
  37. }


  38. mainForm.btn_Del.oncommand = function(id,event){
  39.         //由于在WM_ACTIVATE消息中刷新列表,导致下面弹出询问框的时候,窗体焦点消失
  40.         //如果在点击了确认之后,窗体重新接收WM_ACTIVATE消息,列表重新刷新,选中的文本就没有了
  41.         //从而导致删除失败.所以在弹出确认框之前,先保存一下值.
  42.         var strUsr = mainForm.lst_Usr_Admin.selText;
  43.         var strAll = mainForm.lst_All_Admin.selText;
  44.         if(mainForm.msgboxTest("请注意,删除的时候,您选中的两个列表框中数据都会被删除!","标题"))
  45.         {
  46.                 //删除当前用户级的
  47.                 if(strUsr != ""){
  48.                         reg = win.reg("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers",true);
  49.                         reg.delValue(strUsr);
  50.                         reg.close();
  51.                 }
  52.                 //删除所有用户级的
  53.                 if(strAll != ""){
  54.                         reg = win.reg("HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers",true);
  55.                         reg.delValue(strAll);
  56.                         reg.close();
  57.                 }
  58.                 refresh_List();
  59.                 WorkNow();
  60.                 mainForm.msgbox("删除选中项成功!及时生效!", "Hades提示");
  61.         }
  62.                
  63. }

  64. function WorkNow(){
  65.         //var ret = 0;
  66.         var rets = 0;
  67.         //ret =
  68.         ::SendMessageTimeout(0xFFFF/*_HWND_BROADCAST*/,
  69.                                                  0x1A/*_WM_SETTINGCHANGE*/,
  70.                                                  null,
  71.                                                  null,
  72.                                                  0x0/*_SMTO_NORMAL*/,
  73.                                                  1000,
  74.                                                  rets);
  75.         //mainForm.msgbox(ret);
  76. }


  77. function checkExp(){
  78.         if(mainForm.edt_Path.text == ""){
  79.                 mainForm.msgbox("请选择要提升权限的程序!","Hades提示");
  80.                 return false;
  81.         }
  82.         var strExp = string.slice(mainForm.edt_Path.text, -4, -1, true);
  83.         //判断是否是可执行程序
  84.         if(string.cmp(".exe", strExp, 4) && string.cmp(".bat", strExp, 4) && string.cmp(".cmd", strExp, 4)) {
  85.                 mainForm.msgbox("请选择可执行程序进行添加!", "Hades提示");
  86.                 return false;
  87.         }       
  88.         return true;
  89. }



  90. mainForm.btn_AddAll.oncommand = function(id,event){
  91.         if (not checkExp())
  92.                 return;
  93.         reg = win.reg("HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", true) //打开注册表路径
  94.         reg.setSzValue(mainForm.edt_Path.text, "RUNASADMIN");
  95.         reg.close();
  96.         mainForm.msgbox("添加成功!及时生效!", "Hades提示");
  97.         refresh_List();
  98.         WorkNow();
  99. }

  100. import win.reg;

  101. function refresh_List(){
  102.         //清空列表
  103.         mainForm.lst_Usr_Admin.clear();
  104.         mainForm.lst_All_Admin.clear();
  105.         //读取注册表
  106.         reg = win.reg("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", true) //打开注册表路径
  107.         //枚举子项、以及子项的所有子项
  108.         for(valuename, data in reg.eachValue()) {
  109.                 mainForm.lst_Usr_Admin.add(valuename);
  110.         }
  111.         reg.close();
  112.         reg = win.reg("HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", true) //打开注册表路径
  113.         //枚举子项、以及子项的所有子项
  114.         for(valuename, data in reg.eachValue()) {
  115.                 mainForm.lst_All_Admin.add(valuename);
  116.         }
  117.         reg.close();
  118. }

  119. mainForm.btn_Refresh.oncommand = function(id,event){
  120.         refresh_List();
  121.        
  122. }

  123. mainForm.wndproc = function(hwnd,message,wParam,lParam){
  124.         select( message ) {
  125.                 case 0x6/*_WM_ACTIVATE*/{
  126.                         refresh_List();
  127.                 }
  128.                 else{
  129.                        
  130.                 }
  131.         }
  132.         //无返回值则继续调用默认回调函数
  133. }

  134. mainForm.show()
  135. win.loopMessage();
复制代码

0

主题

15

回帖

107

积分

一级会员

积分
107
发表于 2013-2-26 18:41:42 | 显示全部楼层
支持一个,顶一下!

0

主题

7

回帖

281

积分

二级会员

积分
281
发表于 2013-2-26 18:42:02 | 显示全部楼层
学习。谢谢。

0

主题

15

回帖

107

积分

一级会员

积分
107
发表于 2013-2-26 23:03:03 | 显示全部楼层
本帖最后由 hxhlb 于 2013-2-26 23:12 编辑

我觉得,你的WorkNow改成这样,会不会好一些?我是Win8,你的写法会报错.
  1. function WorkNow(){
  2.         //var ret = 0;
  3.         var rets = 0;
  4.         //ret =
  5.         ::SendMessageTimeout(0xFFFF/*_HWND_BROADCAST*/,
  6.                                                  0x1A/*_WM_SETTINGCHANGE*/,
  7.                                                  null,
  8.                                                  null,
  9.                                                  0x0/*_SMTO_NORMAL*/,
  10.                                                  1000,
  11.                                                  rets);
  12.         //mainForm.msgbox(ret);
  13. }
复制代码

7

主题

72

回帖

554

积分

三级会员

积分
554
 楼主| 发表于 2013-2-27 09:19:34 | 显示全部楼层
hxhlb 发表于 2013-2-26 23:03
我觉得,你的WorkNow改成这样,会不会好一些?我是Win8,你的写法会报错.

嗯 谢谢你的提醒,是我写错了.

0

主题

18

回帖

104

积分

一级会员

积分
104
发表于 2013-3-3 18:11:20 | 显示全部楼层
感谢分享,学习一下!

7

主题

72

回帖

554

积分

三级会员

积分
554
 楼主| 发表于 2013-3-3 19:09:29 | 显示全部楼层
daiweima 发表于 2013-3-3 18:11
感谢分享,学习一下!

大家共同交流进步嘛!

5

主题

64

回帖

475

积分

二级会员

积分
475
发表于 2013-3-18 00:12:42 | 显示全部楼层
感谢分享!又学到新的知识点了!

0

主题

15

回帖

101

积分

一级会员

积分
101
QQ
发表于 2018-9-26 15:42:52 | 显示全部楼层
感觉不错
非常好又学到新的知识点了!非常好又学到新的知识点了!
3626
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2024-12-5 13:50 , Processed in 0.067804 second(s), 26 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表