Python:更改注册表项的权限(取得所有权和完全控制权)以修改它们

Python:更改注册表项的权限(取得所有权和完全控制权)以修改它们,python,registry,uac,file-ownership,Python,Registry,Uac,File Ownership,我想循环遍历配置单元中的所有注册表项和子项,找到包含指定字符串的值,并将其替换为新字符串(我正在使用 到目前为止,我的代码适用于所有权为管理员且管理员拥有完全控制权的密钥,但不适用于其他密钥 我可以设置所有密钥的权限,以便管理员可以完全控制,但我希望避免这种情况。相反,我只想更改与指定字符串匹配的密钥的权限。修改值后,应将权限设置回原来的状态 我从2012年就看到了这一点,但我希望避免为此安装软件 由于没有人回答这个问题,我想我应该分享我的解决方案,使用库设置给定密钥的权限: 这将为系统和管理员

我想循环遍历配置单元中的所有注册表项和子项,找到包含指定字符串的值,并将其替换为新字符串(我正在使用

到目前为止,我的代码适用于
所有权
管理员
管理员
拥有
完全控制权
的密钥,但不适用于其他密钥

我可以设置所有密钥的权限,以便管理员可以完全控制,但我希望避免这种情况。相反,我只想更改与指定字符串匹配的密钥的权限。修改值后,应将权限设置回原来的状态


我从2012年就看到了这一点,但我希望避免为此安装软件

由于没有人回答这个问题,我想我应该分享我的解决方案,使用库设置给定密钥的权限:

这将为
系统
管理员
HKLM\SOFTWARE\MyKey
密钥权限设置为
完全控制
,但其他组将没有读写权限。请注意,
ksd
变量中包含原始ACL,直到我们对其运行
.SetDacl()
,因此如果您想在操作后写回原始权限,只需先将其备份到另一个变量,如
ksd\u bac
,然后运行
win32api.RegSetKeySecurity(key,con.DACL\u SECURITY\u INFORMATION,ksd\u bac)
操作完成后

import win32con as con
import win32api
import ntsecuritycon as ntc
import pywintypes
import win32security

key = win32api.RegOpenKey(con.HKEY_LOCAL_MACHINE, 'Software\\MyKey', 0, con.KEY_ALL_ACCESS)
ksd = win32api.RegGetKeySecurity(key, con.DACL_SECURITY_INFORMATION)

acl = pywintypes.ACL()
acl.AddAccessAllowedAce(ntc.GENERIC_ALL, win32security.ConvertStringSidToSid('S-1-5-18'))
acl.AddAccessAllowedAce(ntc.GENERIC_ALL, win32security.ConvertStringSidToSid('S-1-5-32-544'))

ksd.SetDacl(True, acl, False)

win32api.RegSetKeySecurity(key, con.DACL_SECURITY_INFORMATION, ksd)