Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Mac OS X和Windows上用Python获取根对话框?_Python_Windows_Macos_Wxpython_Root - Fatal编程技术网

在Mac OS X和Windows上用Python获取根对话框?

在Mac OS X和Windows上用Python获取根对话框?,python,windows,macos,wxpython,root,Python,Windows,Macos,Wxpython,Root,我如何在Python应用程序中弹出特权提升对话框?我想要Windows上的UAC对话框和Mac上的密码验证对话框 基本上,我需要我的应用程序的一部分的根权限,我需要通过GUI获得这些权限。我用的是wxPython。有什么想法吗?在Windows上,如果不启动新流程,您就无法获得UAC对话框,甚至无法使用CreateProcess启动该流程 UAC对话框可以通过运行另一个具有适当清单文件的应用程序来实现-有关如何使用py2exe执行此操作的示例,请参阅 您还可以通过编程在win32 api She

我如何在Python应用程序中弹出特权提升对话框?我想要Windows上的UAC对话框和Mac上的密码验证对话框


基本上,我需要我的应用程序的一部分的根权限,我需要通过GUI获得这些权限。我用的是wxPython。有什么想法吗?

在Windows上,如果不启动新流程,您就无法获得UAC对话框,甚至无法使用CreateProcess启动该流程

UAC对话框可以通过运行另一个具有适当清单文件的应用程序来实现-有关如何使用py2exe执行此操作的示例,请参阅

您还可以通过编程在win32 api ShellExecute中使用runas谓词-您可以通过使用ctypes调用它,ctypes是python 2.5+iirc标准库的一部分


对不起,我不知道Mac的事。如果你能详细说明你想在Windows上完成什么,我可能会提供更具体的帮助。

我在Mac OS X上也遇到了同样的问题。我有一个可行的解决方案,但不是最优的。我将在这里解释我的解决方案,并继续寻找更好的解决方案

在程序开始时,我通过执行

def _elevate():
    """Elevate user permissions if needed"""
    if platform.system() == 'Darwin':
        try:
            os.setuid(0)
        except OSError:
            _mac_elevate()
/usr/local/bin/run-as-root-wrapper /usr/local/bin/pyscripts/TrackingBlocker.py [args]
如果我还不是root用户,os.setuid(0)将失败,这将触发_mac_elevate(),在osascript的帮助下,从一开始就以管理员身份重新启动我的程序。osascript可用于执行applescript和其他内容。我是这样使用它的:

def _mac_elevate():
    """Relaunch asking for root privileges."""
    print "Relaunching with root permissions"
    applescript = ('do shell script "./my_program" '
                   'with administrator privileges')
    exit_code = subprocess.call(['osascript', '-e', applescript])
    sys.exit(exit_code)

问题是,如果我像上面那样使用subprocess.call,我会保持当前进程运行,并且会有两个应用程序实例运行,并给出两个停靠图标。如果我改用subprocess.Popen,让非特权进程立即消失,我就无法使用退出代码,也无法获取stdout/stderr流并传播到启动原始进程的终端。

我知道帖子有点旧,但我写了以下内容作为问题的解决方案(在Linux和OS X上以root用户身份运行python脚本)

我编写了以下bash脚本以使用管理员权限执行bash/python脚本(适用于Linux和OS X系统):

基本上,我设置系统的方式是在bin目录中保留子文件夹(例如/usr/local/bin/pyscripts in/usr/local/bin),并创建指向可执行文件的符号链接。这对我有三个好处:

(1) 如果我有不同的版本,我可以通过更改符号链接轻松切换执行哪一个版本,并保持bin目录更干净(例如/usr/local/bin/gcc versions/4.9/,/usr/local/bin/gcc versions/4.8/,/usr/local/bin/gcc-->gcc versions/4.8/gcc)

(2) 我可以存储脚本及其扩展名(有助于在IDE中突出显示语法),但可执行文件不包含它们,因为我喜欢这种方式(例如svn tools-->pyscripts/svn tools.py)

(3) 我将在下面说明原因:

我将脚本命名为“作为根包装器运行”,并将其放置在一个非常常见的路径中(例如/usr/local/bin),这样python就不需要任何特殊的东西来定位它

import os
import sys
from distutils.spawn import find_executable

#===========================================================================#

def wrap_to_run_as_root(exe_install_path, true_command, expand_path = True):
    run_as_root_path = find_executable("run-as-root-wrapper")

    if(not run_as_root_path):
        return False
    else:
        if(os.path.exists(exe_install_path)):
            os.unlink(exe_install_path)

        if(expand_path):
            true_command = os.path.realpath(true_command)
            true_command = os.path.abspath(true_command)
            true_command = os.path.normpath(true_command)

        f = open(exe_install_path, 'w')
        f.write("#!/bin/bash\n\n")
        f.write(run_as_root_path + " " + true_command + " $@\n\n")
        f.close()
        os.chmod(exe_install_path, 0755)

        return True
在我的实际python脚本中,我有以下函数:

def install_cmd(args):
    exe_install_path = os.path.join(args.prefix, 
                                    os.path.join("bin", args.name))

    if(not run_command.wrap_to_run_as_root(exe_install_path, sys.argv[0])):
        os.symlink(os.path.realpath(sys.argv[0]), exe_install_path)
因此,如果我有一个名为TrackingBlocker.py的脚本(我用来修改/etc/hosts文件以将已知跟踪域重新路由到127.0.0.1的实际脚本),当我调用“sudo/usr/local/bin/pyscripts/TrackingBlocker.py--prefix/usr/local--name ModifyTrackingBlocker install”(通过argparse模块处理的参数)时,它会安装“/usr/local/bin/ModifyTrackingBlocker”,这是一个正在执行的bash脚本

def _elevate():
    """Elevate user permissions if needed"""
    if platform.system() == 'Darwin':
        try:
            os.setuid(0)
        except OSError:
            _mac_elevate()
/usr/local/bin/run-as-root-wrapper /usr/local/bin/pyscripts/TrackingBlocker.py [args]
e、 g

执行:

/usr/local/bin/run-as-root-wrapper /usr/local/bin/pyscripts/TrackingBlocker.py add tracker.ads.com
然后显示获取要添加的权限所需的身份验证对话框:

127.0.0.1  tracker.ads.com
“我的主机”文件(该文件只能由超级用户写入)

如果您想简化/修改它,使其仅以root用户身份运行某些命令,只需将其添加到脚本中(使用上面提到的必要导入+导入子流程):

使用上述(在run_命令模块中):


不确定是否可以通过OSX中的python脚本来完成。在某些类Unix操作系统(包括OSX)下,无法授予脚本(如shell、perl、python等)调用chown/chgrp的权限,这会给您其他特权。
def run_as_root(command, args, expand_path = True):
    run_as_root_path = find_executable("run-as-root-wrapper")

    if(not run_as_root_path):
        return 1
    else:
        if(expand_path):
            command = os.path.realpath(command)
            command = os.path.abspath(command)
            command = os.path.normpath(command)

        cmd = []
        cmd.append(run_as_root_path)
        cmd.append(command)
        cmd.extend(args)

        return subprocess.call(' '.join(cmd), shell=True)
>>> ret = run_command.run_as_root("/usr/local/bin/pyscripts/TrackingBlocker.py", ["status", "display"])
>>> /etc/hosts is blocking approximately 16147 domains