Installation Wix安装程序-从“控制面板”中的“卸载”或“更改程序”运行更改时,如何使用管理权限运行更改

Installation Wix安装程序-从“控制面板”中的“卸载”或“更改程序”运行更改时,如何使用管理权限运行更改,installation,wix,uac,custom-action,Installation,Wix,Uac,Custom Action,我的安装程序有一个自定义操作,该操作会联系windows服务并设置一些参数。 为了成功使用该服务,必须以提升的权限运行该服务 在第一次安装中,当用户单击安装按钮时,会显示UAC提示,安装成功完成。但是,当用户决定更改产品(添加新功能)时,调用服务将失败!这是因为安装程序未在特权模式下运行。当我从具有管理权限的命令提示符启动安装程序时,更改操作也会成功完成 我遇到了以下建议,建议创建一个引导程序。有没有更简单的方法来实现这一点 我是否正确执行了自定义操作?。这是自定义操作代码 <C

我的安装程序有一个自定义操作,该操作会联系windows服务并设置一些参数。 为了成功使用该服务,必须以提升的权限运行该服务

在第一次安装中,当用户单击安装按钮时,会显示UAC提示,安装成功完成。但是,当用户决定更改产品(添加新功能)时,调用服务将失败!这是因为安装程序未在特权模式下运行。当我从具有管理权限的命令提示符启动安装程序时,更改操作也会成功完成

我遇到了以下建议,建议创建一个引导程序。有没有更简单的方法来实现这一点

我是否正确执行了自定义操作?。这是自定义操作代码

     <CustomAction Id='SetParams' BinaryKey='Setup.CustomAction' DllEntry='SetParameters' Execute='deferred' Impersonate='no' Return='asyncWait'/>
<Binary Id='Setup.CustomAction' SourceFile='$(var.CustomActionDll)' />

<InstallExecuteSequence>
  <Custom Action='SetParams' Before='InstallFinalize'><![CDATA[REMOVE <> "ALL"]]></Custom>
</InstallExecuteSequence>
这种方法有效! 当从admin cmd会话启动时[propertyName]返回正确的值,但当我从非提升的cmd提示符运行安装程序更改时,我无法访问即时CA中的属性值-会话[propertyName]返回空字符串

我可以访问wxs文件中定义的(静态)属性

<Property Id="INSTALL" Secure="yes" /> 

未设置模拟属性的延迟自定义操作将确保CA在提升模式下运行

我添加了一个新的方法来解决出现的另一个问题

访问动态属性值问题的解决方案

  • 立即操作,读取要从执行中移动的属性 序列到用户界面序列
  • 执行阶段的操作可以访问数据 从问题中所述的安全属性。如果属性 是在CA中动态创建的,必须将其添加到 SecureCustomProperties系统属性。分隔符字符是“;”。"

  • “延迟”和“无模拟”属性可确保自定义操作以完全权限运行。问题是由其他原因造成的。请尝试调试自定义操作代码。@CosminPirvu我已尝试运行安装程序(更改操作)从用户命令提示符和administative cmd。在admin cmd的情况下,自定义操作工作正常,而在常规cmd的情况下,其行为与从控制面板启动更改时相同。显然,调用自定义操作失败,因为它不是以admin的身份运行。@CosminPirvu您是对的。我正在访问CA.Set中的会话数据Params CA使用在UI序列中生成的动态属性。为了访问延迟CA中的数据,我创建了一个即时CA,该CA动态提取此数据并将其放入CustomActionData中。这种方法有效!但是,当我从非提升cmd提示符运行安装程序更改时,我无法访问即时CA中的属性值为什么?
    propertyName = moduleInfo.GetPropertyName(moduleParameter.Name);
    customActionData.Append(string.Format(CultureInfo.InvariantCulture, "{0}={1};", propertyName, session[propertyName]));
    
    <Property Id="INSTALL" Secure="yes" /> 
    
    session[property] = parameters[paramcount++];