[英]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.