Installation 安装程序(使用Wix创建)在升级客户端时删除注册表项';软件
我已经使用这个框架创建了一个安装程序 用户第一次安装软件后,可以自定义功能,这些功能将保存在注册表中,以备下次运行程序时使用 以下是我遇到的问题: 用户的设置被保存在注册表中,就像我的程序应该保存的那样。当用户卸载程序时,他们的设置仍然保存在注册表中(同样,他们应该这样做)但是,当用户安装较新版本的软件时,注册表值将被删除 如何防止安装时删除注册表值?Installation 安装程序(使用Wix创建)在升级客户端时删除注册表项';软件,installation,wix,Installation,Wix,我已经使用这个框架创建了一个安装程序 用户第一次安装软件后,可以自定义功能,这些功能将保存在注册表中,以备下次运行程序时使用 以下是我遇到的问题: 用户的设置被保存在注册表中,就像我的程序应该保存的那样。当用户卸载程序时,他们的设置仍然保存在注册表中(同样,他们应该这样做)但是,当用户安装较新版本的软件时,注册表值将被删除 如何防止安装时删除注册表值? 编辑: 我现在尝试运行一个自定义操作脚本来复制和恢复注册表。以下是我的脚本代码: <CustomAction Id="SaveCmd"
编辑: 我现在尝试运行一个自定义操作脚本来复制和恢复注册表。以下是我的脚本代码:
<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>
脚本ccbackup.bat将运行并显示错误:
“系统找不到指定的注册表项或值”
问题是安装程序在“管理”上下文中运行,因此它不知道如何找到HKCU在注册表中的位置
当我处于“管理员”环境中时,有人知道我如何在香港中文大学下找到一个帐户(然后找到正确的注册表吗?
我要尝试的下一个策略是获取当前用户的SID,然后通过搜索HKEY_用户访问他们的注册表。。。然而,这被证明是困难的。关于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
然后,只需复制注册表,并在安装程序执行序列完成后恢复注册表。我使用命令行函数来实现这一点
注意:我不建议任何人使用这种技术。我们不得不使用它,因为在先前发布的版本中,我们决定卸载时必须擦除所有自定义设置。发布后,决定这实际上不是一个可接受的解决方案,但为时已晚……它已经交付给客户 关于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
然后,只需复制注册表,并在安装程序执行序列完成后恢复注册表。我使用命令行函数来实现这一点
注意:我不建议任何人使用这种技术。我们不得不使用它,因为在先前发布的版本中,我们决定卸载时必须擦除所有自定义设置。发布后,决定这实际上不是一个可接受的解决方案,但为时已晚……它已经交付给客户 使用注册表搜索和条件。如果我们确切地知道要查找哪些键值,这将起作用,但是对于这个应用程序,注册表键值是不确定的,并且取决于用户名等。使用注册表搜索和条件。如果我们确切地知道要查找哪些键值,那么这将是可行的,但是对于这个应用程序,注册表键值是不确定的,并且取决于用户名等。