Cara mengetahui paket installer mana yang dimiliki exe / dll

11

Saya ingin tahu apa yang menginstal MSI dll atau exe yang diberikan pada sistem saya. Saya tahu bahwa Windows memperbaiki file yang dihapus jika itu milik paket yang diinstal. Bisakah saya meminta informasi itu tanpa benar-benar menghapus file? Apakah ada alat atau API Win32 untuk memeriksa paket apa yang dimiliki file?

berbulu
sumber

Jawaban:

7

Sepertinya mungkin ada cara! Saya baru-baru ini menemukan entri registri untuk file yang diinstal oleh Pemasang Windows di bawah subtree berikut:

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

Saya menulis skrip Python kecil untuk mencari pemasang file dengan menggunakan informasi yang tersimpan di sana:

> 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

Ini tersedia di sini: https://github.com/Zero3/windows-installer-file-search

Zero3
sumber
Wow. 2,5 tahun kemudian Anda menjawab pertanyaan ini. Melihat subtree itu, sekarang saya mengerti mengapa perlu banyak waktu untuk mem-boot Windows. Ini harus diindeks dalam memori untuk fitur "aplikasi Anda rusak, masukkan disk" untuk bekerja pada setiap eksekusi aplikasi.
Wigy
6

Jika Anda baik-baik saja dengan hanya menemukan jarum yang masuk akal di tumpukan jerami, penyalahgunaan 7-Zip yang cepat dan kotor ini akan berhasil:

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

Kemudian buka needlelist.txtdi sembarang editor teks, cari needlename.dlldan Anda akan menemukan paket .msi yang sesuai dalam daftar yang dihasilkan oleh 7-Zip.

(Catatan: Metode ini 'kotor' karena hanya memberi tahu Anda paket .msi mana yang berisi file bernama needlename.dll. Tetapi mungkin tidak masalah untuk sebagian besar kasus penggunaan.)

Zero3
sumber
Memang, ini adalah penyalahgunaan 7-Zip yang cerdas. Apakah penginstal selalu menyalin MSI ke folder C: \ Windows \ Installer atau hanya konvensi yang mungkin dielakkan? Saya masih menunggu Win32 API yang elegan sebelum menerima kenyataan bahwa tidak ada cara lain (dan menerima jawaban Anda).
Berang,
Penginstal AFAIK Windows selalu menyimpan cache MSI yang terinstal di folder (juga lihat superuser.com/questions/473569/… ). Alasannya logis: Penginstal juga uninstaller. Windows dengan demikian memerlukan salinan uninstaller di lokasi yang diketahui untuk menjalankannya ketika pengguna ingin menghapus instalasi aplikasi. Karena MSI asli mungkin telah dihapus berabad-abad lalu pada saat ini, Windows menyimpan salinan selama instalasi.
Zero3
Mengenai API: Tidak seperti kebanyakan distro Linux (dan sejenisnya), Windows (sebelum Windows 8, setidaknya) tidak memiliki sistem manajemen paket yang tepat yang dibangun ke dalam sistem operasi, yang mampu menanyakan hal-hal seperti ini. Seseorang mungkin dapat membuat aplikasi untuk melakukan ini dengan menjalankan semua MSI yang terinstal dan mencari di dalamnya untuk file target (pada dasarnya jawaban saya diimplementasikan dengan benar), tetapi ini tampaknya tidak diimplementasikan di luar kotak. Saya mungkin salah, tentu saja.
Zero3
Yah, saya menerimanya sebagai jawaban. Meskipun kami tidak dapat membuktikan tidak ada Win32 API untuk ini, perasaan saya adalah bahwa MSI entah bagaimana terhubung ke proses pemuatan tanpa API publik yang tepat.
Wigy