# filename: runner.py
import sys, os, json, tempfile, time, ctypes, subprocess
import traceback
# 第三方:pip install pywin32 pywinauto
import win32com.client
def is_admin() -> bool:
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except Exception:
return False
def run_elevated(args: str) -> int:
return ctypes.windll.shell32.ShellExecuteW(
None, "runas", sys.executable, args, None, 1
)
def run_unelevated(args: str) -> None:
shell = win32com.client.Dispatch("Shell.Application")
wd = os.path.dirname(os.path.abspath(sys.argv[0]))
shell.ShellExecute(sys.executable, args, wd, "", 1)
def call_elevated(task: dict) -> dict:
with tempfile.NamedTemporaryFile(delete=False, suffix=".json") as f:
path_in, path_out = f.name, f.name + ".out.json"
f.write(json.dumps(task, ensure_ascii=False).encode("utf-8"))
run_elevated(f'"{sys.argv[0]}" --elevated-worker "{path_in}" "{path_out}"')
for _ in range(600):
if os.path.exists(path_out):
with open(path_out, "r", encoding="utf-8") as rf:
return json.load(rf)
time.sleep(0.05)
raise TimeoutError("elevated worker no response")
def call_unelevated(task: dict) -> dict:
with tempfile.NamedTemporaryFile(delete=False, suffix=".json") as f:
path_in, path_out = f.name, f.name + ".out.json"
f.write(json.dumps(task, ensure_ascii=False).encode("utf-8"))
run_unelevated(f'"{sys.argv[0]}" --ui-worker "{path_in}" "{path_out}"')
for _ in range(600):
if os.path.exists(path_out):
with open(path_out, "r", encoding="utf-8") as rf:
return json.load(rf)
time.sleep(0.05)
raise TimeoutError("ui worker no response")
# ============ 这里填你的“管理员权限”任务 ============
def elevated_do_tasks(payload: dict) -> dict:
"""
在这里实现你的高权限操作:
- 写入 HKLM 注册表
- 修改系统设置/服务
- 执行 netsh/powercfg/dism 等
"""
try:
results = {}
# 示例1:写 HKLM 注册表(需要管理员)
import winreg
key_path = r"SOFTWARE\MyCompany\MyApp"
with winreg.CreateKeyEx(winreg.HKEY_LOCAL_MACHINE, key_path, 0, winreg.KEY_SET_VALUE) as k:
winreg.SetValueEx(k, "InstalledBy", 0, winreg.REG_SZ, "runner-elevated")
results["registry"] = f"HKLM\\{key_path}\\InstalledBy set."
# 示例2:执行管理员命令
cmd = ["cmd.exe", "/c", "powercfg -getactivescheme"]
proc = subprocess.run(cmd, capture_output=True, text=True, encoding="utf-8", errors="ignore")
results["powercfg"] = proc.stdout.strip() or proc.stderr.strip()
# TODO: 替换为你的实际管理员操作,如:
# results["my_task"] = do_admin_thing(payload.get("args"))
return {"ok": True, "results": results}
except Exception as e:
return {"ok": False, "error": str(e), "trace": traceback.format_exc()}
# ============ 这里填你的“非管理员 UI 自动化”任务 ============
def ui_do_tasks(payload: dict) -> dict:
"""
在这里实现 UI 自动化(资源管理器/Edge):
- 必须在非管理员进程里,用 backend="uia"
"""
try:
from pywinauto import Desktop, Application
from pywinauto.keyboard import send_keys
import time
results = {}
# 示例A:操作文件资源管理器,读取“项目视图”的可见项
dlg = Desktop(backend="uia").window(title_re=".*文件资源管理器", control_type="Window")
dlg.wait("exists ready visible", timeout=10)
dlg.set_focus()
for _ in range(3):
send_keys("{ESC}")
time.sleep(0.1)
shell_view = dlg.child_window(title_re=".*文件夹视图", control_type="Pane")
item_list = shell_view.child_window(title="项目视图", control_type="List")
item_list.wait("exists ready visible", timeout=5)
item_list.set_focus()
visible_items = [it.window_text() for it in item_list.children(control_type="ListItem")]
results["explorer_visible"] = visible_items
# 示例B:Edge 打开并 Ctrl+Shift+I, 搜索地址(如需)
# 如果你需要Edge,取消下面注释
# app = Application(backend="uia")
# try:
# app.connect(title_re=".*Edge.*")
# except:
# subprocess.Popen(["msedge.exe"])
# time.sleep(3)
# app.connect(title_re=".*Edge.*")
# edge = app.window(title_re=".*Edge.*")
# edge.set_focus()
# send_keys("^l"); time.sleep(0.2)
# send_keys("https://www.bing.com"); send_keys("{ENTER}")
# time.sleep(2)
# send_keys("^+i") # DevTools
# time.sleep(1)
# TODO: 替换为你的实际 UI 自动化逻辑
# results["my_ui"] = do_ui_thing(payload.get("args"))
return {"ok": True, "results": results}
except Exception as e:
return {"ok": False, "error": str(e), "trace": traceback.format_exc()}
# ============ 工人入口 ============
def elevated_worker(path_in: str, path_out: str):
with open(path_in, "r", encoding="utf-8") as f:
task = json.load(f)
result = elevated_do_tasks(task)
with open(path_out, "w", encoding="utf-8") as f:
json.dump(result, f, ensure_ascii=False)
def ui_worker(path_in: str, path_out: str):
with open(path_in, "r", encoding="utf-8") as f:
task = json.load(f)
result = ui_do_tasks(task)
with open(path_out, "w", encoding="utf-8") as f:
json.dump(result, f, ensure_ascii=False)
# ============ 主流程:按需在两种权限之间切换 ============
def main_flow():
# 1) 非管理员:做 UI 自动化
ui_res = call_unelevated({"action": "collect_explorer_visible"})
print("UI:", ui_res)
# 2) 管理员:做高权限操作
elev_res = call_elevated({"action": "write_hklm_and_powercfg"})
print("ADMIN:", elev_res)
# 3) 如需返回 UI 再做一轮
# ui_res2 = call_unelevated({"action": "do_ui_again"})
# print("UI2:", ui_res2)
if __name__ == "__main__":
if len(sys.argv) >= 2 and sys.argv[1] == "--elevated-worker":
if not is_admin():
run_elevated(" ".join(sys.argv[1:])); sys.exit(0)
elevated_worker(sys.argv[2], sys.argv[3]); sys.exit(0)
if len(sys.argv) >= 2 and sys.argv[1] == "--ui-worker":
if is_admin():
run_unelevated(" ".join(sys.argv)); sys.exit(0)
ui_worker(sys.argv[2], sys.argv[3]); sys.exit(0)
# 主入口:推荐以“非管理员”启动 exe
# 若当前是管理员,也可以照样工作;UI 部分会被分流到非管理员子进程执行
main_flow()我是第一次学python可以跟我讲一下这些是干什么的以及解释一下代码写法的意义吗
最新发布