2009-01-13 210 views
3

我已經使用NSIS編寫了一個安裝程序,我需要它在像C:/ Program Files/App Name /這樣的標準位置安裝一些文件(DLL等)。我還需要在當前用戶的Application Data目錄中安裝文件。問題是,當用戶不是Vista上的管理員時,我需要提升權限,並且這樣做時環境變量會更改,以便當前用戶現在看起來是admin用戶,並且最終將安裝在Admin用戶的目錄中而不是實際用戶。當您啓動安裝程序時,您必須提升,以便我無法獲取用戶名,然後提升。當我以管理員身份運行安裝程序時,是否有一些合理的方法來確定實際用戶是誰?當以管理員身份運行時獲取當前登錄的用戶

編輯: 不幸的是,第一次運行時複製的數據不是一個選項。沒有我寫給用戶目錄的東西,該應用程序就無法工作,因爲它是一個MS Word模板。我的東西不會在沒有模板的情況下運行,所以我必須在安裝時編寫模板,Word要求模板位於用戶的AppData目錄中。

回答

3

我所有的NSIS安裝程序都使用此UAC插件:http://nsis.sourceforge.net/UAC_plug-in

只要啓動安裝程序,就可以提升爲管理員。這產生了安裝程序的第二個實例,可以完成所有的工作。但是您可以調用將以啓動安裝程序的用戶身份在原始進程中運行的代碼段。

所以你可以有一個安裝部分,像這樣:

Section "Install My Program" SecMain 
    ...  
    # Install files to common folders 
    ... 
    !insertmacro UAC.CallFunctionAsUser CopyUserWordTemplate 
    ... 
SectionEnd 

Function CopyUserWordTemplate 
    SetOutPath $LOCALAPPDATA 
    File "MyWordTemplate.dot" 
FunctionEnd 
1

看看Windows 7 Logo Program文檔。它指出:

請注意,在每臺機器安裝中,用戶數據必須在第一次運行時寫入,而不是在安裝期間寫入,因爲安裝時沒有正確的用戶位置來存儲日期。

如果您的應用程序僅適用於一個用戶。然後你應該安裝到本地設置文件夾(我認爲Vista和Windows 7的名稱略有不同)。

+0

+1,做OS X的把戲,只是做這些事情上的應用程序的第一次執行,因爲你不能保證用戶誰運行該應用程序是誰安裝它。 – 2009-01-13 21:38:22

+0

不幸的是,這不是一個選項。沒有我寫給用戶目錄的東西,該應用程序就無法工作,因爲它是一個MS Word模板。我的東西不會在沒有模板的情況下運行,所以我必須在安裝時編寫模板,Word要求模板位於用戶的AppData目錄中。 – alanc10n 2009-01-13 22:19:08

2

如果其他用戶試圖運行該應用程序會怎麼樣?然後這些文件將不可用 - 這是一個問題,我與幾個月作鬥爭...

我發現的最佳解決方案是利用一個名爲的已知(而且完全沒有記錄)的Windows功能Active Setup。請參閱http://www.etlengineering.com/installer/activesetup.txt以瞭解其工作原理。

這是IE用來安裝每個用戶設置的相同功能,總結上面的鏈接,基本上你創建一個註冊表鍵,每次用戶登錄時都會檢查一次窗口。如果HKCU鍵值較小比在HKLM中找到的那個更好,它運行你定義的腳本/程序/任何東西。您將每個用戶文件安裝到程序文件文件夾,然後使用主動安裝功能在下次登錄時將它們複製到用戶配置文件。如果您在安裝完成時需要確保它們在那裏,請在安裝完成後安排重新啓動。

PS。如果使用MSI而不是NSIS,則在啓動安裝程序時不必提升,Vista在Execute序列開始時會觸發提升(如果安裝程序設計正確 - 很少) - 但是,當您使用NSIS那麼我猜你會需要在安裝程序運行時觸發提升。

編輯:哈哈,我確切的問題是與MS Word模板也!我在Word模板中找到的解決方案是從HKLM\SOFTWARE\Microsft\Windows\CurrentVersion\App Paths\Winword.exe讀取安裝目錄並將其安裝到該註冊表項中包含的路徑下的STARTUP文件夾。即使用戶進行了數字簽名,也會提示用戶在第一次運行時允許宏執行,但所有用戶都可以使用。確保將模板設置爲只讀,以避免稍後出現任何權限錯誤。

相關問題