2012-02-20 53 views
3

私はWiX 3.6を使用してインストーラを作成しています。インストーラからレジストリにインストール先を書き込む

ALLUSERSプロパティに応じて、インストール場所の場所をHKCUまたはHKLMのレジストリに書き込む必要があります。

は今、私は、次の問題はそれだけでALLUSERSは=「」、すなわちHKMUはHKCUと解釈されたときのために働くです

<RegistryKey Root="HKMU" 
      Key="Software\OpenCover" 
      Action="createAndRemoveOnUninstall"> 
    <RegistryValue Name="Location" 
        Type="string" 
        Value="[APPLICATIONFOLDER]" 
        Action="write" 
        KeyPath="yes" /> 
</RegistryKey> 

を動作するはずだと思う行っている調査に基づきます。

ALLUSERS = 1の場所でperMachineをインストールしようとすると、期待通りにエントリがHKLMに書き込まれません。ただし、インストーラのログファイルを見ると、WriteRegistryValuesが呼び出されます。

MSI (s) (D4:14) [22:46:24:901]: Executing op: ActionStart(Name=WriteRegistryValues,Description=Writing system registry values,Template=Key: [1], Name: [2], Value: [3]) 
Action 22:46:24: WriteRegistryValues. Writing system registry values 
MSI (s) (D4:14) [22:46:24:902]: Executing op: ProgressTotal(Total=2,Type=1,ByteEquivalent=13200) 
MSI (s) (D4:14) [22:46:24:903]: Executing op: RegOpenKey(Root=-1,Key=Software\OpenCover,,BinaryType=0,,) 
MSI (s) (D4:14) [22:46:24:903]: Executing op: RegAddValue(Name=ConsoleLocation,Value=C:\Program Files (x86)\OpenCover\,) 
WriteRegistryValues: Key: \Software\OpenCover, Name: ConsoleLocation, Value: C:\Program Files (x86)\OpenCover\ 
MSI (s) (D4:14) [22:46:24:906]: Executing op: RegCreateKey() 
WriteRegistryValues: Key: \Software\OpenCover, Name: , Value: 

誰かが私が

答えて

2

問題は実際には64ビットプラットフォーム上の32ビットインストーラと関係しています。

このシナリオでALLUSERS = "1"を使用すると、HKMUでマークアップされたレジストリエントリが実際に書き込まれますが、この場合はHKLM \ Software \ Wow6432Node \ OpenCoverになります。私は、HKLMとしてマークされたエントリも同じようにリダイレクトされると考えています。

残念ながら、WriteRegistryValues Actionのマニュアルでは32/64ビットの「魔法」リダイレクトは説明されていません。実際のレジストリエントリに関する情報はログには表示されません。

何が起こっているのかについての洞察を得るには、次の記事では、観察された動作Registry Keys Affected by WOW64を解明しています。この記事から、インストーラがHKLM \ Softwareフォルダに書き込んでいると「考えている」ことがわかりますが、これは実際にであり、64ビットプラットフォーム上の32ビットプロセスではHKLM \ Wow6432Node \ Softwareにがリダイレクトされています。なぜそれがログファイルに反映されないのか。この記事では、ALLUSERS = ""とHKMUがHKCUである理由を説明します。なぜなら、これらのエントリはであるため、32〜64ビットのアプリケーション間で "共有"です。

+1

これは、32ビットプロセスが64ビットOSの仮想環境で動作するためです.WOW64(WindowsのWindows)。レジストリキーはリダイレクトされるだけでなく、プログラムファイルとシステムディレクトリです。したがって、32ビットプロセスは 'Program Files(x86) 'からファイルを読み込むことは実際にはわかりませんが、' Program Files'でも動作すると考えられます。インストーラはまた、これらのリダイレクションを受けます。 64ビットをインストールすると、64ビットのmsiexecが使用されます。 32ビットパッケージの場合、32ビットのmsiexecが使用されます。 –

0

私の推測では、あなたのインストーラが(?UACが有効になって)上昇し、HKLMへの書き込みは、HKCUにリダイレクトされているとされていないということである完了するために必要なタスクを達成する方法を説明することができます。

また、このメタデータを格納するレジストリキーを作成する必要なく、アプリケーション内のWindows Installer APIを使用してUpgradeCode、ProductCode、ProductInformation(INSTALLLOCATION)を照会することも検討できます。

+0

HKCUは、ALLUSERS = ""(これは期待どおりです)、ALLUSERS = "1"の場合のみHKLMまたはHKCUの下にエントリが表示されません。このエントリは、nant/msbuildなどのサードパーティのビルドシステムで使用するためのもので、ビルドプロセス中にアプリケーションを起動できるようになっています。これらはすでにスクリプト作成に役立つレジストリユーティリティを持っています。 –

+0

アプリケーションがALLUSERS = "1"の場合、コードが正しい場所(Program Files)に配置されているため、UACとは思われません。私はエントリがないので失敗しない理由について混乱しています...私はそれに[プロセスモニター](http://technet.microsoft.com/en-us/sysinternals/bb896645)を張ります何が起きているのかを見てください。あなたの提案をありがとう –

+0

ログ全体を投稿できますか? –

関連する問題