簡體   English   中英

msi 安裝程序完成后的應用程序以 SYSTEM 用戶名啟動,有時無法創建 com 對象

[英]Application process after msi installer finished is started as SYSTEM user name which sometimes can not create com object

我有一個安裝 C# 應用程序的 Visual Studio 安裝程序項目,我有一個自定義操作和代碼來在安裝完成后運行該過程。

假設 Windows 機器上的登錄用戶是“john”。 現在,當 john 運行 msi 安裝程序時,我檢查了任務管理器中的進程,它顯示 msiexec.exe 是安裝程序的進程名稱,它以用戶“john”的身份運行

安裝程序現在完成並運行安裝應用程序的進程 myapp.exe,當我在 windows 的任務管理器中檢查此進程時,它顯示 myapp.exe 正在以 SYSTEM 身份運行(我知道那是什么帳戶以及為什么它不以 john 身份運行)

問題當 myapp.exe 以 SYSTEM 用戶身份運行時,它無法創建已經以用戶 john 身份運行的組件(在我的情況下為 iTunes)的 com 組件實例。 如果組件未運行,則創建 iTunes 的 isstance 成功,否則失敗。

問題那么是否有可能確保安裝程序何時以 john 身份運行,當它完成時它以 john 而不是 SYSTEM 用戶身份啟動進程 myapp.exe ? 請注意,我在安裝過程中不會要求用戶輸入密碼。

我在安裝程序完成時運行的代碼

    // Event handler for 'Committed' event.
    private void MyInstaller_Committed(object sender, InstallEventArgs e)
    {
        try
        {                
            Directory.SetCurrentDirectory(Path.GetDirectoryName
            (Assembly.GetExecutingAssembly().Location));
            Process.Start(Path.GetDirectoryName(
              Assembly.GetExecutingAssembly().Location) + "\\MyApp.exe");
        }
        catch
        {
            // Do nothing... 
        }
    }

這很可能是因為您正在運行延遲的自定義操作。 即它默認在 SYSTEM 用戶帳戶下運行。

一種解決方案是確保立即啟動它,例如,您可以使用安裝的最后一個對話框中“完成”按鈕上的已發布事件啟動它。 我不知道如何在 VS 安裝項目中添加已發布的事件,或者如果可能的話,但是您可以輕松地在使用專門的安裝創作工具構建的包中添加一個。

在 Form_Load 事件中這樣寫:

string lUserName=Environment.GetEnvironmentVariable("USERNAME");

然后,您將在安裝 MSI 時獲得 Windows 登錄用戶名,而不是獲取系統用戶帳戶。

就我個人而言,我確實通過運行使用我的應用程序可執行文件的路徑參數化的explorer.exe來解決這個問題:

Process.Start(
    new ProcessStartInfo
    {
        FileName = "explorer.exe",
        Arguments = Context.Parameters["target"],
        UseShellExecute = true
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM