MSIファイル内のプロパティをプログラムで読み取る方法
-
08-07-2019 - |
質問
msiファイル内のプロパティを読み取る方法はありますか
たとえば、msiファイル名Testpackage.msiが指定されている
見つける必要があります
productName
PackageCode
version
これは、WMIのアンインストールで使用します
string objPath = string.Format("Win32_Product.IdentifyingNumber='{0}',Name='{1}',Version='{2}'", "{AC9C1263-2BA8-4863-BE18-01232375CE42}", "testproduct", "10.0.0.0");
更新: Orcaを使用することは素晴らしいオプションです。これをプログラムで実現できる場合、これを使用して自動リリースノートを生成できます。また、アンインストールプログラムでも同様です。
解決
COMベースのAPIを使用して作業できますMSIで、次のような操作を行います
Function GetVersion(ByVal msiName)
Const msiOpenDatabaseModeReadOnly = 0
Dim msi, db, view
Set msi = CreateObject("WindowsInstaller.Installer")
Set db = msi.OpenDataBase(msiName, msiOpenDatabaseModeReadOnly)
Set view = db.OpenView("SELECT `Value` FROM `Property` WHERE `Property` = 'ProductVersion'")
Call view.Execute()
GetVersion = view.Fetch().StringData(1)
End Function
他のヒント
MicrosoftのOrca.exe を使用できます。 Orcaを使用すると、MSIを開き、その中のすべてのテーブルを編集/表示できます。 Windows SDK 全体をダウンロードする必要があります入手するために注文しますが、ありがたいことに無料です。
1つの代替手段(SDKのダウンロードサイズにより高速になる可能性があります)は、 WiXのdark.exeを使用することですプロジェクト。 DarkはMSIデコンパイラーであり、すべてをXMLファイルとリソースのコレクションにエクスポートします。出力するXMLには、探している情報が含まれています。
ただ今、物事がさらに簡単になったことに言及したいと思います。 Windows Installerオブジェクトモデル用の完全な.NETラッパーがあるため、COM相互運用性の不格好さを回避できます。。
ラッパーは" Deployment Tools Foundation "と呼ばれます。 (DTF)および基本的な説明は次のとおりです。" Deployment Tools Foundationは、Windows展開プラットフォームテクノロジを.NETの世界にもたらす豊富な.NETクラスライブラリと関連リソースのセットです。基盤となるテクノロジーの完全な機能を公開しながら、デプロイメント関連の開発タスクを大幅に簡素化するように設計されています。"。
これは、簡略化された実践的なサンプルです:
using (var db = new Database(FullPath, DatabaseOpenMode.ReadOnly))
{
PackageCode = db.SummaryInfo.RevisionNumber;
AppVendor = db.SummaryInfo.Author;
AppName = db.SummaryInfo.Title;
ProductName = db.SummaryInfo.Subject;
ProductCode = (string)db.ExecuteScalar("SELECT `Value` FROM "+
"`Property` WHERE `Property` = 'ProductCode'");
AppVersion = (string)db.ExecuteScalar("SELECT `Value` FROM "+
"`Property` WHERE `Property` = 'ProductVersion'");
UpgradeCode = (string)db.ExecuteScalar("SELECT `Value` FROM "+
" `Property` WHERE `Property` = 'UpgradeCode'");
}
プライマリDTFファイル(後者の2つが最も使用されるファイルです):
- Microsoft.Deployment.Compression.dll -アーカイブのパックとアンパックのフレームワーク。
- Microsoft.Deployment.Compression.Cab.dll -キャビネットアーカイブのパックとアンパックを実装します。
- Microsoft.Deployment.Resources.dll -実行可能ファイルのリソースデータを読み書きするためのクラス。
- Microsoft.Deployment.WindowsInstaller.dll -Windows Installer API用の完全な.NETベースのクラスライブラリ。
- Microsoft.Deployment.WindowsInstaller.Package.dll -Windowsインストーラーのインストールおよびパッチパッケージを操作するための拡張クラス。
C#プロジェクトを作成し、これらのファイルを参照し、必要な制御を使用して独自の展開アプリケーションをコーディングするだけです。現時点ではDTFのツールを設定していませんが、 このサンプル をご覧くださいC#プログラムがどのように機能するかの一般的な考え方。
- DTFはWIXに含まれています。 ここからWiXをダウンロード 。
- DTF dllは、メインWiXインストールフォルダーのSDKフォルダーにあります(デフォルトの場所は%ProgramFiles(x86)%\ WiX Toolset v3.10 \ SDK)。バージョン番号は、おそらくこれを見るまでに異なるでしょう。 %ProgramFiles(x86)%の下のWiXフォルダーを探してください。
- " doc"で DTFヘルプファイルを探します。フォルダ。 DTF.chm および DTFAPI.chm 。オブジェクトモデルとその使用法に関する完全に優れたドキュメント。
- DTFの詳細については、 このserverfault.comの投稿 をご覧ください
- WiXを使用するための最初の提案: MSI vs nugetパッケージ:継続的配信に適しているのはどれですか
これは、ブートストラップ実行可能ファイルを作成するビルドプロセスの一部として使用するVBScriptの同様の例です...
Option Explicit
Const MY_MSI = "product.msi"
Dim installer, database, view, result, sumInfo, sPackageCode
Set installer = CreateObject("WindowsInstaller.Installer")
Set database = installer.OpenDatabase (MY_MSI, 0)
Set sumInfo = installer.SummaryInformation(MY_MSI, 0)
sPackageCode = sumInfo.Property(9) ' PID_REVNUMBER = 9, contains the package code.
WScript.Echo "ProductVersion=" & getproperty("ProductVersion")
WScript.Echo "ProductCode=" & getproperty("ProductCode")
WScript.Echo "PackageCode=" & sPackageCode
WScript.Echo "ProductName=" & getproperty("ProductName")
Function getproperty(property)
Set view = database.OpenView ("SELECT Value FROM Property WHERE Property='" & property & "'")
view.Execute
Set result = view.Fetch
getproperty = result.StringData(1)
End Function
lessmsi で軽量の非プログラムソリューションを見つけました。明らかにwixを使用し、指定されたフォルダーに.msi全体を展開します。 (UIもありますが、Win7ではうまくレンダリングされませんでした。)