繁体   English   中英

无法在MSI安装程序的自定义操作中编写注册表

[英]Unable to write registry in custom action of MSI installer

我有一个MSI安装程序,用于安装Windows Service,并且在我的自定义操作中,我需要在HKEY_LOCAL_MACHINE/SOFTWARE/MYSoftware项中向注册表中写入一些值。

我正在尝试执行此操作,但它不起作用,但是从我的Windows Service中可以正常工作。 谁能告诉我我要去哪里错了?

string registryLocaltion = AgentProperties.TMAGENT_REGISTRY_LOCATION
                           + @"\" +AgentProperties.TMAgentVersion;

tmKeyMain = Registry.LocalMachine.OpenSubKey(registryLocaltion, true);
if (tmKeyMain == null)
{
    log.Error("Unable to open registry key " + registryLocaltion);
}

tmKeyMain.SetValue("UseProxySettings", settings.UseProxySettings);
if (settings.UseProxySettings)
{
    tmKeyMain.SetValue("ProxyHost", settings.ProxyHost);
    tmKeyMain.SetValue("ProxyPort", settings.ProxyPort);
    tmKeyMain.SetValue("ProxyUsername",
              GenericHelper.ConvertToBase64Encoding(settings.ProxyUsername));
    tmKeyMain.SetValue("ProxyPassword",
              GenericHelper.ConvertToBase64Encoding(settings.ProxyPassword));
    tmKeyMain.SetValue("ProxyExclusion", settings.ProxyExclusion);
    tmKeyMain.SetValue("BypassProxy", settings.BypassProxy);
}

该代码在Windows服务中可以正常工作,但是如果我在MSI安装程序中的自定义操作中执行了一些非常相似的操作,则该代码将无效。

谁能告诉我我要去哪里错了?

您遇到了几个问题。 最明显的问题是Visual Studio部署项目错误地安排了自定义操作来模拟客户端上下文。 这意味着在UAC方案中,您将没有权限。 快速解决方法是从已经提升的命令提示符上下文中运行MSI。

第二个问题是Visual Studio部署项目过多地抽象/隐藏了底层MSI。 对于“自定义操作”,它仅提供“安装,卸载,回滚,提交”选项,而没有公开任何其他设置。 它隐藏了ServiceInstall和ServiceControl表。 这会使您编写自定义动作,从而重新构造了轮子。

看,您所有的自定义操作应该执行的是执行业务逻辑和设置属性。 然后,您应该使用注册表表根据属性设置数据。 这样,您可以尽可能多地利用Windows Installer及其所有免费的事务处理/回滚功能。

这个问题一遍又一遍地重复,这就是为什么Microsoft在VS2012中取消了安装项目类型的原因。

如果是我的安装,我将重构设计,以使用AppSearch / Reglocator读取数据,执行极简主义的自定义操作来进行处理,然后使用注册表表来应用数据。

这至少需要您查看Windows Installer XML来创建具有所有这些逻辑并被合并到现有安装项目中的合并模块。 不过,这需要一段时间才能学会。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM