Войти

Показать полную графическую версию : [решено] Как правильно удалить раздел в реестре Windows? (Python)


JanLevine
22-02-2023, 16:13
Всем доброго времени суток!

Пишу небольшой метод для скрипта на Python, который будет удалять все ключи и их значения по заданному "пути" в реестре Windows.

Изначально чтобы решить этот вопрос использовал стандартный модуль Python - winreg, ну и сам метод рекурсивный.
В целом это работает, но например для "пути" реестра: HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\USBSTOR
winreg генерирует исключение "[WinError 5] Access denied".

Пытался побороть эту злонапасть запуская скрипт от имени "Администратора", но без результата.
Также заметил интересную особенность, что если открыть тот же Редактор реестра в Windows от имени "Администратора"
и попытаться открыть подключ "Properties", то будет та же ошибка (ниже скриншот):

https://i.ibb.co/jbkQq9x/regedit.jpg

Это получилось решить только открыв Редактор реестра от имени "Системы" через утилиту PsExec с параметром -s,
но скрипт на Python мне как раз нужен чтобы не делать всё вручную. Поэтому пришла идея в обработчике исключения,
в скрипте Python, запущенного от "Администратора" вызвать PsExec чтобы тот в свою очередь запустил от имени системы команду reg delete.
Кусок кода, который это делает, выглядит так:

# Например path это строка: HKLM\SYSTEM\ControlSet001\Enum\USBSTOR\Disk&Ven_bla_bla_bla
path = "delete \"" + path + "\"" + " /f"

psPath = os.getcwd() + "\\PsTools\\PsExec64.exe"

subprocess.call([psPath, "-accepteula", "-s", "C:\\Windows\\System32\\reg.exe", path], stderr=subprocess.PIPE, stdout=subprocess.PIPE)

Этот кусок отрабатывает без ошибок, но удаления не происходит.
Попытка не городить сложностей, а просто запустить сразу через PsExec сам скрипт от имени "Системы", тоже не удалась.

Как лучше всего програмно удалить раздел в реестре Windows, если судя по всему, не хватает прав?
Может кто-то может подсказать, что не так в куске кода выше, почему не происходит удаления?

Заранее спасибо!

JanLevine
22-02-2023, 16:23
P.S. если важно (хотя думаю, что не так и уж), то операционка - Win 10, в других версиях не проверял.

Sham
23-02-2023, 07:09
1. у меня с subprocess.PIPE не выводит в консоль, только без них. В доке на subprocess рекомендуют run вместо call (https://docs.python.org/3/library/subprocess.html#subprocess.call)
2. с таким path ошибка, видимо надо его добавить в массив аргументов справа по отдельности ... "delete", "HKLM\\.....", "/f" тогда будет правильная конечная команда.

JanLevine
23-02-2023, 14:35
Sham, с праздниками Вас, а также большое спасибо за наводку про правильную передачу аргументов и ссыль на доку.
Всё заработало :), ещё был момент, что не нужно было оборачивать путь реестра в кавычки, код получился такой (возможно, кому-нибудь он будет полезен в будущем):


# Получили путь до текущей рабочей папки и PsTools
psPath = os.getcwd() + "\\PsTools\\PsExec64.exe"

# Запустили удаление reg delete от имени Системы
# Например path это строка: HKLM\SYSTEM\ControlSet001\Enum\USBSTOR\Disk&Ven_bla_bla_bla
subprocess.run([psPath, "-accepteula", "-s", "C:\\Windows\\System32\\reg.exe", "delete", path, "/f"])




© OSzone.net 2001-2012