2012-11-20 64 views
0

您好我有這兩個二進制文件:從二進制文件啓動一個EXE

<Binary Id="Sentinel" SourceFile="sentinel_setup.exe"/> 
<Binary Id="Hasp" SourceFile="HASPUserSetup.exe"/> 

而且我想開始他們點擊一個按鈕,像這樣:

<CustomAction Id="LaunchHasp" BinaryKey="Hasp" ExeCommand="" Return="asyncWait" /> 
<CustomAction Id="LaunchSentinel" BinaryKey="Sentinel" ExeCommand="" Return="asyncWait"/> 

<Publish Event="DoAction" Value="LaunchHasp">1</Publish> 

但事實並非如此工作,它只有當我用提升的特權從命令行運行安裝程序時才起作用。我究竟做錯了什麼?由於

或者有人可以告訴我如何,我可以從二進制化表使用C++自定義操作提取的文件,因爲我不能讓它在所有工作.. :(

回答

3

立即自定義操作沒有升高。特權你應該使用遞延自定義操作這種需求的任何行動作出更改destimation環境應遞延欲瞭解更多詳情請閱讀這篇文章:。http://bonemanblog.blogspot.com/2005/10/custom-action-tutorial-part-i-custom.html

<CustomAction Id="LaunchHasp" Impersonate="no" Execute="deferred" BinaryKey="Hasp" ExeCommand="" Return="asyncWait" /> 

雖然DEFF在安裝階段執行自定義操作,而不是按下按鈕。修改您的安裝程序邏輯。據我瞭解,你的exe文件「sentinel_setup.exe」改變系統,所以應該在InstallExecuteSequence

InstallInitialize和InstallFinalize事件之間的計劃,我會建議增加一個複選框,用戶應當標註安裝你的「搭扣」(或安裝程序功能,用戶應該在功能樹中選擇)。並在此複選框狀態下添加帶有條件的已緩存自定義操作。

有時真的需要在安裝程序UI順序期間或之前啓動管理員操作。在這種情況下,您需要創建一個安裝引導程序,它需要權限提升並在運行MSI進程之前執行所需的操作。要詢問權限,您需要將應用程序清單添加到引導程序項目中。我的引導程序非常簡單,但在很多情況下都適用。它是Windows應用程序(雖然沒有任何Windows窗體 - 它允許隱藏控制檯窗口),它只包含圖標,應用程序清單和小代碼文件:

using System; 
using System.Diagnostics; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace SetupBootstrapper 
{ 
    class Program 
    { 
     [STAThread] 
     static void Main(string[] args) 
     { 
      var currentDir = AppDomain.CurrentDomain.BaseDirectory; 
      var parameters = string.Empty; 
      if (args.Length > 0) 
      { 
       var sb = new StringBuilder(); 
       foreach (var arg in args) 
       { 
        if (arg != "/i" && arg != "/x" && arg != "/u") 
        { 
         sb.Append(" "); 
         sb.Append(arg); 
        } 
       } 
       parameters = sb.ToString(); 
      } 

      bool isUninstall = args.Contains("/x") || args.Contains("/u"); 

      string msiPath = Path.Combine(currentDir, "MyMsiName.msi"); 

      if(!File.Exists(msiPath)) 
      { 
       MessageBox.Show(string.Format("File '{0}' doesn't exist", msiPath), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
       return; 
      } 

      string installerParameters = (isUninstall ? "/x" : "/i ") + "\"" + msiPath + "\"" + parameters; 

      var installerProcess = new Process { StartInfo = new ProcessStartInfo("msiexec", installerParameters) { Verb = "runas" } }; 

      installerProcess.Start(); 
      installerProcess.WaitForExit(); 
     } 
    } 
} 
+0

編輯我的文章。增加了關於引導程序應用程序的信息。至於你的想法從自定義操作中提取exe文件 - 這是過於複雜,我敢肯定它不會工作,因爲有相同的安全限制。 –

+0

嗨,謝謝,這個引導程序只顯示我的MSI對話框嗎?非常感謝 –

+0

不,它會執行你的MSI,就像你通過管理員提供的命令行一樣。因此,您可以指定是否顯示UI或使用靜默模式(/ qn參數)以及MSI中存在的任何其他功能。提供的引導程序只能以管理員權限運行MSI - 沒有別的。 –

相關問題