这篇文章是笔者近期开发「Todo-List」应用的跨端数据传输遇到的问题:使用
subprocess指令配置开通指定端口号防火墙入站规则报错了。PS:有关subprocess入门的,可以查阅此前这篇文章:用python实现类AI自动执行终端指令
直接使用 subprocess 的核心源码是这样的:
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_USESHOWWINDOWstartupinfo.wShowWindow = subprocess.SW_HIDEresult = subprocess.run(cmd,startupinfo=startupinfo,shell=True,capture_output=True,text=True,encoding='utf-8',timeout=10)

但是报错了:请求的操作需要提升(作为管理员运行)
为什么会报错呢?这就要说到 Windows 的 UAC 提权问题了。

相信有同学在日常使用 Windows 电脑的时候,遇到过这种提示吧。
这是 Windows 的一种安全权限控制机制 - 用户账户控制 (User Account Control),简单点说,就是当程序需要执行一些高危操作,比如在系统盘写数据的时候,那么系统就会自动提示用户是否提升至管理员权限,以便程序可以操作。也就是这个提示相当于通知用户,这个操作可能很危险,让用户权衡是否允许执行。
想配置防火墙这种操作,如果使用普通账户,是没法执行的。PS:当时找过资料,想通过用户级别的防火墙配置来绕过提权限制的,发现在 Windows11 不生效。
官网资料:使用 netsh advfirewall 防火墙上下文 - Windows Server | Microsoft Learn[1]
# 旧的、可能失效的命令 - 用户级别防火墙配置,分析可能在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 ,提示以管理员身份运行。
# 构建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}")
验证结果

好了,以上就是今天分享的内容,感谢阅读!欢迎三连哦。
使用 netsh advfirewall 防火墙上下文 - Windows Server | Microsoft Learn: https://learn.microsoft.com/zh-cn/troubleshoot/windows-server/networking/netsh-advfirewall-firewall-control-firewall-behavior