2009-04-29 82 views
6

Khi tôi nói "ứng dụng đã cài đặt", về cơ bản tôi có nghĩa là mọi ứng dụng có thể nhìn thấy trong [Bảng điều khiển] -> [Thêm/loại bỏ chương trình].Làm cách nào để liệt kê/liệt kê tất cả các ứng dụng đã cài đặt trong Windows XP?

Tôi muốn làm điều đó bằng Python, nhưng C hoặc C++ cũng tốt.

+0

Làm thế nào để bạn xác định "ứng dụng đã cài đặt"? –

+0

Làm rõ thêm – sharkin

Trả lời

10

Nếu bạn có nghĩa là danh sách các ứng dụng cài đặt được hiển thị trong Add \ Remove Programs trong Control Panel, bạn có thể tìm thấy nó trong các khóa registry:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall 

more info about how the registry tree is structured can be found here.

Bạn cần sử dụng winreg API trong python để đọc các giá trị từ sổ đăng ký.

+0

Dang. Bạn đánh bại tôi vào nó. –

+0

Phím THAT trống trên hệ thống của tôi. Kiểm tra hệ điều hành lsiting ở dưới cùng của liên kết của bạn và bạn sẽ thấy nó không phải cho WinXP. – sharkin

+0

@ R.A, khóa đăng ký này chứa rất nhiều khóa phụ (thư mục phụ). Mỗi đại diện cho một chương trình trong danh sách gỡ cài đặt. Vui lòng đọc về cấu trúc của khóa đó trong liên kết được đề cập. – Aziz

10

Kiểm tra lớp học Win32_Product WMI (Windows Management Instrumentation). Here's a tutorial về cách sử dụng WMI bằng Python.

+0

Tôi làm điều này lần thứ hai. Làm quen với WMI sẽ giúp bạn với các nhiệm vụ liên quan đến quản trị windows khác. Gần đây tôi đã viết một mẫu cho cách sử dụng WMI từ C++. http://blog.emptycrate.com/node/376 ​​ – lefticus

+4

Có một số cảnh báo. WMI có thể bị vô hiệu hóa trên một số máy tính cá nhân. Ngoài ra, nó không liệt kê tất cả các ứng dụng hiển thị trong applet của Control Panel - chỉ những ứng dụng được cài đặt bởi trình cài đặt tương thích. – atzz

8

Bảng điều khiển sử dụng Win32 COM api, là phương thức chính thức (xem Google Groups, Win32)
Không bao giờ dựa vào đăng ký.

+0

+1 cho "không bao giờ dựa vào sổ đăng ký" – Rob

+2

Nhiều năm trễ, nhưng -1 cho không nói * mà * COM API đã được sử dụng. Một nhóm usenet lớn; nói "đi Google nó" trong một câu trả lời là không đủ tốt. – andlabs

6

Microsoft Script Repositoryscript for listing all installed software.

import win32com.client 
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 "Caption: ", objItem.Caption 
    print "Description: ", objItem.Description 
    print "Identifying Number: ", objItem.IdentifyingNumber 
    print "Install Date: ", objItem.InstallDate 
    print "Install Date 2: ", objItem.InstallDate2 
    print "Install Location: ", objItem.InstallLocation 
    print "Install State: ", objItem.InstallState 
    print "Name: ", objItem.Name 
    print "Package Cache: ", objItem.PackageCache 
    print "SKU Number: ", objItem.SKUNumber 
    print "Vendor: ", objItem.Vendor 
    print "Version: ", objItem.Version 
3

mã C# .net để nhận được danh sách các phần mềm được cài đặt bằng WMI trong xp và win7 (WMI là cách duy nhất trong win7)

WqlObjectQuery wqlQuery = 
     new WqlObjectQuery("SELECT * FROM Win32_Product"); 
     ManagementObjectSearcher searcher = 
      new ManagementObjectSearcher(wqlQuery); 

     foreach (ManagementObject software in searcher.Get()) { 
      Console.WriteLine(software["Caption"]); 
     } 
4

Việc thực hiện dựa trên đăng ký tốt nhất mà tôi đã thấy là bài viết được viết bởi Chris Wright (chris128) được đăng tại http://www.vbforums.com/showthread.php?t=598355. Nó sử dụng nhiều khóa đăng ký và phức tạp hơn nhiều so với bất kỳ câu trả lời nào hiện được đăng tại đây. Có vẻ như để tạo ra kết quả giống hệt với ứng dụng Add/Remove Programs và giống như ứng dụng ARP, nó cũng cung cấp tùy chọn để bao gồm các bản cập nhật.

Mặc dù nó được thực hiện trong VB.NET, nó sẽ dễ dàng chuyển đổi sang các ngôn ngữ .NET khác như C# hoặc IronPython. Tôi tưởng tượng rằng chuyển đổi sang IronPython đầu tiên sẽ làm cho nó khá dễ dàng để cổng để Python thường xuyên nếu đó là những gì bạn muốn, nhưng tôi chỉ chuyển đổi nó để C# bản thân mình và sau đó làm sạch các mã một chút.

Chỉ một lỗi nhỏ để chỉ ra: GetUserInstallerKeyPrograms() không thêm phiên bản cho chương trình người dùng vào danh sách, mặc dù nó trích xuất nó. Điều này là dễ dàng để sửa chữa mặc dù.

+0

Cảm ơn, điều này hữu ích nhất. –

Các vấn đề liên quan