Python 已安装程序的列表
我使用register和Win32_Product类中的搜索来获取计算机上安装的程序列表,但它并没有给出所有程序,我在C++中看到过与控制面板的程序和组件中给出相同结果的程序。有没有python的api可以给我同样的结果。 这是c++的代码 我就是这么用的: 导入win32com.clientPython 已安装程序的列表,python,winapi,pywin32,Python,Winapi,Pywin32,我使用register和Win32_Product类中的搜索来获取计算机上安装的程序列表,但它并没有给出所有程序,我在C++中看到过与控制面板的程序和组件中给出相同结果的程序。有没有python的api可以给我同样的结果。 这是c++的代码 我就是这么用的: 导入win32com.client strComputer = "." objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator") objSWbemServi
strComputer = "."
objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
objSWbemServices = objWMIService.ConnectServer(strComputer, "root\cimv2")
colItems = objSWbemServices.ExecQuery("Select * from Win32_Product")
for objItem in colItems:
print("Name: ", objItem.Name)
和whis注册表:
aReg = ConnectRegistry(None, HKEY_LOCAL_MACHINE)
aKey = OpenKey(aReg, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall")
for i in range(1024):
try:
asubkey_name = EnumKey(aKey, i)
asubkey = OpenKey(aKey, asubkey_name)
val = str(QueryValueEx(asubkey, "DisplayName"))
b = "!@#$,01'"
for char in b:
val = val.replace(char, "")
r = len(val)
val = str(val[1:r - 2])
val2 = str(QueryValueEx(asubkey, "DisplayIcon"))
if s.lower() in val.lower():
r = len(val2)
val2 = str(val2[2:r - 5])
# print(val2)
subprocess.Popen(val2)
break
# print(val, val2)
except EnvironmentError:
continue
使用
KEY\u WOW64\u 32KEY
和KEY\u WOW64\u 64KEY
检查32位和64位注册表。此外,一些安装程序将使用HKEY\U CURRENT\U USER
,尽管后者很少使用
注意,pywin32的queryvaluex
返回一个元组,该元组中的第一个元素包含所需的字符串QueryInfoKey
返回其第一个元素为子键总数的元组
def foo(hive, flag):
aReg = winreg.ConnectRegistry(None, hive)
aKey = winreg.OpenKey(aReg, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",
0, win32con.KEY_READ | flag)
count_subkey = winreg.QueryInfoKey(aKey)[0]
for i in range(count_subkey):
try:
asubkey_name = winreg.EnumKey(aKey, i)
asubkey = winreg.OpenKey(aKey, asubkey_name)
val = winreg.QueryValueEx(asubkey, "DisplayName")[0]
print(val)
except EnvironmentError:
continue
foo(win32con.HKEY_LOCAL_MACHINE, win32con.KEY_WOW64_32KEY)
foo(win32con.HKEY_LOCAL_MACHINE, win32con.KEY_WOW64_64KEY)
foo(win32con.HKEY_CURRENT_USER, 0)
使用
KEY\u WOW64\u 32KEY
和KEY\u WOW64\u 64KEY
检查32位和64位注册表。此外,一些安装程序将使用HKEY\U CURRENT\U USER
,尽管后者很少使用
注意,pywin32的queryvaluex
返回一个元组,该元组中的第一个元素包含所需的字符串QueryInfoKey
返回其第一个元素为子键总数的元组
def foo(hive, flag):
aReg = winreg.ConnectRegistry(None, hive)
aKey = winreg.OpenKey(aReg, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",
0, win32con.KEY_READ | flag)
count_subkey = winreg.QueryInfoKey(aKey)[0]
for i in range(count_subkey):
try:
asubkey_name = winreg.EnumKey(aKey, i)
asubkey = winreg.OpenKey(aKey, asubkey_name)
val = winreg.QueryValueEx(asubkey, "DisplayName")[0]
print(val)
except EnvironmentError:
continue
foo(win32con.HKEY_LOCAL_MACHINE, win32con.KEY_WOW64_32KEY)
foo(win32con.HKEY_LOCAL_MACHINE, win32con.KEY_WOW64_64KEY)
foo(win32con.HKEY_CURRENT_USER, 0)
稍有改进的版本,无需win32con导入,即可检索软件版本和发布者。感谢Barmak Shemirani的初步回答:) [编辑] 免责声明:本文中的代码已经过时。 我已将该代码作为python包发布。 使用
pip安装windows\u工具安装。已安装的\u软件
用法:
from windows_tools.installed_software import get_installed_software
for software in get_installed_software():
print(software['name'], software['version'], software['publisher'])
[/编辑]
import winreg
def foo(hive, flag):
aReg = winreg.ConnectRegistry(None, hive)
aKey = winreg.OpenKey(aReg, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",
0, winreg.KEY_READ | flag)
count_subkey = winreg.QueryInfoKey(aKey)[0]
software_list = []
for i in range(count_subkey):
software = {}
try:
asubkey_name = winreg.EnumKey(aKey, i)
asubkey = winreg.OpenKey(aKey, asubkey_name)
software['name'] = winreg.QueryValueEx(asubkey, "DisplayName")[0]
try:
software['version'] = winreg.QueryValueEx(asubkey, "DisplayVersion")[0]
except EnvironmentError:
software['version'] = 'undefined'
try:
software['publisher'] = winreg.QueryValueEx(asubkey, "Publisher")[0]
except EnvironmentError:
software['publisher'] = 'undefined'
software_list.append(software)
except EnvironmentError:
continue
return software_list
software_list = foo(winreg.HKEY_LOCAL_MACHINE, winreg.KEY_WOW64_32KEY) + foo(winreg.HKEY_LOCAL_MACHINE, winreg.KEY_WOW64_64KEY) + foo(winreg.HKEY_CURRENT_USER, 0)
for software in software_list:
print('Name=%s, Version=%s, Publisher=%s' % (software['name'], software['version'], software['publisher']))
print('Number of installed apps: %s' % len(software_list))
稍有改进的版本,无需win32con导入,即可检索软件版本和发布者。感谢Barmak Shemirani的初步回答:) [编辑] 免责声明:本文中的代码已经过时。 我已将该代码作为python包发布。 使用
pip安装windows\u工具安装。已安装的\u软件
用法:
from windows_tools.installed_software import get_installed_software
for software in get_installed_software():
print(software['name'], software['version'], software['publisher'])
[/编辑]
import winreg
def foo(hive, flag):
aReg = winreg.ConnectRegistry(None, hive)
aKey = winreg.OpenKey(aReg, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",
0, winreg.KEY_READ | flag)
count_subkey = winreg.QueryInfoKey(aKey)[0]
software_list = []
for i in range(count_subkey):
software = {}
try:
asubkey_name = winreg.EnumKey(aKey, i)
asubkey = winreg.OpenKey(aKey, asubkey_name)
software['name'] = winreg.QueryValueEx(asubkey, "DisplayName")[0]
try:
software['version'] = winreg.QueryValueEx(asubkey, "DisplayVersion")[0]
except EnvironmentError:
software['version'] = 'undefined'
try:
software['publisher'] = winreg.QueryValueEx(asubkey, "Publisher")[0]
except EnvironmentError:
software['publisher'] = 'undefined'
software_list.append(software)
except EnvironmentError:
continue
return software_list
software_list = foo(winreg.HKEY_LOCAL_MACHINE, winreg.KEY_WOW64_32KEY) + foo(winreg.HKEY_LOCAL_MACHINE, winreg.KEY_WOW64_64KEY) + foo(winreg.HKEY_CURRENT_USER, 0)
for software in software_list:
print('Name=%s, Version=%s, Publisher=%s' % (software['name'], software['version'], software['publisher']))
print('Number of installed apps: %s' % len(software_list))
并非所有应用程序都需要安装,因此未在操作系统中注册,因此无论您采取何种方法,除了扫描整个硬盘以查找EXE文件外,都无法找到所有内容。请确保同时读取
软件\Microsoft\Windows\CurrentVersion\Uninstall
的32位和64位分支。是KEY\u WOW64\u 32KEY
来显式访问32位分支,还是KEY\u WOW64\u 64KEY
来显式访问64位分支。@zett42这些密钥不是包含完全相同的内容吗?不是所有的应用程序都需要安装,所以没有在操作系统中注册,所以无论您采取什么方法,除了扫描整个硬盘以查找EXE文件外,您将无法找到所有内容。请确保同时读取SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
的32位和64位分支。是KEY\u WOW64\u 32KEY
来显式访问32位分支,还是KEY\u WOW64\u 64KEY
来显式访问64位分支。@zett42这些键不是包含完全相同的内容吗?是否有一个选项来查找允许它们运行的所有exe模块?我可以获取安装它们的文件夹的名称,但无法获取exe模块的确切名称…不,无法可靠地做到这一点。您可以检查“DisplayIcon”以查看它是否是exe文件,它可能指向主应用程序。安装程序需要将“InstallLocation”位置放在卸载键中,主exe(如果有)可以位于该文件夹中的任何位置。有些安装程序甚至不遵守规则。是否有一个选项可以找到允许它们运行的所有exe模块?我可以获取安装它们的文件夹的名称,但无法获取exe模块的确切名称…不,无法可靠地做到这一点。您可以检查“DisplayIcon”以查看它是否是exe文件,它可能指向主应用程序。安装程序需要将“InstallLocation”位置放在卸载键中,主exe(如果有)可以位于该文件夹中的任何位置。有些安装人员甚至不遵守规则。谢谢你的回答,我希望有一天我能完成我的项目。谢谢你的回答,我希望有一天我能完成我的项目。