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 回答