Làm thế nào để tìm ra gói trình cài đặt mà exe / dll đã cho thuộc về


11

Tôi muốn biết MSI đã cài đặt một dll hoặc exe nào đó trên hệ thống của tôi. Tôi biết rằng Windows sửa các tệp đã bị xóa nếu chúng thuộc về gói đã cài đặt. Tôi có thể truy vấn thông tin đó mà không thực sự xóa tệp không? Có một công cụ hoặc API Win32 để kiểm tra xem tập tin thuộc về gói nào không?

Câu trả lời:


7

Dường như có thể có một cách sau tất cả! Gần đây tôi đã phát hiện ra các mục đăng ký cho các tệp được cài đặt bởi Windows Installers theo các cây con sau:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData

Tôi đã viết một tập lệnh Python nhỏ để tra cứu trình cài đặt cho một tệp bằng cách sử dụng thông tin được lưu trữ ở đó:

> python windows-installer-file-search.py opus.dll
File: C:\Program Files (x86)\Mumble\opus.dll
Product: Mumble 1.2.13
Install user: S-1-5-18
Cached installer: C:\Windows\Installer\2f6b072.msi

Nó có sẵn ở đây: https://github.com/Zero3/windows-installer-file-search


Ồ 2,5 năm sau bạn đóng đinh câu hỏi này. Nhìn vào cây con đó, bây giờ tôi hiểu tại sao phải mất quá nhiều thời gian để khởi động Windows. Điều này phải được lập chỉ mục trong bộ nhớ cho tính năng "ứng dụng của bạn bị hỏng, chèn đĩa" để hoạt động trên mỗi lần thực thi ứng dụng.
tóc giả

6

Nếu bạn ổn với việc chỉ cần tìm kim tiêm hợp lý trong đống cỏ khô, việc lạm dụng 7-Zip nhanh chóng và bẩn thỉu này sẽ có hiệu quả:

7z.exe l -an -air!C:\Windows\Installer\*.msi > needlelist.txt

Sau đó mở needlelist.txttrong bất kỳ trình soạn thảo văn bản nào, tìm kiếm needlename.dllvà bạn sẽ tìm thấy gói .msi tương ứng trong danh sách được tạo bởi 7-Zip.

(Lưu ý: Phương pháp này là 'bẩn' vì nó chỉ cho bạn biết gói .msi nào chứa tệp có tên needlename.dll. Nhưng có lẽ nó tốt cho hầu hết các trường hợp sử dụng.)


Thật vậy, đây là một sự lạm dụng thông minh của 7-Zip. Trình cài đặt luôn sao chép MSI vào thư mục C: \ Windows \ Installer hay đó chỉ là một quy ước có thể bị phá vỡ? Tôi vẫn đang chờ đợi một API Win32 thanh lịch trước khi chấp nhận thực tế là không có cách nào khác (và chấp nhận câu trả lời của bạn).
tóc giả

AFAIK Windows Installer luôn lưu trữ MSI đã cài đặt trong thư mục (cũng xem superuser.com/questions/473569/ mẹo ). Lý do cho điều này là hợp lý: Trình cài đặt cũng là trình gỡ cài đặt. Do đó, Windows cần một bản sao của trình gỡ cài đặt ở một vị trí đã biết để thực thi nó khi người dùng muốn gỡ cài đặt ứng dụng. Vì MSI ban đầu có thể đã bị xóa từ lâu tại thời điểm này, Windows lưu một bản sao trong khi cài đặt.
Zero3

Về API: Không giống như hầu hết các bản phân phối Linux (và tương tự), Windows (ít nhất là trước Windows 8) không có hệ thống quản lý gói phù hợp được tích hợp trong hệ điều hành, có khả năng truy vấn những thứ như thế này. Người ta có thể có thể tạo một ứng dụng để thực hiện điều này bằng cách chạy qua tất cả các MSI đã cài đặt và tìm kiếm bên trong chúng để tìm tệp mục tiêu (về cơ bản là câu trả lời của tôi được triển khai đúng cách), nhưng điều này dường như không được triển khai bên ngoài. Tôi có thể sai, tất nhiên.
Zero3

Vâng, tôi chấp nhận nó như một câu trả lời. Mặc dù chúng tôi không thể chứng minh rằng không có API Win32 cho việc này, nhưng cảm giác của tôi là MSI bằng cách nào đó đã tham gia vào quá trình tải mà không có API công khai thích hợp.
tóc giả
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.