我的安装程序有一个自定义操作,它会联系Windows服务并设置一些参数。 为了成功使用该服务,必须使用提升的权限运行它。
在用户单击“安装”按钮时首次安装时,会显示UAC提示并安装成功完成。但是,当用户决定更改产品(添加新功能)时,调用该服务将失败!发生这种情况是因为安装程序未在特权模式下运行。当我从具有管理权限的命令提示符启动安装程序时,更改操作也会成功完成。
我遇到了以下article,建议创建一个引导程序。有没有更简单的方法来实现这一目标?
我是否正确实施了自定义操作?这是自定义操作代码
<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>
更新:在Cosmin的评论之后,我意识到我正在访问CA中的会话数据。 SetParams CA使用UI序列中生成的动态属性。为了访问延迟CA中的数据,我创建了一个即时CA,它可以动态提取这些数据并将其放入CustomActionData中。
<CustomAction Id='SaveParams' BinaryKey='Setup.CustomAction' DllEntry='SaveParameters' Execute='immediate' Return='check'/>
<CustomAction Id='SetParams' BinaryKey='Setup.CustomAction' DllEntry='SetParameters' Execute='deferred' Impersonate='no' Return='check' />
<Custom Action='SaveParams' Before='SetParams'><![CDATA[REMOVE <> "ALL"]]></Custom>
<Custom Action='SetParams' Before='InstallFinalize'><![CDATA[REMOVE <> "ALL"]]></Custom>
以下是自定义操作
中SaveParameters方法的一部分propertyName = moduleInfo.GetPropertyName(moduleParameter.Name);
customActionData.Append(string.Format(CultureInfo.InvariantCulture, "{0}={1};", propertyName, session[propertyName]));
这种方法有效! 从admin cmd session [propertyName]启动时返回正确的值,但是当我从非提升的cmd提示符运行安装程序更改时,我无法访问直接CA中的属性值 - session [propertyName]返回空字符串?!
我可以访问wxs文件中定义的(静态)属性
<Property Id="INSTALL" Secure="yes" />
但不是我在UI序列中添加了一些其他立即自定义动作的那个
session[property] = parameters[paramcount++];
答案 0 :(得分:1)
未设置模拟属性的延迟自定义操作将确保CA以提升模式运行。
我添加了一个新的question来解决出现的另一个问题。
访问动态属性值问题的解决方案