2

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

到目前为止,我的代码适用于那些ownership具有但不在其他键上的键。AdministratorAdministratorfull control

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

我从 2012 年就看到了这个答案,但我想避免为此安装软件。

4

1 回答 1

1

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

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)

这会将HKLM\SOFTWARE\MyKey密钥权限设置为FULL CONTROLfor SYSTEMAdministrators但没有其他组具有读取或写入权限。请注意,在ksd我们对其运行之前,该变量中包含原始 ACL .SetDacl(),因此,如果您想在操作后写回原始权限,只需将其备份到另一个变量,如ksd_bac先,然后win32api.RegSetKeySecurity(key, con.DACL_SECURITY_INFORMATION, ksd_bac)在操作后运行。

于 2020-01-14T22:32:43.607 回答