Python自动化指令进阶:UAC提权

这篇文章是笔者近期开发「Todo-List」应用的跨端数据传输遇到的问题:使用 subprocess 指令配置开通指定端口号防火墙入站规则报错了。PS:有关 subprocess 入门的,可以查阅此前的这篇文章:用python实现类AI自动执行终端指令

背景

直接使用 subprocess 的核心源码是这样的:

python 复制代码
cmd = (
    f'netsh advfirewall firewall add rule '
    f'name="firewall-test" '
    f'dir=in action=allow protocol=TCP localport=5000 '
    f'description="TodoList P2P" '
    f'profile=any'
)
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
startupinfo.wShowWindow = subprocess.SW_HIDE
result = subprocess.run(
    cmd,
    startupinfo=startupinfo,
    shell=True,
    capture_output=True,
    text=True,
    encoding='utf-8',
    timeout=10
)

但是报错了:请求的操作需要提升(作为管理员运行)

UAC提权问题

为什么会报错呢?这就要说到 Windows 的 UAC 提权问题了。

相信有同学在日常使用 Windows 电脑的时候,遇到过这种提示吧。

这是 Windows 的一种安全权限控制机制 - 用户账户控制 (User Account Control),简单点说,就是当程序需要执行一些高危操作,比如在系统盘写数据的时候,那么系统就会自动提示用户是否提升至管理员权限,以便程序可以操作。也就是这个提示相当于通知用户,这个操作可能很危险,让用户权衡是否允许执行。

想配置防火墙这种操作,如果使用普通账户,是没法执行的。PS:当时找过资料,想通过用户级别的防火墙配置来绕过提权限制的,发现在 Windows11 不生效。

官网资料:使用 netsh advfirewall 防火墙上下文 - Windows Server | Microsoft Learn

shell 复制代码
# 旧的、可能失效的命令 - 用户级别防火墙配置,分析可能在Windows10还能生效,但是Windows11确实失效了
netsh firewall add portopening protocol=TCP port=8080 name="MyApp"
# Windows11指令
netsh advfirewall firewall add rule name="MyApp" protocol=TCP dir=in localport=8080 action=allow

也就是说,最终还是要执行指令提权,而原有的 subprocess 方式直接执行是处理不了的。

解决方式

使用ShellExecute以管理员身份运行,这里的核心参数是 runas ,提示以管理员身份运行。

python 复制代码
# 构建netsh命令
cmd = (
    f'netsh advfirewall firewall add rule '
    f'name="firewall-test" '
    f'dir=in action=allow protocol=TCP localport=5000 '
)
result = ctypes.windll.shell32.ShellExecuteW(
    None,  # 父窗口句柄
    "runas",  # 操作:以管理员身份运行
    "cmd.exe",  # 要执行的程序
    f'/c {cmd}',  # 参数:/c表示执行后关闭
    None,  # 工作目录
    1  # 显示方式:1=正常窗口
)
if result > 32:
    print("✅ 已请求管理员权限执行命令")
    print(f"命令: {cmd}")
else:
    print(f"❌ 执行失败,错误代码: {result}")

验证结果


好了,以上就是今天分享的内容,感谢阅读!欢迎三连哦。

相关推荐
杨杨杨大侠3 小时前
Jev、Kev、Laya:决策模型怎么选,什么时候需要微调?
人工智能·python·agent
EatFan4 小时前
Spring Boot 4 落地观察:从 yudao-cloud、matecloud、JPower 看国产脚手架的升级路线与迁移清单
java·spring boot·后端·spring cloud·微服务·后端开发·jdk 21
LOVE️YOU4 小时前
Python 在定义函数时,究竟定义的是什么?
python
段一凡-华北理工大学4 小时前
大模型应用开发 100 天:Python + LLM 从入门到精通 day26~Prompt 调试与优化——A/B 测试与效果评估
windows·python·大模型·prompt·智能体·提示词工程·高炉智能化
Minecraft红客4 小时前
以撒的结合
python·游戏·电脑·娱乐
Circ.4 小时前
Python 调试 Litellm 本地大模型接口:模型列表与对话接口实操踩坑记录
开发语言·python
风早爽太5 小时前
用 ‌Render‌ 快速部署网站和常见问题解决
python·fastapi
波力海苔夹心脆6755 小时前
C# 序列化与反序列化详解:System.Text.Json、Newtonsoft.Json、XmlSerializer 用法、特性选项与安全实践
经验分享·后端·c#·json·.net
JavaGuide6 小时前
NVIDIA 又开源了!这次给 AI Agent 加上权限管控
前端·后端