程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> .NET中提升UAC權限的方法總結

.NET中提升UAC權限的方法總結

編輯:C#入門知識

【題外話】

從Vista開始,由於增加了UAC(用戶賬戶控制,User Account Control)功能,使得管理員用戶平時不再擁有能控制所有功能的管理員權限了,所以在調用很多比較重要的功能時需要提升權限來實現。有時候寫的程序需要調用這種權限,那麼大概就是分為運行前就提升以及運行後再提升兩種,在這裡整理如下。

 

【文章索引】

 

【一、程序運行前提升權限】

如果整個程序都需要使用管理員權限的話(甚至主界面上顯示的內容都需要管理員權限才行),那麼可以讓程序一運行時就提升管理員權限,就如同大部分的安裝程序一樣。程序運行時提高權限通常采用設置manifest文件的方式,可以在項目中添加“應用程序清單文件”,添加完成後會生成如下圖所示的一個文件。除此之外,也可以通過選擇項目屬性,然後進入“安全性”選項卡,然後選擇“啟用 ClickOnce 安全設置”後也會在項目的“Properties”目錄下生成app.manifest文件。

Value

Description

Comment

asInvoker

The application runs with the same access token as the parent process.

Recommended for standard user applications. Do refractoring with internal elevation points, as per the guidance provided earlier in this document.

highestAvailable

The application runs with the highest privileges the current user can obtain.

Recommended for mixed-mode applications. Plan to refractor the application in a future release.

requireAdministrator

The application runs only for administrators and requires that the application be launched with the full access token of an administrator.

Recommended for administrator only applications. Internal elevation points are not needed. The application is already running elevated.

區別即是,highestAvailable按當前賬號能獲取到的權限執行,而requireAdministrator則是以具有完整權限的管理員運行。如果當前賬戶是管理員賬戶的話,那麼兩者都是可以的通過提升權限來獲取到管理員權限的;而如果當前賬戶是Guest的話,那麼highestAvailable則放棄提升權限而直接運行,而requireAdministrator則允許輸入其他管理員賬戶的密碼來提升權限。

當然,運行其他程序也是一樣的。

除此之外,我們可能還需要在這個按鈕或菜單上繪制UAC盾牌的圖標,其實系統已經提供了這樣的方法。

 [DllImport(, CharSet = CharSet.Auto, SetLastError =      SendMessage(IntPtr hWnd, UInt32 Msg,  
   UInt32 BCM_SETSHIELD = ;

調用的時候只要將按鈕的FlatStyle設置為System,然後采用如下的代碼就可以了,最後一項如果設為0的話則會取消顯示UAC的盾牌圖標。

 SendMessage(button1.Handle, BCM_SETSHIELD, , (IntPtr));

不過如果要往菜單上或者WPF的Button上繪制UAC盾牌的圖標就沒法這樣去做了,不過好在我們還可以獲取到系統圖標,不嫌棄的話可以用.NET自帶的System.Drawing.SystemIcons.Shield,其實好多軟件用的就是這個圖標,原圖如下(32×32):

然後如下調用就可以將UAC盾牌的圖標設置到菜單上了:

 SHSTOCKICONINFO iconInfo =  iconInfo.cbSize = SHGetStockIconInfo(SHSTOCKICONID.SIID_SHIELD, SHGSI.SHGSI_ICON | SHGSI.SHGSI_SMALLICON,  Icon icon = 
 menu.Image = icon.ToBitmap();

圖中menu1是使用的System.Drawing.SystemIcons.Shield,menu2使用的通過shell32.dll獲取到的圖標,button1是使用的SendMessage直接顯示的UAC的圖標。

 

【三、程序中判斷當前權限】

如果要判斷當前是否以管理員身份運行,只需引用“System.Security.Principal”這個命名空間,然後就可以通過如下的代碼獲取當前是否以管理員在運行。

 WindowsIdentity identity = WindowsPrincipal principal =  Boolean isRunasAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);

除了獲取當前是否是以管理員運行,還可以通過DllImport的方式獲取到當前用戶是否是管理員用戶以及當前進程是否提升了權限(僅限Vista及以上的版本)等等,詳情可以見相關鏈接2中的代碼。

 

【相關鏈接】

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved