You need to enable JavaScript to run this app. Python中如何让subprocess启动的子进程不继承管理员权限
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何让subprocess启动的子进程不继承管理员权限

Windows管理员权限Python脚本降权启动子进程解决方案

以下两种方案都不会改变原有Python脚本的管理员权限,仅对子进程生效:

方案1:通过explorer.exe间接启动(轻量方案)

Windows系统中explorer.exe默认以当前登录用户的普通权限运行,管理员进程通过explorer启动目标程序时,会自动继承explorer的普通权限,无需额外依赖。

实现代码

import subprocess
import os

# 优先获取目标程序绝对路径,避免相对路径解析错误
subscript_path = os.path.abspath("subscript.exe")
# 路径包含空格时需要用双引号包裹
launch_cmd = f'explorer.exe "{subscript_path}"'
test_process = subprocess.Popen(launch_cmd, shell=True)

优缺点

  • 优点:实现简单,无需额外安装依赖,适配绝大多数Windows场景
  • 缺点:无法直接捕获子进程的标准输入输出、退出码,explorer进程未运行时会失效

方案2:调用Windows API创建普通权限进程(可控方案)

适合需要对子进程进行生命周期管理、IO交互的场景,需要依赖pywin32库调用系统接口。

前置依赖

运行前先安装依赖包:
pip install pywin32

实现代码

import os
import win32api
import win32con
import win32process
import win32security

def create_low_privilege_process(exe_path: str):
    # 获取桌面shell进程(默认是explorer)的权限令牌
    shell_hwnd = win32api.GetShellWindow()
    _, shell_pid = win32process.GetWindowThreadProcessId(shell_hwnd)
    shell_handle = win32api.OpenProcess(
        win32con.PROCESS_QUERY_INFORMATION | win32con.PROCESS_DUP_HANDLE,
        False,
        shell_pid
    )
    shell_token = win32security.OpenProcessToken(
        shell_handle,
        win32con.TOKEN_DUPLICATE | win32con.TOKEN_ASSIGN_PRIMARY | win32con.TOKEN_QUERY
    )
    # 复制普通权限令牌用于创建新进程
    user_token = win32security.DuplicateTokenEx(
        shell_token,
        win32security.SecurityImpersonation,
        win32con.TOKEN_ALL_ACCESS,
        win32security.TokenPrimary,
        None
    )
    # 用普通权限令牌启动进程
    startup_info = win32process.STARTUPINFO()
    startup_info.cb = startup_info.sizeof()
    process_info = win32process.CreateProcessAsUser(
        user_token,
        exe_path,
        None,
        None,
        None,
        False,
        win32con.CREATE_NEW_CONSOLE,
        None,
        os.path.dirname(exe_path),
        startup_info
    )
    return process_info

# 调用示例
subscript_path = os.path.abspath("subscript.exe")
test_process_info = create_low_privilege_process(subscript_path)
# 可通过test_process_info获取进程ID、句柄,用于后续管理

优缺点

  • 优点:可以自由控制子进程启动参数,支持捕获IO、获取退出码,不依赖explorer运行状态,可靠性高
  • 缺点:需要额外安装第三方依赖,仅支持Windows系统

注意事项

  • 如果subscript.exe本身配置了自动提权的manifest属性,启动时仍会弹出UAC提权提示,需要修改目标程序的manifest配置关闭自动提权
  • 目标路径存在空格时,必须用双引号包裹路径,避免解析异常

内容的提问来源于stack exchange,提问作者Bored002

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 04:06:02