找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 20|回复: 0

[转载代码] 办公软件WPS的JSA中实现注销/重启/关机

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
办公软件WPS的表格:通过ExecuteExcel4Macro调用WinAPI实现

  操作前请先保存好数据!

执行前面三个函数可看到效果:
  1. function 系统注销(){let 注销=0;操作系统动作(注销);}
  2. function 系统重启(){let 重启=2;操作系统动作(重启);}
  3. function 系统关机(){let 关机=1;操作系统动作(关机);}

  4. function 操作系统动作(动作){
  5.         let 当前进程伪句柄=获取当前进程();
  6.         let 调整权限=0x20;
  7.         let 当前进程令牌=打开进程令牌(获取当前进程(),调整权限);        //一、获取令牌
  8.        
  9.         let 内存句柄=申请本地内存(16);        //令牌特权结构16字节
  10.         let 内存地址=锁定本地内存(内存句柄);        //用于写入
  11.         let 条目数=1,特权开启=2;
  12.         数组写入内存(内存地址,[条目数]);数组写入内存(内存地址+12,[特权开启]);        //写入条目数与属性
  13.         let 系统关闭特权="SeShutdownPrivilege";
  14.         let 获取结果=获取特权标志符(系统关闭特权,内存地址+4);        //二、获取LUID:本地标号 在 令牌特权结构 中偏移4字节
  15.         解锁本地内存(内存句柄);

  16.         内存地址=锁定本地内存(内存句柄);        //用于读取
  17.         let 修改结果=修改令牌特权(当前进程令牌,内存地址);        //三、修改令牌权限
  18.         解锁本地内存(内存句柄);释放本地内存(内存句柄);
  19.        
  20.         let 注销=0,重启=2,关机=1,关闭电源=8;let 强制=4,超时强制=0x10;
  21.         let 操作系统原因=0x20000,其他计划关闭=0x80000000;
  22.         let 操作=动作|超时强制,原因=操作系统原因|其他计划关闭;
  23.         let 动作结果=系统关闭操作(操作,原因);        //四、系统操作
  24. }
  25. function 获取当前进程(){        //返回进程伪句柄
  26.         const 执行宏调用=ExecuteExcel4Macro;
  27.         let 进程伪句柄=执行宏调用(`CALL("Kernel32","GetCurrentProcess","J")`);
  28.         return 进程伪句柄;
  29. }
  30. function 打开进程令牌(进程句柄,访问类型){        //关机、重启、注销
  31.         const 执行宏调用=ExecuteExcel4Macro;
  32.         let 令牌句柄=执行宏调用(`CALL("Advapi32","OpenProcessToken","3JJN",${进程句柄},${访问类型},0)`);
  33.         return 令牌句柄;
  34. }
  35. function 获取特权标志符(特权名,本地标号地址){        //本地标号(本地唯一标识符LUID)占64位,即8字节。
  36.         const 执行宏调用=ExecuteExcel4Macro;
  37.         let 获取结果=执行宏调用(`CALL("Advapi32","LookupPrivilegeValueA","AJFJ",0,"${特权名}",${本地标号地址})`);
  38.         return 获取结果;
  39. }
  40. function 修改令牌特权(令牌号,新特权地址){
  41.         const 执行宏调用=ExecuteExcel4Macro;
  42.         let 修改结果=执行宏调用(`CALL("Advapi32","AdjustTokenPrivileges","AJAJJJJ",${令牌号},0,${新特权地址},0,0,0)`);
  43.         return 修改结果;
  44. }
  45. function 系统关闭操作(操作,原因){        //关机、重启、注销
  46.         const 执行宏调用=ExecuteExcel4Macro;
  47.         let 注销=0,重启=2,关机=1,关闭电源=8;let 强制=4,超时强制=0x10;
  48.         let 操作结果=执行宏调用(`CALL("User32","ExitWindowsEx","AJJ",${操作},${原因})`);
  49.         return 操作结果;
  50. }

  51. function 申请本地内存(字节数){        //返回内存句柄
  52.         const 执行宏调用=ExecuteExcel4Macro;
  53.         const 内存句柄=执行宏调用(`CALL("Kernel32","LocalAlloc","JJJ",2,${字节数})`);
  54.         if(内存句柄){
  55.                 return 内存句柄;
  56.         }else{console.log("未能分配内存!");}
  57. }
  58. function 释放本地内存(内存句柄){
  59.         const 执行宏调用=ExecuteExcel4Macro;
  60.         执行宏调用(`CALL("Kernel32","LocalFree","JJ",${内存句柄})`);        //释放内存
  61. }
  62. function 锁定本地内存(内存句柄){        //返回内存地址
  63.         const 执行宏调用=ExecuteExcel4Macro;
  64.         const 内存地址=执行宏调用(`CALL("Kernel32","LocalLock","JJ",${内存句柄})`);
  65.         if(内存地址){
  66.                 return 内存地址;
  67.         }else{console.log("未找到内存地址!");}
  68. }
  69. function 解锁本地内存(内存句柄){
  70.         const 执行宏调用=ExecuteExcel4Macro;
  71.         执行宏调用(`CALL("Kernel32","LocalUnlock","JJ",${内存句柄})`);        //解锁
  72. }

  73. function 数组写入内存(内存地址,数组){
  74.         const 执行宏调用=ExecuteExcel4Macro,写入字节=4;
  75.         for(let 偏移=i=0;i<数组.length;i++){        //写入
  76.                 执行宏调用(`CALL("Kernel32","RtlMoveMemory","2JNJ",${内存地址+偏移},${数组[i]},${写入字节})`);
  77.                 偏移+=写入字节;
  78.         }
  79. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-7-14 10:23

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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