|
本帖最后由 Hades 于 2013-3-18 09:54 编辑
今天终于忍不住来发一个原创程序了.
任意程序以管理员权限运行.
其实本来,右键程序,属性,兼容性,以管理员权限运行,这样就可以实现了,但是,这仅仅是针对于普通程序的
那系统自己的程序,如cmd,是不能设置兼容性的.
于是我就写个小程序,正好也练习一下学习aardio的成果.
先看看程序界面:
下面是源码,写的有点乱,请多多指教:- import win.ui;
- /*DSG{{*/
- mainForm = ..win.form( right=648;max=false;bottom=479;parent=...;text="任意程序以管理员身份运行 Hades";border="thin" )
- mainForm.add(
- btn_Del={ bottom=475;text="删除选中";left=476;top=451;z=8;right=554;cls="button" };
- btn_AddAll={ bottom=475;text="添加所有用户";left=392;top=451;z=7;right=471;cls="button" };
- static={ bottom=24;text="当前用户下具有管理员权限的程序:";left=7;top=7;transparent=1;z=2;right=206;cls="static" };
- lst_Usr_Admin={ bgcolor=16777215;bottom=225;right=641;left=7;
- items={ };z=1;top=26;edge=1;cls="listbox" };
- static2={ bottom=248;text="所有用户下具有管理员权限的程序:";left=7;top=231;transparent=1;z=3;right=199;cls="static" };
- static3={ bottom=476;right=90;left=7;top=456;z=5;notify=1;text="点我选择程序:";transparent=1;cls="static" };
- lst_All_Admin={ bgcolor=16777215;bottom=450;right=641;left=7;
- items={ };z=4;top=251;edge=1;cls="listbox" };
- edt_Path={ text="C:\Windows\System32\cmd.exe";bottom=476;right=303;left=89;top=452;z=6;edge=1;cls="edit" };
- btn_AddCur={ bottom=475;right=386;left=307;top=451;z=10;text="添加当前用户";cls="button" };
- btn_Refresh={ bottom=475;text="刷新列表";left=560;top=451;z=9;right=639;cls="button" }
- )
- /*}}*/
- import fsys.dlg;
- mainForm.static3.oncommand = function(id,event){
- mainForm.edt_Path.text =
- fsys.dlg.open('exe文件|*.exe|
- bat文件|*.bat|
- cmd文件|*.cmd||
- ');
-
- }
- mainForm.btn_AddCur.oncommand = function(id,event){
- if (not checkExp())
- return;
- reg = win.reg("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", true) //打开注册表路径
- reg.setSzValue(mainForm.edt_Path.text, "RUNASADMIN");
- reg.close();
- mainForm.msgbox("添加成功!及时生效!", "Hades提示");
- refresh_List();
- WorkNow();
- }
- mainForm.btn_Del.oncommand = function(id,event){
- //由于在WM_ACTIVATE消息中刷新列表,导致下面弹出询问框的时候,窗体焦点消失
- //如果在点击了确认之后,窗体重新接收WM_ACTIVATE消息,列表重新刷新,选中的文本就没有了
- //从而导致删除失败.所以在弹出确认框之前,先保存一下值.
- var strUsr = mainForm.lst_Usr_Admin.selText;
- var strAll = mainForm.lst_All_Admin.selText;
- if(mainForm.msgboxTest("请注意,删除的时候,您选中的两个列表框中数据都会被删除!","标题"))
- {
- //删除当前用户级的
- if(strUsr != ""){
- reg = win.reg("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers",true);
- reg.delValue(strUsr);
- reg.close();
- }
- //删除所有用户级的
- if(strAll != ""){
- reg = win.reg("HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers",true);
- reg.delValue(strAll);
- reg.close();
- }
- refresh_List();
- WorkNow();
- mainForm.msgbox("删除选中项成功!及时生效!", "Hades提示");
- }
-
- }
- function WorkNow(){
- //var ret = 0;
- var rets = 0;
- //ret =
- ::SendMessageTimeout(0xFFFF/*_HWND_BROADCAST*/,
- 0x1A/*_WM_SETTINGCHANGE*/,
- null,
- null,
- 0x0/*_SMTO_NORMAL*/,
- 1000,
- rets);
- //mainForm.msgbox(ret);
- }
- function checkExp(){
- if(mainForm.edt_Path.text == ""){
- mainForm.msgbox("请选择要提升权限的程序!","Hades提示");
- return false;
- }
- var strExp = string.slice(mainForm.edt_Path.text, -4, -1, true);
- //判断是否是可执行程序
- if(string.cmp(".exe", strExp, 4) && string.cmp(".bat", strExp, 4) && string.cmp(".cmd", strExp, 4)) {
- mainForm.msgbox("请选择可执行程序进行添加!", "Hades提示");
- return false;
- }
- return true;
- }
- mainForm.btn_AddAll.oncommand = function(id,event){
- if (not checkExp())
- return;
- reg = win.reg("HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", true) //打开注册表路径
- reg.setSzValue(mainForm.edt_Path.text, "RUNASADMIN");
- reg.close();
- mainForm.msgbox("添加成功!及时生效!", "Hades提示");
- refresh_List();
- WorkNow();
- }
- import win.reg;
- function refresh_List(){
- //清空列表
- mainForm.lst_Usr_Admin.clear();
- mainForm.lst_All_Admin.clear();
- //读取注册表
- reg = win.reg("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", true) //打开注册表路径
- //枚举子项、以及子项的所有子项
- for(valuename, data in reg.eachValue()) {
- mainForm.lst_Usr_Admin.add(valuename);
- }
- reg.close();
- reg = win.reg("HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", true) //打开注册表路径
- //枚举子项、以及子项的所有子项
- for(valuename, data in reg.eachValue()) {
- mainForm.lst_All_Admin.add(valuename);
- }
- reg.close();
- }
- mainForm.btn_Refresh.oncommand = function(id,event){
- refresh_List();
-
- }
- mainForm.wndproc = function(hwnd,message,wParam,lParam){
- select( message ) {
- case 0x6/*_WM_ACTIVATE*/{
- refresh_List();
- }
- else{
-
- }
- }
- //无返回值则继续调用默认回调函数
- }
- mainForm.show()
- win.loopMessage();
复制代码 |
|