2009-09-17 64 views
3

我有一個包含EXE,ActiveX控件(DLL)和COM服務器(EXE)的Win32應用程序,我使用Inno Setup 5構建我的安裝程序。我們的許多客戶使用有限的用戶帳戶,其中用戶沒有管理權限,並且由於COM組件需要註冊(寫入HKEY_CLASSES_ROOT),我的安裝文件必須以高級(管理員)權限運行。我認爲這是不可避免的(可惜,我不能使用免註冊的COM,因爲我有EXE COM服務器)。但是,我想創建一個可以作爲有限用戶運行的更新安裝程序,並且正在尋找一些建議。Windows受限用戶安裝

我在想什麼如下:

  • 初始設置(首次安裝)將應用程序安裝到%ALLUSERSPROFILE%\應用數據\公司名稱\ AppName的而非%PROGRAMFILES%。 COM組件被正常註冊(因爲它們不會已經存在)。
  • 後續更新(使用不同的Inno Setup腳本)將簡單地將新文件複製到%ALLUSERSPROFILE%\ Application Data \ CompanyName \ AppName中。希望即使是有限的用戶也可以對這個文件夾擁有寫入權限,並且由於COM組件已經被註冊,所以不需要管理員訪問權限。

這意味着我的客戶可以升級到最新和最好的版本,而無需使用管理員帳戶的麻煩。這是可以接受的還是這可能咬我的背面?我非常確定谷歌瀏覽器做了類似的事情,但是因爲它沒有COM組件(據我所知),即使最初的設置可以作爲一個有限的用戶。

任何來自其他人面對此問題的建議都會非常受歡迎。

回答

2

我不確定,但我似乎記得COM服務器支持每用戶安裝,也許這也適用於EXE服務器。

如果是這樣,請更改您的註冊碼,以便將信息寫入HKEY_CURRENT_USER\Software\Classes而不是HKEY_CLASSES_ROOT

COM基礎結構應該首先按用戶查找,然後按每臺機器查找。

無論如何,這是值得一試的。

+1

我想你可能會到一些信息 – Rob 2009-09-18 13:16:59

0

如果您丟棄了inno-setup並使用了MSI - MSI文件支持有限的用戶安裝補丁的想法。管理員必須授權初始安裝,此後,msi文件修補程序中的數字簽名由高級msi服務處理,而不需要用戶提升。

您可以自己複製這個基本想法 - 在初始管理安裝期間,安裝具有必要訪問權限的服務組件。處理修補程序時,要求服務進程處理EXE COM服務器註冊。

4

好吧,我發現一種方法來創建一個有限的用戶安裝腳本,我的COM服務器和COM對象都是按用戶註冊的。

我使用MSVC 2008附帶的ATL(v9)的最新版本來創建我的COM服務器和COM對象。事實證明,您可以通過新的/RegServerPerUser開關注冊每個用戶的COM服務器。我在XP,Vista和Windows 7上用有限的用戶帳戶測試過它,並且完美地工作。

接下來,COM控件。再次,ATL9來拯救。您可以通過確保RegSvr32調用控件的DllInstall功能,通過它的user命令行參數登記每個用戶的控制。所以,要用這種方式註冊一個控件,你只需要:

regsvr32.exe /i:user /n MyControl.DLL 

再次,我在XP,Vista和Windows 7上測試了它,它工作正常。

我那麼做了以下修改我的Inno Setup的腳本:

  • 默認安裝文件夾將{pf}(即C:\ Program Files文件),如果用戶擁有管理員權限。如果不是,則它默認爲{commonappdata}(即C:\ Documents and Settings \ All Users)。
  • 使用新/RegServerPerUser開關注冊我的COM服務器。
  • 我從我的COM對象刪除regserver標誌,而是增加了支持REGSVR32使用新的「用戶」切換調用。

所有這些更改都很容易使用Inno Setup {code}功能來完成。

感謝金正日設置我下了每個用戶COM安裝路徑。

+0

感謝廣泛的後續行動。 – 2009-09-22 14:35:13

+0

+1感謝您的更新! – Viet 2011-01-18 23:01:16

0

你需要重新思考你的approache ......寫訪問不是也可以允許同一用戶程序執行對所有病毒/惡意軟件功能,99%的原因的文件夾。請了解一些有關軟件限制策略和Windows 7中內置的新App Locker行爲,以便計算基礎架構可以向前移動而不是向後移動。