2013-05-13 53 views
1

我有一个MSI安装程序来安装我的Windows服务,并且在我的自定义操作中,我需要在HKEY_LOCAL_MACHINE/SOFTWARE/MYSoftware注册表项中写入一些值到注册表中。无法在MSI安装程序的自定义操作中写入注册表

我想这样做,它不工作,但从我的Windows服务它工作正常。有人可以告诉我我哪里出错了吗?

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安装程序我的自定义操作,这是行不通的。

有人可以告诉我我要去哪里吗?

+0

我正确地猜测您正在使用InstallUtil(安装程序类)自定义操作并使用Visual Studio部署项目创作您的MSI? – 2013-05-13 14:31:35

+0

是的,你是对的... 我做错了什么.. ?? – 2013-05-14 03:16:37

回答

2

你遇到了一些问题。最明显的问题是,Visual Studio部署项目不正确地调度自定义操作以模拟客户端上下文。这意味着在UAC场景中您将没有权限。快速解决方法是从已提升的命令提示符上下文中运行MSI。

第二个问题是Visual Studio部署项目太多地抽象/隐藏底层MSI。对于自定义操作,它只提供“安装,卸载,回滚,提交”的选项,而不公开任何附加设置。它隐藏了ServiceInstall和ServiceControl表。这会导致您编写重新创建轮子的自定义操作。

请参阅您的所有自定义操作应执行的操作是执行业务逻辑和设置属性。然后,您应该使用注册表表设置基于属性的数据。通过这种方式,您可以尽可能多地利用Windows Installer以及它的所有免费事务/回滚功能。

这个问题一再重复,这就是为什么微软杀死了VS2012中的安装项目类型。

如果是我的安装,我会重构设计以使用AppSearch/Reglocator读取数据,使用最低限度的自定义操作来执行处理,然后使用Registry表应用数据。

这将需要您至少查看Windows Installer XML以创建具有所有这些逻辑的合并模块,并将其合并到您现有的安装项目中。尽管这需要一段时间。

相关问题