Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Installation 安装程序(使用Wix创建)在升级客户端时删除注册表项';软件_Installation_Wix - Fatal编程技术网

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
然后,只需复制注册表,并在安装程序执行序列完成后恢复注册表。我使用命令行函数来实现这一点


注意:我不建议任何人使用这种技术。我们不得不使用它,因为在先前发布的版本中,我们决定卸载时必须擦除所有自定义设置。发布后,决定这实际上不是一个可接受的解决方案,但为时已晚……它已经交付给客户

使用注册表搜索和条件。如果我们确切地知道要查找哪些键值,这将起作用,但是对于这个应用程序,注册表键值是不确定的,并且取决于用户名等。使用注册表搜索和条件。如果我们确切地知道要查找哪些键值,那么这将是可行的,但是对于这个应用程序,注册表键值是不确定的,并且取决于用户名等。