2013-02-16 34 views
1

我使用Wix框架创建了安装程序。安装程序(使用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会运行并给我错误:

系统无法找到指定的注册表项或值。”

问题是安装程序在“Admin”上下文中运行,因此不知道如何找到HKCU位于注册表中的哪个位置。

有没有人知道我是如何在HKCU下找到一个帐户(然后是正确的注册表),当我处于“管理”环境时?

我想要尝试的下一个策略是获取当前用户的SID,然后通过搜索HKEY_USERS访问它们的注册表......但这证明是困难的。

+0

使用注册表搜索和条件。 http://wix.sourceforge.net/manual-wix3/read_a_registry_entry.htm – Gilad 2013-02-17 21:57:03

+0

如果我们确切地知道要查找哪些键值,这将工作,但对于此应用程序,注册表键值是非确定性的并取决于事物像用户名等 – stackunderflow 2013-02-18 17:53:02

回答

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 

该脚本将提示用户允许管理员权限。

要写入香港大学注册处,我需要知道特定用户的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命令行功能来做到这一点。

注意:我不建议任何人使用这种技术。我们必须使用它,因为在之前的发布版本中,决定在卸载时需要擦除所有自定义设置。在发布之后,当时确定这实际上并不是一个可以接受的解决方案,但这已经太迟了......它已经被发送给客户。

相关问题