Belirli bir exe / dll dosyasının hangi yükleyici paketine ait olduğu nasıl belirlenir


11

MSI sistemime belirli bir dll veya exe yüklü ne bilmek istiyorum. Yüklü bir pakete aitlerse Windows'un silinen dosyaları düzelttiğini biliyorum. Dosyayı gerçekten silmeden bu bilgileri sorgulayabilir miyim? Bir dosyanın hangi pakete ait olduğunu kontrol etmek için bir araç veya Win32 API var mı?

Yanıtlar:


8

Sonuçta bir yol varmış gibi görünüyor! Kısa bir süre önce, aşağıdaki alt ağaç altında Windows Yükleyiciler tarafından yüklenen dosyalar için kayıt defteri girdilerini keşfettim:

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

Orada saklanan bilgileri kullanarak yükleyici bir dosya aramak için küçük bir Python komut dosyası yazdım:

> 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

Buradan erişilebilir: https://github.com/Zero3/windows-installer-file-search


Vay. 2.5 yıl sonra bu soruyu çivilediniz. Bu alt ağaca baktığımda, şimdi Windows'u başlatmanın neden bu kadar zaman aldığını anlıyorum. "Uygulamanız bozuk, disk takın" özelliğinin bir uygulamanın her yürütülmesinde çalışabilmesi için bellekte dizine eklenmesi gerekir.
wigy

6

Samanlıkta sadece makul iğneler bulmakta sorun yaşıyorsanız, 7- Zip'in bu hızlı ve kirli istismarı işe yarayacaktır:

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

Daha sonra needlelist.txtherhangi bir metin düzenleyicide açın , needlename.dll7-Zip tarafından oluşturulan listelerde ilgili .msi paketini arayın ve bulacaksınız.

(Not: Bu yöntem 'kirli' çünkü sadece hangi .msi paketlerinin adlı bir dosya içerdiğini söyler needlename.dll. Ancak çoğu kullanım durumu için iyi olabilir.)


Gerçekten de, bu 7-Zip'in akıllıca kötüye kullanılmasıdır. Yükleyici her zaman MSI'yı bu C: \ Windows \ Installer klasörüne kopyalar mı yoksa sadece atlatılabilecek bir kural mıdır? Ben hala başka bir yolu (ve cevabınızı kabul) kabul etmeden önce zarif bir Win32 API bekliyorum.
wigy

AFAIK Windows Installer, yüklü MSI'leri her zaman klasörde önbelleğe alır (ayrıca bkz. Superuser.com/questions/473569/… ). Bunun nedeni mantıklı: Yükleyici aynı zamanda kaldırıcıdır. Bu nedenle Windows, kullanıcı uygulamayı kaldırmak istediğinde yürütmek için kaldırıcının bilinen bir konumda bir kopyasına ihtiyaç duyar. Orijinal MSI muhtemelen bu noktada yıllar önce silindiğinden, Windows yükleme sırasında bir kopyasını kaydeder.
Zero3

Bir API ile ilgili olarak: Çoğu Linux dağıtımından (ve benzerlerinden) farklı olarak, Windows'da (en azından Windows 8'den önce), işletim sistemine yerleşik, böyle bir şeyi sorgulayabilen uygun bir paket yönetim sistemi yoktur. Muhtemelen, yüklü tüm MSI'leri çalıştırarak bunu yapmak için bir uygulama oluşturabilir ve hedef dosyayı (esas olarak cevabım düzgün bir şekilde uygulanmış) arayabilir, ancak bu kutudan çıkmış gibi görünmüyor. Tabii ki yanlış olabilirim.
Zero3

Bunu bir cevap olarak kabul ediyorum. Bunun için herhangi bir Win32 API olduğunu kanıtlayamamamıza rağmen, hissim MSI'nin bir şekilde uygun bir genel API olmadan süreç yüklemeye bağlanmış olmasıydı.
wigy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.