Получение списка команд на автозапуск из реестра Windows

Продолжаю решать задачи получения программ из автозапуска, начавшуюся с получения путей к папкам Startup из реестра :)

Задача: получить все программы из автозапуска в реестре

Ключи для примера:

  • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run

Пример получения по ключу списка значений, в котором будут программы на автозапуск для текущего пользователя:

import winreg

from typing import Optional
from winreg import QueryInfoKey, EnumValue, OpenKey, HKEYType


def get_key(path: str) -> Optional[HKEYType]:
    # Example:
    #     path = r"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
    #     registry_key_name = "HKEY_LOCAL_MACHINE"
    #     relative_path = r"Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
    registry_key_name, relative_path = path.split('\\', maxsplit=1)
    registry_key = getattr(winreg, registry_key_name)

    try:
        return OpenKey(registry_key, relative_path)
    except:
        return


key = get_key(r"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run")

_, number_of_values, _ = QueryInfoKey(key)
for i in range(number_of_values):
    name, value, type_value = EnumValue(key, i)
    print(name, value)

Ответы (1 шт):

Автор решения: gil9red

Действия:

  • Расширил список ключей (примеры взял из источников ниже)
  • Для удобства работы с кодом:
    • Обернул в функцию
    • Значения храню в классе

Источники:

Решение:

import os
import winreg

from dataclasses import dataclass
from typing import Dict, List, Optional
from winreg import QueryInfoKey, EnumValue, OpenKey, HKEYType


def get_key(path: str) -> Optional[HKEYType]:
    # Example:
    #     path = r"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
    #     registry_key_name = "HKEY_LOCAL_MACHINE"
    #     relative_path = r"Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
    registry_key_name, relative_path = path.split('\\', maxsplit=1)
    registry_key = getattr(winreg, registry_key_name)

    try:
        return OpenKey(registry_key, relative_path)
    except:
        return


PATHS = [
    r"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run",
    r"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run",

    r"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce",
    r"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce",

    r"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run",
    r"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run",

    r"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce",
    r"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce",

    r"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices",
    r"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices",

    r"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce",
    r"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce",

    r"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup",
    r"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup",

    r"HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows\load",
    r"HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Winlogon\Userinit",
    r"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnceEx",
]


@dataclass
class RegistryValue:
    name: str
    value: str
    type: int


def get_run_paths(expand_vars=True) -> Dict[str, List[RegistryValue]]:
    path_by_values = dict()

    for path in PATHS:
        if path not in path_by_values:
            path_by_values[path] = []

        key = get_key(path)
        if not key:
            continue

        _, number_of_values, _ = QueryInfoKey(key)
        for i in range(number_of_values):
            name, value, type_value = EnumValue(key, i)
            value = str(value)
            if expand_vars:
                value = os.path.expandvars(value)

            path_by_values[path].append(
                RegistryValue(name, value, type_value)
            )

    return path_by_values

Пример использования:

run_paths = get_run_paths()
for path, values in run_paths.items():
    print(path)

    for i, value in enumerate(values, 1):
        print(f'    {i}. {value.name}: {value.value}')

    print()
→ Ссылка