Manifest與Vista下的安全性設定

撰文:吳俊毅
時間:2009/1/3
本篇文章使用Visual Studio 2008 Team System

本文主要探討關於Vista新增的UAC安全性設定,以及如何使用manifest設定檔案使程式具備管理者權限,這個部分牽涉範圍很廣,首先什麼叫做UAC呢,UAC是(User Access Control)的簡稱,意思是”使用者帳戶控制”,在Vista下預設也使用須具備管理者權限才可以執行的相關操作都會跳出一個如下確認的小視窗:


若點選繼續,程式才會繼續執行,否則取消程式的執行,這通常是在Vista下已預設一些動作是需要管理者權限才可以進行的一些動作,即使您已經是以Administrator權限登入,在執行系統管理工具,修改Windows或是Program Files下的檔案,或修改登錄檔,啟動與停止系統服務等等,都會跳出如上的確認對話框,即使您只是要執行諸如mmc.exe或regedit.exe等相關程式也是一樣。

也就是說在Vista下面沒有一個應用程式是具備管理者權限執行的,即使是Windows的殼層,就是俗稱的Shell,也就是Explorer.exe也不具備管理者權限,這樣許多使用者會覺得過於繁瑣,不過筆者倒是認為這是一種極佳的保護機制,如果由一個依附在Explorer.exe執行的病毒一樣會繼承Explorer的權限,甚至只是一個Process當中的Thread要進行一些需授權的動作,均會跳出這個視窗,如果使用者認為現在並未執行這個動作可按下取消便限制病毒不當的一些作業。

OK!太多的UAC細節我想另闢章結來討論好了,本文的重點是,既然Vista下執行的應用程式預設都不具備管理者權限,那如果我們開發的.NET應用程式有些動作是必須以管理者權限執行的,而在User端執行總不能說要User你用滑鼠右鍵自己點選管理者權限執行該程式,或是關閉UAC!那更不妥當,怎麼辦呢,我們的應用程式就是需要以管理者權限執行阿。沒關係,有辦法,讀者在執行一些應用程式時應該有看過這一類的確認視窗:

這個對話框表示這個應用程式需要您的授權成為管理者權限來執行,但如何做呢?在Vista下可對應用程式加上一個manifest檔案告訴Vista,此程式執行須以管理者權限來執行。

作法可以在Visual Studio 2008 IDE中的執行檔的專案中進行這個操作,筆者就先使用先前建立的InkCavansDemo的WPF專案來DEMO一下,首先在專案總管按滑鼠右鍵點選 加入a新增項目 然後點選 “應用程式資訊清單檔案” 如下圖:


加入後在方案總管中也會看見一個app.manifest檔案,如下圖:
影像 4

初次建立的manifest檔案內容如下:

<?xml version="1.0" encoding="utf-8"?>

<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">

<security>

<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">

<!-- UAC 資訊清單選項

如果要變更 Windows 使用者帳戶控制層級,請將

requestedExecutionLevel 節點以下列其中之一取代。

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

如果您要針對回溯相容性使用檔案及登錄虛擬化,

請刪除 requestedExecutionLevel 節點。

-->

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

</requestedPrivileges>

</security>

</trustInfo>

</asmv1:assembly>

在提示的註解裡已經有說明如果要變更Windows使用者帳戶控制層級請將requestedExecutionLevel結點以下列其中之一取代,所謂的requestedExecutionLevel共三個level

asInvoker: 會繼承登入者權限,這個層級通常是不被信任的。
highestAvailable: 除了會繼承登入者權限之外要求可以使用父處理序到最高使用權限。
requireAdministrator: 表示需要管理者權限。


而uiAccess表示應用程式是否會使用Vista下一些受UAC保護的UI設定或是其它的IO存取項目,true表示會使用,false表示不會使用,而通常是具簽章的應用程式會使用true值,而且簽章必須安裝在用戶端。
因為通常預設值是使用asInvoker,所以我們現在要來修改一下這個manifest設定檔,將原先的asInvoker整行拿掉,只保留註解的requireAdministrator部分,整個manifest設定檔修改後如下:

<?xml version="1.0" encoding="utf-8"?>

<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">

<security>

<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

</requestedPrivileges>

</security>

</trustInfo>

</asmv1:assembly>



至於assemblyIdentity的name屬性為應用程式名稱,可改可不改都可以,因為待會重新編譯的時候這個manifest會寫到這個Assembly組件中的Resource裡,現在我們可以來從新編譯一下這個程式,這時讀者可能又會收到一個訊息,如果您使用Vista作業系統的話:


哈,因為這個編譯manifest動作Visual Studio 需要以管理者權限來執行啦!請選使用不同認證重新啟動Visual Studio 會重啟並自動開啟剛才的專案,接著再重新編譯就可以了。

以這總方式重新編譯的應用程式Vista會認的出Resource裡的manifest,如果讀者注意看的話會發現ICON多了一個小盾牌的標誌,如下:


這時再執行程式應該就會出現類似下面的確認視窗:


有些讀者可能會說,每次要修改manifest都要開Visual Studio會不會太麻煩了,有沒有什麼方法透過命令列工具來完成呢,其實,是有的,在SDK工具中有提供一個manifest tool工具程式(mt.exe),當您安裝好Visual Studio 2008時連同SDK工具都會安裝起來。

當您要執行mt.exe時同樣要準備好manifest檔案,並使用系統管理員身分來執行 Visual Studio 2008 命令題示字元,切換到專案的bin\debug目錄下執行如下命令:(以本例子的Assembly檔案是InkCavansDemo.exe)
mt -manifest InkCavansDemo.exe.manifest -outputresource:InkCavansDemo.exe

執行的狀況可參考下圖:


若沒有任何錯誤訊息則表示執行成功,這時再切換到檔案總管的畫面一樣可看見執行檔案ICON也一樣多出一個小盾牌的圖示。

OK到這裡讀者應該大致了解到manifest除了描述應用程式組件相關資訊外在Vista下同樣也是使用它來描述安全性的資訊,此外當使用ClickOnce佈署也會用到manifest,這部分留給下一次筆者介紹ClickOnce佈署時的時候再向各位介紹有關manifest與ClickOnce佈署!呵呵~

本文先介紹到此,能夠看到這裡筆者也要感謝您的彭場啦,也希望有時間可以寫更多的東西!

註:若您沒有Visual Studio 2008您也可以只安裝Microsoft Windows SDK v6.0一樣可以使用mt.exe這個工具 (在.NET 3.0已不稱做Framework SDK這樣的字眼)。

留言

  1. 不知道Windows 7是不是也這麼複雜呢?

    回覆刪除
  2. 哈~~菜鳥的我不曉得怎嚜回應內容ㄝ?

    回覆刪除
  3. 有問題咩~~~~
    怎麼辦呢...

    回覆刪除
  4. SORRY
    謝謝您的愛護與支持
    可能我之前不小心動到了圖片的連結
    我已經修復了
    謝謝您

    回覆刪除

張貼留言

這個網誌中的熱門文章

什麼是 gRPC ?

什麼是 gRPC(二)- 來撰寫第一個 Hello World 吧!

常見的程式碼壞味道(Code Smell or Bad Smell)