【问题标题】:Python subprocess scripts as elevated userPython子进程脚本作为提升用户
【发布时间】:2016-09-29 22:47:06
【问题描述】:

我正在尝试使用 python 来触发一个 Powershell 脚本,当我从我与 Powershell 的连接(默认为“以管理员身份运行”)运行它时,该脚本运行良好。但是,当从 python 界面启动时,它给了我一个权限被拒绝的错误。这是我尝试运行的一些代码的 sn-p,它在由 Python 启动时失败,但在通过 powershell 提示符启动时没有。

elif "!ExchangeCheck" in message:
    response = subprocess.Popen("powershell -ExecutionPolicy Unrestricted -File C:\users\.....\code\servicecheck.ps1", shell=True, stdout=subprocess.PIPE).stdout.read()
    status = "Exchange services are: \n"
    for line in thing:
        if "Microsoft Exchange" in response:
            status += line
    print status

希望找到一种将 Popen 或类似 paramiko 用于 powershell 的方法,它会尝试“以管理员身份运行”或至少在尝试运行时使用我的本机权限?

更新:我已验证我的 python 脚本以管理员用户身份运行。

更新 2:我认为解决方案是使用 runas 命令运行脚本来增加预期目标,但我不知道这是否是“好”的做事方式,这似乎不太理想。

【问题讨论】:

  • Python 进程是否以提升的权限运行?
  • @jpmc26 我有一个管理控制台,我可以从中启动 python 脚本。所以从管理员命令提示符 --> python program.py
  • 尝试使用代码here 来检查您的Python 进程是否具有管理员权限。
  • @jpmc26 在启动该文件时响应为真,就像我启动我的脚本一样。我猜这是当我的脚本尝试启动 powershell 时权限丢失的地方 =(

标签: python powershell permissions


【解决方案1】:

如果您尝试调用具有足够权限的子进程怎么办?我认为 ctypes 库可以帮助你完成这项任务(只是 trythis 装饰器)

def elevate_process(funct):
"""
Decorator to elevate privileges of a function on windows systems, it will create a sub process with administration privileges when the wrapper detects there is not enough privileges.
"""
import sys
def wrapper(*args, **kwargs):
    import ctypes
    import subprocess
    validation = ctypes.windll.shell32.IsUserAnAdmin()
    if validation == 1:
        return funct(*args, **kwargs)
    else:
        ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, " ".join(sys.argv), None, 1)
return wrapper

【讨论】:

    猜你喜欢
    • 2015-07-20
    • 2017-10-30
    • 2012-07-29
    • 1970-01-01
    • 2013-03-06
    • 2018-01-05
    • 1970-01-01
    • 2019-09-15
    相关资源
    最近更新 更多