最近論壇中很多人都在問,原本的程式到了 Windows Vista 後都會無法使用,深入去問以後才知道這些程式或多或少都會在系統資料中寫入一些資料,以供程式暫存以及後續執行之用,但這個方法在 Windows Vista 中會失效,原因就是 UAC (User Account Control) 造成的。
在 Windows Vista 的執行模型中,應用程式會執行在一個被隔離的執行環境中,而每個執行環境都有一份 Virtual Registry 與系統資訊,所有對 Registry 的讀寫都會寫到 Virtual Registry 中,不過這個 Registry 在應用程式結束後就消失,並不會回寫到系統真正的 Registry 中,也就是如果下次再讀時就讀不到。
Windows Vista 執行程式的流程圖:
來源:http://msdn2.microsoft.com/en-us/library/aa905330.aspx
所以只要有存取到系統等級資訊的程式,都必須要經過 UAC 的授權(也就是使用者的明確授權)後,才可以直接存取系統資料以及 Registry Database,Visual Studio 2005 也就是因為除錯器需要存取系統資訊,所以才要用以系統管理員權限執行的方式來開啟,否則除錯器就會失效。
那有沒有自動授權的方法?有(請參考 Reference),不過蠻麻煩的,例如建立憑證或是要求存取權等,不過如果程式改起來有困難的話,最好還是教育使用者 ...
Reference: http://msdn2.microsoft.com/en-us/library/bb530410.aspx
編註:Windows Server 2008 上也有 UAC,預設對 Administrator 帳戶是不受影響,Administrator 以外的帳戶就會有影響(感謝 Eric Tsai 的提供)。

