1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
| import os
import shlex
import winreg
def query_registry_value(root_key, key_path, value_name):
"""
Helper function to query a registry value.
:param root_key: root key of the registry, like winreg.HKEY_...
:param key_path: path of the desired path
:param value_name: value of the previous path
"""
try:
with winreg.OpenKey(root_key, key_path) as key:
return winreg.QueryValueEx(key, value_name)[0]
except FileNotFoundError as e:
return None
def enum_registry_value(root_key, key_path, index):
"""
Helper function to enumerate registry value.
:param root_key: root key of the registry, like winreg.HKEY_...
:param key_path: path of the desired path
:param index: index to get
"""
try:
with winreg.OpenKey(root_key, key_path) as key:
return winreg.EnumValue(key, index)[0]
except (FileNotFoundError, OSError )as e:
return None
def clean_path(path):
path = os.path.expandvars(path)
path = shlex.split(path, posix=False)[0]
path = path.strip('"')
return path
def get_app_path(ext):
"""Function to get the application path associated with a file extension."""
# Try to get ProgID from UserChoice in HKEY_CURRENT_USER
prog_id = query_registry_value(winreg.HKEY_CURRENT_USER, fr'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\{ext}\UserChoice', 'ProgId')
if prog_id:
path = query_registry_value(winreg.HKEY_CURRENT_USER, fr'Software\Classes\{prog_id}\shell\open\command', '')
if path:
return clean_path(path)
# Try to get path from HKEY_CLASSES_ROOT using ProgID for Microsoft Apps
package_id = query_registry_value(winreg.HKEY_CLASSES_ROOT, rf'{prog_id}\Shell\open', 'PackageId')
relative_exe_path = query_registry_value(winreg.HKEY_CLASSES_ROOT, rf'{prog_id}\Shell\open', 'PackageRelativeExecutable')
if package_id and relative_exe_path:
path = clean_path(fr'"C:\Program Files\WindowsApps\{package_id}\{relative_exe_path}"')
if os.path.exists(path):
return path
# Try to get path from HKEY_CLASSES_ROOT using directly the extension
class_root = query_registry_value(winreg.HKEY_CLASSES_ROOT, ext, '')
if class_root:
path = query_registry_value(winreg.HKEY_CLASSES_ROOT, fr'{class_root}\shell\open\command', '')
if path:
return clean_path(path)
# Try to get path from Software classes using ProgID in HKEY_LOCAL_MACHINE
path = query_registry_value(winreg.HKEY_LOCAL_MACHINE, fr'Software\Classes\{ext}\shell\open\command', '')
if path:
return clean_path(path)
# Try to get ProgId from OpenWithProgids in HKEY_CLASSES_ROOT
prog_id = enum_registry_value(winreg.HKEY_CLASSES_ROOT, fr'{ext}\OpenWithProgids', 0)
if prog_id:
path = query_registry_value(winreg.HKEY_CLASSES_ROOT, fr'{prog_id}\shell\open\command', '')
if path:
return clean_path(path)
# Try to get ProgId from OpenWithList in HKEY_CURRENT_USER
prog_id = enum_registry_value(winreg.HKEY_CURRENT_USER, fr'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\{ext}\OpenWithList', 0)
if prog_id:
path = query_registry_value(winreg.HKEY_CLASSES_ROOT, fr'{prog_id}\shell\open\command', '')
if path:
return clean_path(path)
# If no path is found, return None
return None
# Extensions to check (examples)
extensions = [
'.txt', '.xml', '.html',
'.pdf', '.doc', '.dot', '.dotx', '.pptx', '.xlsm',
'.jpg', '.png', '.svg', '.webp', '.gif', '.bmp',
'.py', '.php',
'.sys', '.bin', '.bat',
'.rar', '.zip', '.7zip',
'.mp4', '.avi',
'.wav', '.mp3',
]
for extension in extensions:
app_path = get_app_path(extension)
print(f'Extension: {extension}, Program: {app_path}') |
Partager