2011-09-26 334 views
1

如何檢查我的應用程序是以管理員權限開始的?我現在使用此代碼:如何檢查管理員權限C#

public static bool IsUserAdministrator() 
     { 
      //bool value to hold our return value 
      bool isAdmin; 
      try 
      { 
       //get the currently logged in user 
       WindowsIdentity user = WindowsIdentity.GetCurrent(); 
       WindowsPrincipal principal = new WindowsPrincipal(user); 
       isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator); 
      } 
      catch (UnauthorizedAccessException ex) 
      { 
       isAdmin = false; 
      } 
      catch (Exception ex) 
      { 
       isAdmin = false; 
      } 
      return isAdmin; 
     } 

此代碼檢查用戶權限,我需要檢查應用程序擁有的權限。例如,我不是管理員,但是當應用程序以管理員權限開頭時,此代碼返回false。謝謝!

+3

可能重複的[我如何知道我的進程是否以管理員身份運行?](http://stackoverflow.com/questions/509292/how-can-i-tell-if-my-process-is-running -as-administrator) – msarchet

+0

看不到'UnauthorizedAccessException'的原因等於'Exception' – WhileTrueSleep

回答

2

這是執行檢查的正確方法,我在我的PowerShell配置文件中自己使用它來區分高架會話。

我懷疑你沒有考慮到用戶訪問控制(UAC)的影響。當用戶登錄時,他們將獲得一個分配的安全令牌對象。這包含它們自己的安全ID(SID),它們所屬的組的SID以及它們擁有的權限列表(以及是否啓用了這些權限)。

在啓用UAC的情況下,如果您具有某些特權或是本地管理員的成員,則會獲得兩個*令牌:一個包含所有內容,另一個包含管理訪問權限SID和特權已刪除。前一個令牌用於每個已啓動的進程,除非在使用後一個令牌時啓動提升。

因此,管理員無法在沒有額外步驟的情況下行使其全部功能 - 這有助於防止在完全控制系統時啓動惡意軟件。

查看此操作的最佳工具是Process Explorer。進程屬性對話框的安全選項卡顯示進程安全令牌的內容(並且向主顯示添加「完整性級別」列將顯示哪些進程被提升) - 運行Process Explorer以查看完整信息。

因此,您的代碼只會返回由管理員運行的進程返回true,該進程也會提升(以管理員身份運行)。