V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
dtfm
V2EX  ›  Python

大家知道怎么在 windows 环境下以管理员模式运行 python 么?

  •  
  •   dtfm · 2016-07-03 02:04:22 +08:00 · 12715 次点击
    这是一个创建于 3066 天前的主题,其中的信息可能已经有所发展或是发生改变。
    是这样,实在看不惯 WIN10 非活动窗口的惨白,就自己些写了个脚本一键修改注册表,使其和前台窗口颜色同步,但需要涉及到注册表 create 操作,需要管理员权限, Google 了半天也没找到怎么执行成功的方法。
    附上代码:
    import winreg
    def regcolorchange():
    key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"SOFTWARE\Microsoft\Windows\DWM")
    #获取前台窗口的注册表颜色值
    regAccentColor=winreg.QueryValueEx(key, "AccentColor")
    #元组内 value 为颜色值, type 为类型
    value=(regAccentColor[0])
    type=(regAccentColor[1])
    #赋给 AccentColorInactive ,修改后台窗口颜色
    winreg.SetValueEx(key,"AccentColorInactive",0,type,value)
    regcolorchange()
    20 条回复    2016-07-03 17:03:29 +08:00
    fy
        1
    fy  
       2016-07-03 02:40:27 +08:00
    你搞个管理员权限 cmd 去执行就好了。
    xupefei
        2
    xupefei  
       2016-07-03 02:50:33 +08:00
    HKCU\SOFTWARE\Microsoft\Windows\DWM 写入并不需要管理员权限。
    如果 py 坚持要管理员权限,你可以直接调用 WIN32 API 。
    emric
        3
    emric  
       2016-07-03 02:54:15 +08:00
    不能用 bat 或者 reg 吗
    dtfm
        4
    dtfm  
    OP
       2016-07-03 03:05:05 +08:00
    @fy 不能啊,还是拒绝我访问啊
    dtfm
        5
    dtfm  
    OP
       2016-07-03 03:05:55 +08:00
    @xupefei 不需要么?难道是我写法上有问题, winreg 这个库不是太熟,抱佛脚看的文档就上了。
    dtfm
        6
    dtfm  
    OP
       2016-07-03 03:06:42 +08:00
    @emric 不会啊,习惯了用 python 写点小玩意,并没有冲动去搞 bat 啊。
    emric
        7
    emric  
       2016-07-03 03:38:30 +08:00
    ···
    for /F "skip=1 tokens=1,2,*" %%i IN ('reg query "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\DWM" /v AccentColor') DO set COLOR=%%k
    reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa" /v AccentColorInactive /t REG_DWORD /d %COLOR% /f
    ···

    存至 bat ,右键管理员运行
    mxalbert1996
        8
    mxalbert1996  
       2016-07-03 03:51:30 +08:00 via Android
    管理员权限的 cmd 里运行的所有程序都具有管理员权限,如果还不行那就说明不是管理员权限的问题。
    xupefei
        9
    xupefei  
       2016-07-03 05:20:40 +08:00
    Document of _winreg.OpenKey(key, sub_key[, res[, sam]]):

    sam is an integer that specifies an access mask that describes the desired security access for the key. Default is KEY_READ.

    sam 权限不对。

    改正后应该是不需要管理员权限就能用的。
    BMW
        10
    BMW  
       2016-07-03 07:05:26 +08:00 via iPhone
    搞开发的就不应该用 windows 吧
    kindjeff
        11
    kindjeff  
       2016-07-03 10:16:36 +08:00 via iPhone
    用管理员方式打开 cmd 然后在 cmd 里执行不行么
    dtfm
        12
    dtfm  
    OP
       2016-07-03 11:34:43 +08:00
    @emric 虽然不怎么看得懂语法,但我试了下,没有效果啊,注册表没有得到修改。
    ksc010
        13
    ksc010  
       2016-07-03 11:45:03 +08:00
    rem 在 win7 下右击此脚本,然后以管理员身份运行
    rem 需要 把 python.exe 所在的目录加入环境变量

    @echo off
    if not "%1" == "uac" (
    echo 申请 UAC 权限...
    goto GetUAC
    ) else ( goto DO )

    :GetUAC
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "%~s0", "uac", "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs"
    exit /B

    :DO
    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
    pushd "%CD%"
    CD /D "%~dp0"


    python.exe %~dp0XXXXX.py
    pause

    XXXXX.py 是脚本名称
    存储为 bat 文件
    双击运行自动弹出 UAC 授权
    emric
        14
    emric  
       2016-07-03 12:00:02 +08:00
    ```
    @echo off
    for /F "skip=1 tokens=1,2,*" %%i IN ('reg query "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\DWM" /v AccentColor') DO set COLOR=%%k
    reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\DWM" /v AccentColorInactive /t REG_DWORD /d %COLOR% /f
    ```
    @dtfm 拿我之前的脚本改的。忘记改第二行的路径了... 这个就没问题了。
    dtfm
        15
    dtfm  
    OP
       2016-07-03 12:09:03 +08:00
    @xupefei 感谢,你这个给了我思路,应该是忘了加上读写权限了,虽然_winreg 是 Python2 时代的语法了。
    这一行应该是这样:
    key = winreg.OpenKeyEx(winreg.HKEY_CURRENT_USER, r"SOFTWARE\Microsoft\Windows\DWM",0,winreg.KEY_ALL_ACCESS)
    dtfm
        16
    dtfm  
    OP
       2016-07-03 15:21:28 +08:00
    @emric 可以这个可以,不过我也用 python 写出来了,之前是 READ 权限,不能写。
    dtfm
        17
    dtfm  
    OP
       2016-07-03 15:22:24 +08:00
    @ksc010 这个是直接向系统申请权限的写法?
    dtfm
        18
    dtfm  
    OP
       2016-07-03 15:23:26 +08:00
    感谢楼上的诸位,已经完全搞定,介绍放在了知乎专栏上: https://zhuanlan.zhihu.com/p/21477137
    下载地址: https://1drv.ms/f/s!AplN36d0zPo8hR8x1KgzdIuyBS7t
    ksc010
        19
    ksc010  
       2016-07-03 16:43:22 +08:00
    @dtfm 是 双击后通过 vbs 脚本申请 UAC 授权 同意后执行 python 脚本 不用对注册表做修改
    somebody
        20
    somebody  
       2016-07-03 17:03:29 +08:00 via Android
    对可执行文件和快捷方式,右键-属性-兼容性-以管理员权限运行
    .py 文件不知道,不过你可以建一个.lnk 快捷方式调 Python
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2810 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 55ms · UTC 09:38 · PVG 17:38 · LAX 01:38 · JFK 04:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.