為標準用戶與管理員安裝時,我遇到了奇怪的情況。
我的安裝程式請求“最高”身份驗證級別,然后使用注冊表檔案匯入 HKCU(而不是直接使用 regasm.exe)注冊 COM dll。COM 用于 Excel 中的 VBA。這使我可以按用戶安裝。
安裝后,我在“完成”頁面上選中了“運行應用程式”復選框。程序是:
- 用戶單擊“完成”,NSIS 啟動我撰寫的 VB.net exe
- VB.net exe 將一些額外的注冊表項寫入 HKCU(與 COM 沒有任何關系)然后啟動 Microsoft Excel
- Excel 打開并嘗試在 VBA 中實體化 COM 物件。
這是奇怪的區別:
對于“標準”用戶來說,這一切都很完美。
對于“管理員”用戶,我得到:
運行時錯誤'-2147221164(80040154':
未注冊班級
奇怪的是,如果我隨后關閉 Excel 并雙擊桌面快捷方式 Excel 打開并為 Admin 用戶實體化物件沒有問題。
因此,實際上,此錯誤僅在初始安裝程序中發生在管理員用戶身上(例如,當 NSIS 啟動 VB.net exe 然后啟動 Excel 時)。
此問題出現在 Windows 10 64 位與 Office 365 64 位以及 Window 10 32 位與 Office 365 32 位。因此,應用程式的位數與它無關。
幾乎就像在初始安裝期間注冊表沒有為管理員用戶“重繪 ”一樣。
關于發生了什么以及修復它的代碼有什么想法嗎?
馬修
uj5u.com熱心網友回復:
我猜您遇到了 UAC 安全功能。運行提升時,COM 不會讀取 HKCU 中的條目(因為非提升的應用程式可以在那里寫入并等待提升的應用程式使用劫持的 COM 類注冊)。
話雖這么說,你在做什么沒有意義。如果您正在使用,RequestExecutionLevel Highest那么您應該在設定為ShCtx之后寫入注冊表根目錄,或者取決于您是否在.SetShellVarContextCurrentAll.onInit
如果您想忽略我的建議并繼續使用現有設計,請定義MUI_FINISHPAGE_RUN_FUNCTION并使用ShellExecAsUser、StdUtils.ExecShellAsUser 或丑陋的 Explorer hack ( Exec '"$WinDir\Explorer.exe" "$InstDir\MyApp.exe"')。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/419079.html
標籤:
