2013-05-13 90 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以創建具有所有這些邏輯的合併模塊,並將其合併到您現有的安裝項目中。儘管這需要一段時間。

相關問題