[IADP] 如何修改包裝在msi中的檔案權限

  • 14368
  • 0
  • IADP
  • 2011-06-19

在小朱的[[IADP Series] App 遇到 UAC 時的處理方式] 提到當時我和小朱遭遇到UAC問題的狀況及暫時的解法,後來我思考當我們把應用程式安裝到特定的目錄,例如 C:\Program files下的時候UAC的行為是如何影響使用者權限的變更,基本上是即使是以Administrator的帳號登入Windows,當我們在存取某些特定受UAC控管的目錄或檔案時,除非在執行程式的時候選擇「以系統管理員身份執行」,否則Windows基本上會將我們的使用權限變更為Users Group。這倒讓我有了個計較,如果可以在安裝的時後就將Users Group對此檔案權限改為「完全控制」,應該就沒有問題了。

        在小朱的[[IADP Series] App 遇到 UAC 時的處理方式] 提到當時我和小朱遭遇到UAC問題的狀況及暫時的解法,後來我思考當我們把應用程式安裝到特定的目錄,例如 C:\Program files下的時候UAC的行為是如何影響使用者權限的變更,基本上是即使是以Administrator的帳號登入Windows,當我們在存取某些特定受UAC控管的目錄或檔案時,除非在執行程式的時候選擇「以系統管理員身份執行」,否則Windows基本上會將我們的使用權限變更為Users Group。這倒讓我有了個計較,如果可以在安裝的時後就將Users Group對此檔案權限改為「完全控制」,應該就沒有問題了。

 

       假設我們要寫一個程式Insert 或 Update資料到access mdb檔案中的資料表,當我們將這個程式使用Windows Installer安裝到C:\Program Files (或可能是C:\Program Files(X86) 如果你是將編譯目標平台是X86的程式安裝到Windows X64系統中時),在Windows XP的情況下,這個程式會順利的執行;但如果是安裝在Windows Vista/7的情況下,就會出現以下的例外情況:

pic01

 

       這是因為UAC造成的影響,在一般的情況下我們有許多其它的選擇可以做,例如修改Manifest強制使用者用「以系統管理員身份執行」、或是乾脆在安裝專案中改變安裝目錄使其不要裝在受UAC控管的特定目錄中。不過在Intel AppUp Developer Program的規定中,這兩個方法都行不通。所以最後的解決之道就是在安裝過程中就將Users Group對此檔案權限改為「完全控制」。下圖為未做任何修改前,我的測試程式中mdb檔案的原始權限設定,看起來就只有 Read 和 Execute而已:

pic02

 

       要能夠在安裝時期就將檔案權限修正當然有很多種方法,不過我想起之前在寫Windows Home Server Add-in的時候曾經用過Orca這個工具來修改msi檔的某些屬性 (詳見 [WHS Add-in] Add-in 程式開發的準備 ),因此就突發奇想是否Orca也可以修改File Permissions,結果這個發想是正確的。

 

       Orca這個工具是包含在Microsoft Windows SDK (http://www.microsoft.com/downloads/en/details.aspx?FamilyID=c17ba869-9671-4330-a63e-1fd44e0e2505&displaylang=en)的其中一樣工具,不過這個SDK實在很大,你可以用搜尋引擎搜尋Orca這個關鍵字找到單獨下載的安裝套件。

       當你安裝好Orca之後,就可以按照下列的步驟去修改檔案的權限(在本文的例子就是修改ConditionDB.mdb的File Permissions):

 

       (1) 「以系統管理員身份執行」Orca.exe (事實上他一定會要求你用這個權限執行)。

       (2)  選擇 [File] –> [Open] 開啟你要修改的 msi檔案。

pic03

       (3) 在左方的Tables行中找到File,並選擇它。

       (4) 此時右方會出現關於這個msi檔的File內容資料,以FileName欄位找到要設定權限的檔案名稱 (ConditionDB.mdb),記下在File欄位的文字 (以這個圖的例子就是『_701D306E457E40CA8C7AE986C149B80C』)。

pic04

       (5) 回到左邊窗格,找到LockPermissions欄位並點選。

pic05

       (6) 在右方窗格按下滑鼠右鍵,並在PopUp Menu選擇Add Row

pic06

       (7) 在以下畫面的LockObject欄位輸入在步驟(4)所取得的File欄位的文字

pic07

       (8) 在Table欄位輸入File,表示要更動的是msi檔中的File Table

pic08

      (9) 在User欄位輸入Users,表示此權限設定的對象為Users Group

pic09

       (10) 在Permission欄位輸入2032127,表示權限為完權控制(註1)

pic10

       (11) 按下OK後,會顯示出所新增的資料結果

pic11

       (12) 選擇 [File] –> [Save]將所修改的結果儲存

pic12

       我們完成了整個流程,現在可以安心地把這個程式上傳而不用擔心UAC的影響了。

 

註1:關於Access Mask,以下為一個簡單的表格供使用時查表,詳細內容則請參考MSDN文件庫 [Access Mask Format]  

權限 值 (Long)
Read 1179785
Write 1179926
Execute 1179808
Full Control 2032127

聲明:引用本文請於開頭註明出處並附上超連結。