Получение путей в папки автозапуска (Startup) из реестра
Согласно статье папки автозапуска (Startup) могут быть для всех пользователей и для текущего, плюс их расположение можно поменять через реестр, поэтому и нужно их пути получать из реестра
Возможные пути:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Common StartupHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Startup
Нужно получить их абсолютные пути и путь к папке SystemExplorerDisabled (это папка для тех файлов, которые были убраны из автозапуска)
Ответы (1 шт):
Автор решения: gil9red
Решение через модуль winreg и
→ Ссылка
Путей больше, всего в реестре их 8 (ссылка на список):
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders, Common Startup
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders, Common AltStartup
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders, Common Startup
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders, Common AltStartup
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders, Startup
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders, AltStartup
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders, Startup
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders, AltStartup
Причем, те, что с AltStartup устаревшие и не используются больше: https://docs.microsoft.com/en-us/windows/win32/shell/csidl
UPD.:
В предыдущей версии ответа было 2 пути и учитывались пути с SystemExplorerDisabled, что неправильно т.к. эту папку создает программа SystemExplorer, и я понял это после :)
Решение через модуль winreg и pathlib:
- Описал в список все пути
- Сделал функцию, что по указанному пути и имени значения вернет путь
- Сделал функцию, что вернет список файлов по всем путям
Код:
common.py:
import os
import winreg
from dataclasses import dataclass
from typing import List, Optional
from pathlib import Path
from winreg import QueryInfoKey, EnumValue, OpenKey, HKEYType
@dataclass
class Entry:
name: str
value: str
type: int
def expand_registry_key(key: str) -> str:
return {
'HKCU': 'HKEY_CURRENT_USER',
'HKLM': 'HKEY_LOCAL_MACHINE',
}.get(key, key)
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_name = expand_registry_key(registry_key_name)
registry_key = getattr(winreg, registry_key_name)
try:
return OpenKey(registry_key, relative_path)
except:
return
def get_entries(path: str, expand_vars=True) -> List[Entry]:
items = []
key = get_key(path)
if not key:
return items
_, 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)
items.append(
Entry(name, value, type_value)
)
return items
def get_entry(path: str, value: str, expand_vars=True) -> Optional[Entry]:
for entry in get_entries(path, expand_vars):
if entry.name == value:
return entry
def get_entry_path(path: str, name: str) -> Optional[Path]:
entry = get_entry(path, name)
if not entry:
return
return Path(entry.value)
get_startup_paths.py
from fnmatch import fnmatch
from pathlib import Path
from typing import List
from common import get_entry_path
PATHS = [
(r'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders', 'Common Startup'),
(r'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders', 'Common AltStartup'),
(r'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders', 'Common Startup'),
(r'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders', 'Common AltStartup'),
(r'HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders', 'Startup'),
(r'HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders', 'AltStartup'),
(r'HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders', 'Startup'),
(r'HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders', 'AltStartup'),
]
def get_path_files(path: Path, ignored_by_mask=('*.ini',)) -> List[Path]:
items = []
if path and path.exists():
for file in path.iterdir():
if not file.is_file() or any(fnmatch(file.name, mask) for mask in ignored_by_mask):
continue
items.append(file)
return items
def get_all_files(ignored_by_mask=('*.ini',)) -> List[Path]:
items = []
for key_path, value in PATHS:
path = get_entry_path(key_path, value)
for file in get_path_files(path, ignored_by_mask):
if file not in items:
items.append(file)
return items
Пример использования:
for key_path, value in PATHS:
path = get_entry_path(key_path, value)
print(fr'{key_path}\{value} = {path}')
files = get_path_files(path)
print(f' Files ({len(files)}): {files}')
print()
all_files = get_all_files()
print(f'All files ({len(all_files)}): {all_files}')