需求
有些应用每次启动都需要用管理员权限运行,比如Python注入dll时,编辑器或cmd就需要以管理员权限运行,不然注入就会失败。
这篇文章用编程怎么修改配置实现打开某个软件都是使用管理员运行,就不用每次都右键点击以管理员身份运行此程序
。主要是给小白配置,防止他忘了以管理员权限运行,又不知道为啥Hook失败了
非编程方式
如果是自己想修改的话:右键软件或桌面快捷方式,兼容性->然后勾选以管理身份运行此程序
编程方式
有代码的软件
如果你需要运行的软件是自己写的,想在运行时申请管理员权限,可以在清单文件里增加一行:
<requestedExecutionLevel level='requireAdministrator' uiAccess='true' />
在visual studio中,可以右键项目属性,链接器->清单文件,UAC执行级别改成requireAdministrator
其他软件
软件本身没有申请管理员权限,而你又想让他以管理员权限运行。那就得知道非编程方式勾选的那个配置实际保存在哪里,你可以直接修改它保存的位置也能达到一样的效果
经过搜索发现,这个配置是保存在注册表中。
当前用户对应的注册表路径
HKEY_CURRENT_USERSoftwareMicrosoftWindows NTCurrentVersionAppCompatFlagsLayers
所有用户统一的配置路径
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionAppCompatFlagsLayers
当你在右键勾选这个选项时,当前用户的注册表路径下就会多出一个键来,键名是软件的绝对路径,值则是~ RUNASADMIN
如果你删除掉这个键,则在右键看的时候,选项是没有被勾选上的
另外,其他几个选项也是在这个路径下,分别对应不同的值,这里我就不演示了。
这里以Python为例修改注册表,让Python每次都以管理员权限启动。因为修改注册表本身就需要管理员权限,所以需要先申请管理员权限
import ctypes
import sys
from winreg import *
def add_runas():
exe_path = sys.executable
# 判断当前运行的Python是否具有管理员权限,没有则申请
if not ctypes.windll.shell32.IsUserAnAdmin():
ctypes.windll.shell32.ShellExecuteW(None, "runas", exe_path, __file__, None, 1)
reg_path = r"SoftwareMicrosoftWindows NTCurrentVersionAppCompatFlagsLayers"
reg_key = OpenKey(HKEY_CURRENT_USER, reg_path, access=KEY_SET_VALUE | KEY_READ)
runas_value = "~ RUNASADMIN"
try:
value = QueryValueEx(reg_key, exe_path)
except FileNotFoundError:
SetValueEx(reg_key, exe_path, 0, REG_SZ, runas_value)
else:
if runas_value[2:] not in value[0]:
SetValueEx(reg_key, exe_path, 0, REG_SZ, value[0] + ' ' + runas_value[2:])
if __name__ == "__main__":
add_runas()
其他方式
搜索的时候还看到可以通过修改快捷方式来达到这样的效果,不过我测试并不行,可能在最新的系统这个属于bug被修复了。如果有人测试成功的话,可以私聊我下原因
原文始发于微信公众号(Python成长路):Python给exe添加以管理员运行的属性
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/196016.html