在微軟的作業系統中,vista和win7加入了UAC的功能,UAC(User Account Control,使用者帳戶控制)是微軟為提高系統安全而在Windows Vista中引入的新技術,它要求使用者在執行可能會影響計算機運作的操作或執行更改影響其他使用者的設定的操作之前,提供權限或管理者密碼。通過在這些操作啟動前對其進行驗證,UAC 可以幫助防止惡意軟體和間諜軟體在未經許可的情況下在計算機上進行安裝或對計算機進行更改。
如圖中所示,不屬于 Windows 的一部分的程式需要您的許可才能啟動。它具有指明其名稱和發行者的有效的數字簽名,該數字簽名可以幫助確定該程式正是其所聲明的程式。確定該程式正是您要運作的程式。![]()
[C#]解決程式Vista/Win7下因UAC導緻的讀寫錯誤
但是這樣對于我們來說,會有這樣一種情況出現,我們開發的程式預設是沒有給它管理者權限的,如果我們把程式安裝了到系統盤下,那麼某些讀寫程式目錄下配置檔案的操作就無法正确執行,因為被UAC阻攔,但是程式卻無法告訴我們什麼時候被阻攔,因為我們無法擷取到UAC的阻攔資訊。
很遺憾,我們最近開發的程式就出現了這種問題,測試了很多次,一個裝有win7系統的客戶向我們回饋了這個問題,我經過自己思考和搜尋MSDN,想了一下,大概有3種方法解決,給大家分享一下:
1:關閉使用者的UAC功能(顯然這個方法對于客戶來說有點不靠譜,但是這裡我也提一下,因為我就是特别煩UAC的提醒,是以給關閉了,程式一直也沒有報錯)。
關閉方法“控制台-使用者賬戶和家庭安全-使用者賬戶-使用者賬戶控制設定”,設定為“從不通知”,儲存,重新開機就OK了。
2:這個方法很簡單,就是在運作的時候右鍵“以管理者身份運作”。也是可以解決此問題,但是對于那些隻想直接單擊就運作的使用者來說,估計他們也還是難以接受。
3:這個方法就比較長些了,解決出發點也是從我們自己的程式來解決。我來寫一下步驟:
<1>.在項目中“建立項”,選擇“應用程式清單”,自己命名檔案名稱,如下圖所示:
<2>.打開建立的清單檔案,擴充名為.manifest,檢視代碼,如下圖:![]()
[C#]解決程式Vista/Win7下因UAC導緻的讀寫錯誤 ![]()
[C#]解決程式Vista/Win7下因UAC導緻的讀寫錯誤 我們可以看到有注釋說明UAC選項,我們需要更改的是這個節點的内容:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />将asInvoker,更改為requireAdministrator,以字面意思,我們大家就可以看出這個是請求以管理者權限運作的意思。當然還有一個選項,highestAvailable,網上沒有直接翻譯,但從字面了解,就是擷取最高執行權限的意思,這個可以根據自己的實際情況來設定。
<3>.打開項目屬性,将“應用程式-資源”中的“清單”一項選擇為你建立的清單檔案,如圖: