2012年12月13日 星期四

如何讓你的程式(exe)跟UAC(使用者帳戶控制 ) 好好相處?


前言
UAC(使用者帳戶控制 )是微軟在Windows Vista以後的作業系統中,所加入的一個安全性元件,主要目的是避免使用者在操作系統時,不小心執行到惡意程式而被植入木馬或病毒。

但是,連帶的,程式設計師若為產品或某正當目的撰寫的小程式,也可能因為UAC的關係而無法正常執行,特別是在這些小程式會對作業系統中的檔案或權限等資源進行異動時。筆者就曾寫了支要異動檔案內容的程式,因沒考慮到UAC問題,在執行時產生下列Exception:

************** 例外狀況文字 ************** System.UnauthorizedAccessException: 拒絕存取路徑 'E:............TXT'。 於 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 於 System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) 於 System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options) 於 System.IO.StreamWriter.CreateFile(String path, Boolean append) 於 System.IO.StreamWriter..ctor(String path, Boolean append, Encoding
...

作法

這時有主要有三種方式可以解決:
  1. 關了UAC或以Administrator執行程式,
    • 缺點:得自行承擔電腦被惡意程式感染的風險。
  2. Trust ShortcutMicrosoft Application Compatibility Toolkit這類的工具包一下你寫好的程式,
    • 缺點:這類的工具只能在「用戶端」安裝並在「用戶端」設定。換言之,若你是公司的IT,當你寫好支程式要給10個 User用時,你必須先再這10個User的電腦先裝Trust Shortcut這類的程式,再設定允許你寫好的exe不受UAC干擾。當你服務的User越多時,就需付出更多的人力成本。
  3. 程式在執行時,自動跟使用者要求付予作業系統管理者(Administrator)權限,這是本文最建議的方法,實作步驟如下:
  • 使用Visual Studio 2008/2010在你的專案中,「加入」->「新增項目」
  • 在程式語言項目點選「一般」->「應用程式資訊清單檔案」,加入一個「app.manifest」檔案
  • 完成後,打開「app.manifest」檔案,編輯下列文字片段,找到「requestedExecutionLevel」tag,把「level」屬性改成「requireAdministrator」,重新建置後,即可。
<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="requireAdministrator" uiAccess="false" /> </requestedPrivileges> </security> </trustInfo>
總結
UAC雖然增加了些不方便,但也保護你的電腦及資料,降低遭惡意程式破壞的風險,原則上算是微軟良心之作,只要程式設計師在編程時,多注意點資訊安全問題,必可好好地跟它相處~

Reference
Windows 8 使用者帳戶控制 (UAC) 深入研究與專家密技分享
讓MDIE通過Windows 7的UAC默許,不再擾人
如何關閉VISTA中擾人的『使用者控制(UAC) 』
Getting the admin rights in C#
[MFC] 設定執行權限(UAC Execution Level)
Windows 7 安全小技巧:保持UAC開啟但不讓它跳出煩人訊息

沒有留言:

張貼留言