Yüklü bir MSI kurulumunun ürün GUID'sini nasıl bulabilirim?

Yama**, **kaldırma** ([**nasıl kaldırılır**][1]) gibi bakım işlemlerini gerçekleştirmek ve ayrıca **denetim amacıyla yüklü bir MSI dosyası için ürün GUID`sini** bulmam gerekiyor.

Çözüm

yükseltme kodu alımı için: https://stackoverflow.com/questions/46637094/how-can-i-find-the-upgrade-code-for-an-installed-msi-file/46637095#46637095

Kısa Versiyon

Aşağıdaki bilgiler zaman içinde önemli ölçüde artmıştır ve biraz fazla ayrıntılı hale gelmiş olabilir. **Ürün kodları nasıl hızlı bir şekilde elde edilir?

  1. Powershell "one-liner"`ı kullanın

    Ekran görüntüsü ve adım adım ilerlemek için aşağı kaydırın. Feragatname de aşağıda - kime sorduğunuza bağlı olarak küçük veya orta riskler. Benim için iyi çalışıyor. Bu seçenek tarafından tetiklenen herhangi bir kendi kendini onarma genellikle iptal edilebilmelidir. Yine de tetiklenen paket bütünlüğü kontrolleri bazı olay günlüğü "gürültü" ekliyor. Not! IdentifyingNumber**is** theProductCode` (WMI özelliği).

get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize

Powershell'i hızlı başlatma: Windows tuşunu basılı tutun, R öğesine dokunun, "powershell" yazın ve Enter tuşuna basın; 2. VBScript Kullan

Aşağıda "Alternatif Araçlar" (bölüm 3) altında açıklanmıştır. Bu seçenek, aşağıda ayrıntılı olarak açıklanan nedenlerden dolayı Powershell'den daha güvenli olabilir. Özünde (çok) daha hızlıdır ve WMI üzerinden gitmediği için MSI kendi kendini onarmayı tetikleyemez (doğrudan MSI COM API'e erişir - çok hızlı bir şekilde). Bununla birlikte, Powershell seçeneğinden daha karmaşıktır (birkaç satır kod). 3. Kayıt Defteri Arama

Bazıları kayıt defterinde bir şeyler aramaya yemin ediyor. Benim önerdiğim yaklaşım bu değil - ben uygun API'leri (ya da başka bir deyişle işletim sistemi işlev çağrılarını) kullanmayı seviyorum. Her zaman sadece API uygulamasının iç kısımları tarafından açıklanan garip istisnalar vardır:

  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
  • HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall
  • HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall
  1. Orijinal MSI Dosyası / WiX Kaynağı

    Herhangi bir MSI dosyasının Özellik tablosu içinde Ürün Kodu nu bulabilirsiniz (ve başka herhangi bir özelliği de). Ancak, GUID muhtemelen (nadiren) yükleme sırasında uygulanan bir dönüşüm tarafından geçersiz kılınabilir ve bu nedenle ürünün kayıtlı olduğu GUID ile eşleşmeyebilir (yukarıdaki 1. ve 2. yaklaşım, bu tür nadir senaryolarda Windows'ta kayıtlı olan gerçek ürün kodunu bildirecektir). MSI dosyalarını görüntülemek için bir araca ihtiyacınız vardır. İndirebileceğiniz ücretsiz araçların bir listesi için aşağıdaki yanıtın en altına bakın (veya aşağıdaki hızlı seçeneğe bakın): https://stackoverflow.com/questions/48482545/how-can-i-compare-the-content-of-two-or-more-msi-files/48482546#48482546 GÜNCELLEME: Kolaylık ve hız ihtiyacı için :-), SuperOrca'yı bu doğrudan indirme bağlantısından gecikmeden ve telaşlanmadan indirin - araç işi halletmek için yeterince iyidir - kurun, MSI'ı açın ve doğrudan Özellik tablosu'e gidin ve `ProductCode' satırını bulun (lütfen her zaman doğrudan indirilen bir bağlantıyı virüs kontrol edin - tabii ki - [virustotal]'ı kullanabilirsiniz.com]6 adresini kullanabilirsiniz - yüklediklerinizi taramak için düzinelerce anti-virüs ve kötü amaçlı yazılım paketini kullanan çevrimiçi tarama).

    Orca Microsoft'un kendi aracıdır, Visual Studio ile birlikte yüklenir ve Windows SDK. altında Orca-x86_en-us.msi dosyasını aramayı deneyin. Program Files (x86) ve bulunursa MSI'yı yükleyin.

    Ve aşağıda, "organik olarak büyüyen " orijinal cevabı bulacaksınız; çok fazla ayrıntıya. Yapmanız gereken görev buysa aşağıdaki "MSI Paketlerini Kaldır" bölümüne bakabilirsiniz.

    Ürün Kodlarını Al

    GÜNCELLEME: Ayrıca yükseltme koduna ihtiyacınız varsa, bu yanıtı kontrol edin: https://stackoverflow.com/questions/46637094/how-can-i-find-the-upgrade-code-for-an-installed-msi-file/46637095#46637095 (ilişkili ürün kodlarını, yükseltme kodlarını & ürün adlarını bir tablo çıktısı - aşağıdakine benzer).

    • PowerShell kullanamıyor musunuz? Aşağıdaki "Alternatif Araçlar" bölümüne bakın.
    • Kaldırmak mı istiyorsunuz? Aşağıdaki "MSI paketlerini kaldır" bölümüne bakın. PowerShell'i çalıştırın (Windows tuşunu basılı tutun, R'ye dokunun, Windows tuşunu bırakın, "powershell" yazın ve Tamam'a basın) ve yüklü MSI paketlerinin listesini almak için aşağıdaki komutu çalıştırın ürün kodları ile birlikte yerel önbellek paketi yolu ve ürün adı** (isimlerin kesilmesini önlemek için PowerShell penceresini büyütün). Bu komut satırını çalıştırmadan önce, lütfen aşağıdaki feragatnameyi okuyun (tehlikeli bir şey yok, sadece bazı potansiyel sıkıntılar). Bölüm 3'te "Alternatif Araçlar" başlığı altında VBScript kullanarak aynı bilgileri almanın WMI dışı alternatif bir yolu gösterilmektedir. Eğer bir paketi kaldırmaya çalışıyorsanız, aşağıda bazı örnek msiexec.exe komut satırlarını içeren bir bölüm bulunmaktadır:
