1

Wixフレームワークを使用してインストーラーを作成しました。

ユーザーがソフトウェアを初めてインストールした後、機能をカスタマイズして、次にプログラムを実行するときにレジストリに保存することができます。

これが私が抱えている問題です:

ユーザーの設定は、私のプログラムで必要なようにレジストリに保存されています。ユーザーがプログラムをアンインストールしても、設定は引き続きレジストリに保存されます(これも必要に応じて)。ただし、ユーザーが新しいバージョンのソフトウェアをインストールしようとすると、レジストリ値が消去されます。

インストール時にレジストリ値が消去されないようにするにはどうすればよいですか?


編集:

現在、カスタムアクションスクリプトを実行してレジストリをコピーおよび復元しようとしています。スクリプトのコードは次のとおりです。

<CustomAction Id="SaveCmd" Directory="TempFolder"  ExeCommand="[SystemFolder]ccbackup.bat" Execute="deferred" Impersonate="no" />
<CustomAction Id="RestoreCmd" Directory="TempFolder" ExeCommand="[SystemFolder]REG.exe RESTORE HKCU\Software\Company\Program[TempFolder]BkUp.hiv" Execute="deferred" Impersonate="no" />
<InstallExecuteSequence>
    <Custom Action="SaveCmd" After="InstallInitialize" />
    <Custom Action="RestoreCmd" Before="InstallFinalize" />
</InstallExecuteSequence>

SaveCmdカスタムアクションは、次のようなスクリプト(ccbackup.bat)を実行して、デバッグ情報を取得できるようにします。

REG.exe SAVE HKCU\Software\Company\Program BkUp.hiv /Y
pause

スクリプトccbackup.batが実行され、エラーが発生します。

指定されたレジストリキーまたは値が見つかりませんでした。」

問題は、インストーラーが「管理者」コンテキストで実行されているため、レジストリ内のHKCUがどこにあるかを見つける方法がわからないことです。

私が「管理者」のコンテキストにいるときに、HKCUでアカウント(およびその後の正しいレジストリ)を見つける方法を誰かが知っていますか?

私が試みようとしていた次の戦略は、現在のユーザーのSIDを取得し、HKEY_USERSを検索してレジストリにアクセスすることでした...しかし、これは困難であることが証明されています。

4

1 に答える 1

1

WiXについて学ぶことはたくさんあります...これが私がこの漬物から抜け出した方法です:

カスタムアクションのアクセス許可を上げるために(必要な場合)、次のVBスクリプトを使用しました。

Set objShell = CreateObject("Shell.Application")
Set FSO = CreateObject("Scripting.FileSystemObject")
strPath = FSO.GetParentFolderName (WScript.ScriptFullName)
If FSO.FileExists(strPath & "\CopyRegScript.VBS") Then
     objShell.ShellExecute "wscript.exe", _ 
        Chr(34) & strPath & "\CopyRegScript.VBS" & Chr(34), "", "runas", 1
Else
     MsgBox "Script file CopyRegScript.VBS not found"
End If

このスクリプトは、管理者権限を許可するようにユーザーに促します。

HKUレジストリに書き込むには、特定のユーザーのSIDを知る必要がありました。そのために私はこのスクリプトを使用しました:

Private Function getSid()
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set wshShell = CreateObject( "WScript.Shell" )
    strDomain = wshShell.ExpandEnvironmentStrings("%ComputerName%")
    Set objAccount = objWMIService.Get("Win32_UserAccount.Name='" & _strUsername & "',Domain='" & strDomain & "'")
    getSID = objAccount.SID
End Function

次に、レジストリをコピーし、インストーラの実行シーケンスが終了したときにレジストリを復元した後の問題でした。これを行うには、 Reg.exeコマンドライン関数を使用しました。

注:この手法を使用することはお勧めしません。以前のリリースバージョンでは、アンインストール時にすべてのカスタム設定を消去する必要があると判断されたため、これを使用する必要がありました。これをリリースした後、これは実際には許容できる解決策ではないと判断されましたが、これは遅すぎました...すでに顧客に出荷されていました。

于 2013-02-26T18:22:22.353 に答える