Python: изменить разрешения (получить право собственности и полный контроль) ключей реестра, чтобы изменить их

Я хотел бы перебрать все ключи и подразделы реестра в кусте, найти значение, содержащее указанную строку, и заменить его новым (я адаптирую это код с использованием winreg)

Пока что мой код работает с ключами, у которых ownership равен Administrator, а у Administrator есть full control, но не с другими ключами.

Я мог бы установить разрешения для всех моих ключей, чтобы администратор имел полный контроль, но я хотел бы избежать этого. Вместо этого я хотел бы изменить только права доступа к ключам, которые соответствуют указанной строке. После изменения значения разрешения должны быть возвращены к тому, что они были.

Я видел этот ответ от 2012 года, но я бы не хотел устанавливать для этого программное обеспечение.


person MagTun    schedule 07.05.2017    source источник


Ответы (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 CONTROL для SYSTEM и Administrators, но никакая другая группа не будет иметь права на чтение или запись. Обратите внимание, что переменная ksd содержит исходный ACL, пока мы не запустим для нее .SetDacl(), поэтому, если вы хотите вернуть исходные разрешения после операции, просто верните их в другую переменную, например ksd_bac, а затем запустите win32api.RegSetKeySecurity(key, con.DACL_SECURITY_INFORMATION, ksd_bac) после операции. .

person Grintor    schedule 14.01.2020