2017-01-05 11 views
2

WiXを実行してからしばらく時間がかかりましたが、ちょっと前に書いた既存のブートストラップexe実際に私が思っていたことをやっているのではないですか?私は似たような問題を抱えている他の人たちを見てきましたが、なぜそれが機能していないのかまだ分かりません。私は基本的にSQL SMOの特定のバージョンがインストールされているかどうかを判断しようとしていると、この場所でレジストリで探していますWIx - SQL SMOの値が存在するかどうかを調べるときに「レジストリキーが見つかりません」

:マイクロソフト\のMicrosoft SQL Serverの\

HKEY_LOCAL_MACHINE \ソフトウェア\ SharedManagementObjects \ CurrentVersionの:そこに「バージョン」と呼ばれるREG_SZキーがあり、それが13.0.1601.5以下

私のコードのモックアップであるようなものに設定されています

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" 
    xmlns:bal="http://schemas.microsoft.com/wix/BalExtension" 
    xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension" 
    xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"> 

    <Bundle Name="RegReadTesterSetup" Version="1.0.0.0" Manufacturer="BigChris Inc" UpgradeCode="fcaa47db-3b55-474f-995d-2b0a0905fced"> 
     <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" /> 

    <util:RegistrySearch Id="IsSMOInstalled" 
       Root="HKLM" 
       Key="SOFTWARE\Microsoft\Microsoft SQL Server\SharedManagementObjects\CurrentVersion\Version" 
       Value="13.0.1601.5" 
        Win64="yes" 
       Result="exists" 
        Format="raw" 
       Variable="SMOInstalled"/> 

     <Chain> 
     <MsiPackage SourceFile="C:\Users\chris.moxon\AppData\Local\Temporary Projects\SimpleTextFileSetup\bin\Debug\SimpleTextFileSetup.msi" 
       Id="MYTEXT" 
       DisplayName="Big Chris Test File" 
       Visible="yes" 
       InstallCondition="SMOInstalled = 0" 
       SuppressSignatureVerification="yes"/> 
     </Chain> 
    </Bundle> 
</Wix> 

注:インデント設定(Win64の&フォーマット)はちょうどそれが動作するように取得するためのストローの試みで私のクラッチの一部です。これらの設定の有無にかかわらず、 64ビットまたは32ビットマシンで実行すると、私はいつも(このキーが存在するマシン上で)取得します:

レジストリキーが見つかりません。私のログファイルに0

を値にキー= 'マイクロソフト\ Microsoft SQL Serverの\ SOFTWARE \ SharedManagementObjects \ CurrentVersionのバージョン\'

数値変数を設定する 'SMOInstalled'; SMOInstalled変数は常に0に設定されるため、SMO(またはテキストファイル)は常にインストールされます。

私は何かばかげたことをしなければならないことを感謝します(または希望)。

ありがとうございます。

ビッグクリス。

答えて

1

これは動作するはずです:

<util:RegistrySearch Id="IsSMOInstalled" 
      Root="HKLM" 
      Key="SOFTWARE\Microsoft\Microsoft SQL Server\SharedManagementObjects\CurrentVersion" 
      Value="Version" 
      Win64="yes" 
      Result="exists" 
      Variable="SMOInstalled"/> 

Result="exists"レジストリ検索を行うときは、Format="raw"を必要はありません。

問題は、レジストリにキーと値がどのようなものであるかを混在させていることです。 「キー」は、レジストリの場所を選択するときにregeditの一番下に表示されるパスです。値は実際にはレジストリキーの場所にあるレジストリ値の名前です。この場合、必要なレジストリ値はキー "HKLM \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ SharedManagementObjects \ CurrentVersion"の "Version"であり、その値が存在するかどうかを確認しています(SMOInstalledを0に設定します存在する)または1(存在する))。

実際のバージョン情報(レジストリ値の「データ」)を取得するには、Result = "value"を使用する必要があります。その後、SMOInstalledはレジストリ値のデータに設定されるか、存在しない。

Win64="yes"を理解するには、64ビットレジストリと32ビットレジストリの違いを理解する必要があります。32ビットマシンでは1つのレジストリしかありません。どのようにWin64='yes'レジストリ検索が動作するかわかりません。 64ビットマシンでは、2つのレジストリの場所があります。 1つは32ビットプロセス(x86)用で、もう1つは64ビットプロセス(64)です。明示的に指定した場合は、特定のビットプロセスから他のビットのレジストリロケーションを表示できますが、これを実行したいことを確認する必要があります。レジストリを見ようとする64ビットマシンの32ビットプロセスは、SOFTWARE \ abc \ xyz ...と指定したにもかかわらず、レジストリキーがSOFTWARE \ Wow6432Node \ abc \ xyzにリダイレクトされます。

プログラムが32bitまたは64bit SMOのいずれかで動作する場合は、両方のレジストリの場所を確認する必要があります。これは、32ビットのレジストリの場所と64ビットの場所の2つのレジストリ検索を持つことを意味します。あなたはこの

<util:RegistrySearch Id="IsSMOInstalledx86" 
      Root="HKLM" 
      Key="SOFTWARE\Microsoft\Microsoft SQL Server\SharedManagementObjects\CurrentVersion" 
      Value="Version" 
      Result="exists"      
      Variable="SMOInstalled"/> 

<util:RegistrySearch Id="IsSMOInstalledx64" 
      After="IsSMOInstalledx86" 
      Condition="SMOInstalled = 0 AND VersionNT64" 
      Root="HKLM" 
      Key="SOFTWARE\Microsoft\Microsoft SQL Server\SharedManagementObjects\CurrentVersion" 
      Value="Version" 
      Win64="yes" 
      Result="exists" 
      Variable="SMOInstalled"/> 

だけの状態でPROPERTYNAMEまたはNOT PROPERTYNAMEを使用して、実際にプロパティが定義されているかどう評価されるかではないので(ただ、余分な落とし穴として、あなたは、レジストリの状態で「SMOInstalled NOT」を使用することはできませんのようなものをすることができます実際にはそのプロパティの値は実際には評価されません。詳しくは、「プロパティの式の見出し」のヘッダーを参照してください。

+0

ブライアン! –

関連する問題