2012-02-01 44 views
3

我的安裝程序有一個自定義操作,它可以聯繫Windows服務並設置一些參數。 爲了成功使用該服務,它必須以提升的權限運行。Wix安裝程序 - 如何從卸載或更改控制面板中的程序運行時使用管理權限運行更改

第一次安裝時,當用戶單擊安裝按鈕時,它將顯示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> 

更新:科斯明的評論之後,我意識到我是在訪問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])); 

這種方法適用的一部分! 當從管理員cmd會話啓動時[propertyName]返回正確的值,但是當我從非提升cmd提示符運行安裝程序更改時,我無法訪問直接CA中的屬性值 - session [propertyName]返回空字符串?

我可以訪問WXS文件中定義的(靜態)屬性

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

,但不是一個人的,我在UI序列這樣

session[property] = parameters[paramcount++]; 
+0

延期且沒有模擬屬性確保您的自定義操作以完全權限運行。其他問題導致此問題。請嘗試調試自定義操作代碼。 – 2012-02-01 15:52:26

+0

@CosminPirvu我試着從用戶命令提示符和管理cmd運行安裝程序(更改操作)。如果管理員cmd自定義操作完美地工作,而在常規cmd的情況下,它的行爲與從控制面板啓動更改時的行爲相同。顯然,對自定義操作的調用失敗,因爲它不是以管理員身份運行。 – MrBob 2012-02-01 16:03:35

+0

@CosminPirvu你是對的。我正在訪問CA中的會話數據。 SetParams CA使用在UI序列中生成的動態屬性。爲了訪問延期CA中的數據,我創建了一個即時CA,它動態提取這些數據並將其放入CustomActionData中。這種方法有效!但是,當我從非提升cmd提示運行安裝程序更改時,我無法訪問直接CA中的屬性值?爲什麼? – MrBob 2012-02-08 12:22:25

回答

1

其他一些即時的自定義操作添加未設置模擬屬性的延遲自定義操作將確保CA以提升模式運行。

我增加了一個新的question來解決出現的另一個問題。

解訪問動態屬性值問題

    從執行移動 序列UI序列
  1. 立即採取行動,其讀取屬性
  2. 操作在執行階段可從安全屬性訪問數據 如所陳述的題。如果在CA中動態創建屬性 ,則必須將它們添加到 SecureCustomProperties系統屬性。 「
相關問題