Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Как правильно удалить раздел в реестре Windows? (Python) (http://forum.oszone.net/showthread.php?t=353113)

JanLevine 22-02-2023 16:13 3003883

Как правильно удалить раздел в реестре Windows? (Python)
 
Всем доброго времени суток!

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

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

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



Это получилось решить только открыв Редактор реестра от имени "Системы" через утилиту 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 3003886

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

Sham 23-02-2023 07:09 3003939

1. у меня с subprocess.PIPE не выводит в консоль, только без них. В доке на subprocess рекомендуют run вместо call
2. с таким path ошибка, видимо надо его добавить в массив аргументов справа по отдельности ... "delete", "HKLM\\.....", "/f" тогда будет правильная конечная команда.

JanLevine 23-02-2023 14:35 3003959

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"])



Время: 13:11.

Время: 13:11.
© OSzone.net 2001-