get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize

Çıktı** buna benzer olmalıdır: *Not: Bazı garip nedenlerden dolayı "ProductCode" WMI'da "IdentifyingNumber" olarak adlandırılır. Yani başka bir deyişle - yukarıdaki resimde IdentifyingNumber ÜrünKodudur. Bu sorguyu çok sayıda uzak bilgisayara karşı uzaktan çalıştırmanız* gerekiyorsa, aşağıdaki "Uzak Bir Bilgisayardan Ürün Kodlarını Almak*" bölümüne bakın.

DİSCLAIMER (önemli, lütfen komutu çalıştırmadan önce okuyun!): Garip Microsoft tasarımı nedeniyle, Win32_Product komutuna yapılan herhangi bir WMI çağrısı (aşağıdaki PowerShell komutu gibi) bir doğrulama işlemini tetikleyecektir. paket emlak. Oldukça yavaş* olmasının yanı sıra, bu nadir durumlarda bir MSI kendi kendini onarmasını tetikler. Bu küçük bir paket veya başka bir şey olabilir büyük - Visual Studio gibi. Çoğu durumda bu gerçekleşmez - ancak bir risk var. Bu komutu önemli bir işlemden hemen önce çalıştırmayın toplantı - hiçbir zaman tehlikeli değildir (salt okunurdur), ancak çok nadir durumlarda uzun bir onarıma yol açar* (Sanırım kendi kendini onarır - söz konusu paket tarafından aktif olarak engellenmediği sürece, ancak Win32_Product'u çağırırsanız yeniden başlayacaktır tekrar ve bu, kendi kendini onarmanın bitmesine izin verene kadar devam edecektir - bazen bitmesine izin verseniz bile devam edebilir: https://stackoverflow.com/questions/5501028/how-can-i-determine-what-causes-repeated-windows-installer-self-repair/6066263#6066263).

Ve sadece kayıt için: Bazı kişiler olay günlüklerinin MsiInstaller EventID 1035 girdileri ile dolduğunu bildiriyor (kod şefinin yanıtına bakın) - görünüşe göre Win32_Product sınıfına yapılan WMI sorgularından kaynaklanıyor (şahsen ben bunu hiç görmedim). Bu, yukarıda önerilen Powershell komutuyla doğrudan ilgili değildir, Win32_Product WIM sınıfının genel kullanımı bağlamındadır. Çıktıyı liste biçiminde de alabilirsiniz (tablo yerine):

get-wmiobject -class Win32_Product

Bu durumda çıktı şuna benzer:

Ürün Kodlarını Uzaktaki Bir Bilgisayardan Alma

Teorik olarak, komutun kendisinin bir parçası olarak uzak bilgisayar adını belirtebilmeniz gerekir. İşte yukarıdaki komutun aynısı "RemoteMachine" (-ComputerName RemoteMachine bölümü eklendi) makinesinde çalışacak şekilde ayarlandı:

get-wmiobject Win32_Product -ComputerName RemoteMachine | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize

Uygun bir etki alanında etki alanı yöneticisi haklarıyla çalışıyorsanız bu işe yarayabilir. Bir çalışma grubu ortamında (küçük ofis / ev ağı), çalışmasını sağlamak için muhtemelen kullanıcı kimlik bilgilerini doğrudan WMI çağrılarına eklemeniz gerekir. Ek olarak, WMI'daki uzak bağlantılar (en azından) Windows Güvenlik Duvarı, DCOM ayarları ve Kullanıcı Hesabı Denetimi (UAC) (artı Microsoft dışı ek faktörler - örneğin gerçek güvenlik duvarları, üçüncü taraf yazılım güvenlik duvarları, çeşitli türlerde güvenlik yazılımları, vb...) tarafından etkilenir. Çalışıp çalışmayacağı tam kurulumunuza bağlıdır.

  • Uzak WMI Bağlantısı Kurma
  • PowerShell ile WMI'a Uzaktan Bağlanma GÜNCELLEME: Uzaktan WMI çalıştırma ile ilgili kapsamlı bir bölüm şu yanıtta bulunabilir: https://stackoverflow.com/questions/46637094/how-can-i-find-the-upgrade-code-for-an-installed-msi-file/46637095#46637095. Görünüşe göre bir güvenlik duvarı kuralı ve UAC isteminin bir kayıt defteri ayarlamasıyla bastırılması, işlerin bir çalışma grubu ağ ortamında çalışmasını sağlayabilir. Güvenlik açısından önerilen değişiklikler değil, ancak benim için işe yaradı.

    Alternatif Araçlar

    PowerShell, .NET çerçevesinin yüklenmesini gerektirir (şu anda 3.5.1 sürümünde görünüyor? Ekim, 2017). .NET yüklü olsa bile gerçek PowerShell uygulamasının kendisi de makinede eksik olabilir. Son olarak, PowerShell'in çeşitli sistem ilkeleri ve ayrıcalıkları tarafından devre dışı bırakılabileceğine veya kilitlenebileceğine inanıyorum. Durum buysa, ürün kodlarını almak için birkaç başka yol deneyebilirsiniz. Benim tercih ettiğim alternatif VBScript - hızlı ve esnektir (ancak belirli makinelerde kilitlenebilir ve komut dosyası yazmak her zaman araç kullanmaktan biraz daha karmaşıktır).

  1. Windows'ta yerleşik bir WMI aracı** ile başlayalım: wbemtest.exe.
  • Wbemtest.exeyi başlatın (*Windows tuşunu basılı tutun, R tuşuna dokunun, Windows tuşunu bırakın, "wbemtest.exe" yazın ve Tamama basın*).
  • Bağlan ve ardından Tamam (ad alanı varsayılan olarak root\cimv2'dir) öğelerine tıklayın ve tekrar "bağlan**" öğesine tıklayın.
  • Sorgu" öğesine tıklayın ve bu WQL komutunu** (SQL aroması) yazın: SELECT IdentifyingNumber,Name,Version FROM Win32_Product ve "Use" (veya eşdeğeri - araç yerelleştirilecektir) seçeneğine tıklayın.
  • Örnek çıktı ekran görüntüsü (kesilmiş). En iyi biçimlendirme değil, ancak ihtiyacınız olan verileri alabilirsiniz. IdentifyingNumber MSI ürün kodudur:
  1. Ardından, WMIExplorer.exe gibi özel, daha tam özellikli bir WMI aracını deneyebilirsiniz
  • Bu, Windows'a dahil değildir. Ancak çok iyi bir araçtır. Tavsiye edilir.
  • Şu adrese göz atın: https://github.com/vinaypamnani/wmie2/releases
  • Aracı başlatın, Bağlan'a tıklayın, ROOT\CIMV2'ye çift tıklayın
  • Sorgu sekmesinden**" aşağıdaki sorguyu yazın SELECT IdentifyingNumber,Name,Version FROM Win32_Product ve Çalıştır'a basın.
  • Ekran görüntüsü atlandı, uygulama çok fazla ekran alanı gerektiriyor.
  1. Son olarak, MSI otomasyon arayüzü (Windows'un temel özelliği - WMI ile ilgisi yoktur) aracılığıyla bilgilere erişmek için bir VBScript deneyebilirsiniz.
  • Aşağıdaki betiği kopyalayın ve masaüstünüzdeki bir *.vbs dosyasına yapıştırın ve çift tıklayarak çalıştırmayı deneyin. Masaüstünüz sizin için yazılabilir olmalıdır veya yazılabilir başka bir konum kullanabilirsiniz.
  • Bu harika bir VBScript değildir. Hata işleme ve bütünlük yerine Terslik tercih edilmiştir, ancak işi minimum karmaşıklıkla yapmalıdır.
  • Çıktı dosyası, betiği çalıştırdığınız klasörde oluşturulur (klasör yazılabilir olmalıdır). Çıktı dosyası msiinfo.csv olarak adlandırılır.
  • Bir elektronik tablo uygulamasında açmak için dosyaya çift tıklayın, içe aktarırken sınırlayıcı olarak virgül seçin - VEYA - dosyayı Not Defteri'nde veya herhangi bir metin görüntüleyicide açın.
  • Bir elektronik tabloda açmak gelişmiş sıralama özelliklerine izin verecektir.
  • Bu betik, MSI kurulumu hakkında önemli miktarda daha fazla ayrıntı gösterecek şekilde kolayca uyarlanabilir. Bunun bir gösterimini burada bulabilirsiniz: https://stackoverflow.com/questions/28963089/how-to-find-out-which-products-are-installed-newer-product-are-already-install/28971679#28971679.
' Retrieve all ProductCodes (with ProductName and ProductVersion)
Set fso = CreateObject("Scripting.FileSystemObject")
Set output = fso.CreateTextFile("msiinfo.csv", True, True)
Set installer = CreateObject("WindowsInstaller.Installer")

On Error Resume Next ' we ignore all errors

For Each product In installer.ProductsEx("", "", 7)
   productcode = product.ProductCode
   name = product.InstallProperty("ProductName")
   version=product.InstallProperty("VersionString")
   output.writeline (productcode & ", " & name & ", " & version)
Next

output.Close

Şu anda ürün kodlarını almak için başka genel amaçlı seçenekler düşünemiyorum, lütfen biliyorsanız ekleyin. Çok fazla yorum eklemek yerine Sadece satır içi düzenleyin lütfen.

Bu bilgilere kesinlikle uygulamanızın içinden erişebilirsiniz MSI otomasyon arayüzü (COM tabanlı) VEYA C++ MSI yükleyici işlevleri (Win32 API). Ya da PowerShell, wbemtest.exe veya WMIExplorer.exe kullanarak yukarıdaki örneklerde yaptığınız gibi uygulamanızın içinden WMI sorgularını kullanın.

MSI Paketlerini Kaldırma

Yapmak istediğiniz şey ürün kodunu bulduğunuz MSI paketini kaldırmaksa, bunu bir yükseltilmiş komut istemi kullanarak aşağıdaki şekilde yapabilirsiniz (cmd.exe dosyasını arayın, sağ tıklayın ve yönetici olarak çalıştırın): Seçenek 1: **Günlük kaydı olmadan temel, etkileşimli kaldırma (hızlı ve kolay):

msiexec.exe /x {00000000-0000-0000-0000-00000000000C}

Hızlı Parametre Açıklaması:

/X = run uninstall sequence
{00000000-0000-0000-0000-00000000000C} = product code for product to uninstall

Ayrıca isterseniz (verbose) günlük kaydını etkinleştirebilir ve sessiz modda çalıştırabilirsiniz, bu da bizi 2. seçeneğe götürür: Seçenek 2: Verbose günlük kaydı ile sessiz kaldırma (toplu iş dosyaları için daha iyi):

msiexec.exe /x {00000000-0000-0000-0000-00000000000C} /QN /L*V "C:\My.log" REBOOT=ReallySuppress

Hızlı Parametre Açıklaması:

/X = run uninstall sequence
{00000000-0000-0000-0000-00000000000C} = product code for product to uninstall
/QN = run completely silently
/L*V "C:\My.log"= verbose logging at specified path
REBOOT=ReallySuppress = avoid unexpected, sudden reboot

Burada MSI kaldırma için kapsamlı bir referans bulunmaktadır (MSI paketlerini kaldırmanın çeşitli farklı yolları): https://stackoverflow.com/questions/450027/uninstalling-an-msi-file-from-the-command-line-without-using-msiexec/1055933#1055933. Kaldırmak için çok sayıda farklı yol vardır. Bir toplu iş dosyası yazıyorsanız, birkaç yaygın ve standart kaldırma komut satırı varyantı için lütfen yukarıda bağlantısı verilen yanıttaki 3. bölüme bir göz atın. Ve [msiexec.exe (komut satırı seçenekleri)]15 (MSDN'den msiexec.exe için komut satırına genel bakış) için hızlı bir bağlantı. Ve [Technet sürümü**]16 de.

Diğer MSI Özelliklerinin / Bilgilerinin Alınması (örn. Yükseltme Kodu)

UPDATE: MSI dosyalarında kodu elle aramak yerine lütfen yüklü paketler için yükseltme kodunun nasıl bulunacağına ilişkin yeni bir yanıt bulun. İçin yüklü paketler bu çok daha güvenilirdir. Eğer paket yüklüyse, yine de MSI dosyasına (veya kaynak dosyaya) bakmanız gerekir yükseltme kodunu bulmak için MSI'ı derlemek için kullanılır). Aşağıdaki eski bölümde bırakılıyor: Eğer UpgradeCode veya diğer MSI özelliklerini almak istiyorsanız, yukarıda gösterilen resimde "LocalPackage" ile belirtilen konumdan ürün için önbelleğe alınmış kurulum MSI'ını açabilirsiniz (şöyle bir şey: C:\WINDOWS\Installer\50c080ae.msi - her sistemde benzersiz olan bir hex dosya adıdır). Ardından UpgradeCode için "Property table" içine bakarsınız (UpgradeCode'un bir dönüşümde yeniden tanımlanması mümkündür - doğru değeri aldığınızdan emin olmak için kodu sistemden programatik olarak almanız gerekir - bunun için kısa süre içinde bir komut dosyası sağlayacağım. Ancak, önbelleğe alınan MSI'da bulunan UpgradeCode genellikle doğrudur). Önbelleğe alınmış MSI dosyalarını açmak için Orca veya başka bir paketleme aracı kullanın. Burada farklı araçlarla ilgili bir tartışma bulunmaktadır (herhangi biri işinizi görecektir): https://stackoverflow.com/questions/1544292/what-installation-product-to-use-installshield-wix-wise-advanced-installer/1546941#1546941. Eğer böyle bir araç yüklü değilse, en hızlı seçeneğiniz Super Orca'ü denemek olabilir (kullanımı basittir, ancak benim tarafımdan kapsamlı bir şekilde test edilmemiştir). UPDATE: MSI dosyalarını görüntülemek için kullanabileceğiniz çeşitli ücretsiz ürünler hakkında bilgi içeren yeni bir yanıt: https://stackoverflow.com/questions/48482545/how-can-i-compare-the-content-of-two-or-more-msi-files/48482546#48482546 Visual Studio yüklüyse, Program Files (x86) altında Orca-x86_en-us.msi dosyasını aramayı deneyin ve yükleyin (bu Microsoft'un kendi resmi MSI görüntüleyicisi ve düzenleyicisidir). Ardından başlat menüsünde Orca'yı bulun. Zaman kaybetmeyin :-). Teknik olarak Orca, Windows SDK'nın (Visual Studio'nun değil) bir parçası olarak yüklenir, ancak Windows SDK, Visual Studio yüklemesiyle birlikte gelir. Eğer Visual Studio yüklü değilse, belki de yüklü olan birini tanıyorsunuzdur? Sadece bu MSI'ı aramalarını ve size göndermelerini isteyin (yarım mb'lık küçük bir dosya) - saniyeler sürer. GÜNCELLEME: MSI'ın yanı sıra birkaç CAB dosyasına da ihtiyacınız var - bunlar MSI'ın bulunduğu klasörde bulunur. Eğer yoksa, her zaman Windows SDK indirebilirsiniz (ücretsizdir, ancak büyüktür - ve yüklediğiniz her şey bilgisayarınızı yavaşlatacaktır). SDK'nın hangi bölümünün Orca MSI'ı yüklediğinden emin değilim. Eğer biliyorsanız, lütfen düzenleyin ve ayrıntıları buraya ekleyin.

Yorumlar (6)

Aradığınızı kolayca bulamayacağınız kadar çok yükleyiciniz varsa, burada bir filtre sağlamak ve görünen ada göre biraz daraltmak için bazı powershell'ler var.

$filter = "*core*sdk*"; (Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall).Name | % { $path = "Registry::$_"; Get-ItemProperty $path } | Where-Object { $_.DisplayName -like $filter } | Select-Object -Property DisplayName, PsChildName
Yorumlar (0)