Получение списка команд на автозапуск из реестра Windows
Продолжаю решать задачи получения программ из автозапуска, начавшуюся с получения путей к папкам Startup из реестра :)
Задача: получить все программы из автозапуска в реестре
Ключи для примера:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunHKEY_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()