2010-08-30 26 views

Trả lời

72
using System.Security.Principal; 

public static bool IsAdministrator() 
{ 
    WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
    WindowsPrincipal principal = new WindowsPrincipal(identity); 
    return principal.IsInRole(WindowsBuiltInRole.Administrator); 
} 
+4

Chỉ cần lưu ý rằng ở trên sẽ không hoạt động nếu UAC được bật trong Vista hoặc Win7; bạn sẽ cần bật lên một hộp xác nhận UAC và nâng cấp quyền trong trường hợp đó. – MisterZimbu

+0

Điều gì về http://ayende.com/blog/158401/are-you-an-administrator hoặc http://blogs.msdn.com/b/jaredpar/archive/2007/08/01/detecting-if-you -are-an-admin.aspx? Đó là cách tốt hơn? – Kiquenet

+2

không làm việc cho tôi nhận được false FY.I i am admin –

25
return new WindowsPrincipal(WindowsIdentity.GetCurrent()) 
    .IsInRole(WindowsBuiltInRole.Administrator); 
+2

@Nissim: Cực đoan có thể xấu, nhưng chúng tôi cần phải đánh giá theo từng trường hợp cụ thể. –

+32

@Nissm: Cả hai bạn đều trả lời đồng thời, hoặc đủ gần 5 phút sau khi bạn được liệt kê là đã đăng "5 phút trước". Không có lý do gì để bạn tấn công Alex; chúng tôi không ở đây để kiếm tiền, chúng tôi ở đây để giúp đỡ. – Randolpho

+0

Điều gì về http://ayende.com/blog/158401/are-you-an-administrator hoặc http://blogs.msdn.com/b/jaredpar/archive/2007/08/01/detecting-if-you -are-an-admin.aspx? Đó là cách tốt hơn? – Kiquenet

2

Chỉ cần nghĩ rằng tôi muốn thêm một giải pháp khác; vì IsInRole không phải lúc nào cũng hoạt động.

  • Nếu người dùng không phải là thành viên của Nhóm người dùng Windows được chỉ định trong phiên hiện tại.
  • Quản trị viên đã thực hiện thay đổi trong Cài đặt chính sách nhóm
  • Thông số vai trò được coi là phương pháp 'Phân biệt chữ hoa chữ thường'.
  • Và nếu máy XP không cài đặt Phiên bản .NET Framework thì nó sẽ không hoạt động.

Tùy thuộc vào nhu cầu của bạn nếu bạn cần hỗ trợ các hệ thống cũ hơn; hoặc không chắc chắn về cách khách hàng của bạn đang quản lý hệ thống của bạn. Đây là một giải pháp tôi đã thực hiện; cho sự linh hoạt và thay đổi.

class Elevated_Rights 
    { 

     // Token Bool: 
     private bool _level = false; 

     #region Constructor: 

     protected Elevated_Rights() 
     { 

      // Invoke Method On Creation: 
      Elevate(); 

     } 

     #endregion 

     public void Elevate() 
     { 

      // Get Identity: 
      WindowsIdentity user = WindowsIdentity.GetCurrent(); 

      // Set Principal 
      WindowsPrincipal role = new WindowsPrincipal(user); 

      #region Test Operating System for UAC: 

      if (Environment.OSVersion.Platform != PlatformID.Win32NT || Environment.OSVersion.Version.Major < 6) 
      { 

       // False: 
       _level = false; 

       // Todo: Exception/ Exception Log 

      } 

      #endregion 

      else 
      { 

       #region Test Identity Not Null: 

       if (user == null) 
       { 

        // False: 
        _level = false; 

        // Todo: "Exception Log/Exception" 

       } 

       #endregion 

       else 
       { 

        #region Ensure Security Role: 

        if (!(role.IsInRole(WindowsBuiltInRole.Administrator))) 
        { 

         // False: 
         _level = false; 

         // Todo: "Exception Log/Exception" 

        } 

        else 
        { 

         // True: 
         _level = true; 

        } 

        #endregion 


       } // Nested Else 'Close' 

      } // Initial Else 'Close' 

     } // End of Class. 

Vì vậy, mã trên có một vài cấu trúc; nó sẽ thực sự kiểm tra xem Người dùng có đang ở trên Vista hay cao hơn không. Bằng cách đó, nếu một khách hàng đang sử dụng XP mà không có khung công tác khung hoặc beta từ nhiều năm trước, nó sẽ cho phép bạn thay đổi những gì bạn muốn làm.

Sau đó, nó sẽ kiểm tra về mặt thể chất để tránh giá trị null cho tài khoản.

Sau đó, cuối cùng, tất cả sẽ cung cấp séc để xác minh rằng người dùng thực sự có vai trò phù hợp.

Tôi biết câu hỏi đã được trả lời; nhưng tôi nghĩ giải pháp của tôi sẽ là một bổ sung tuyệt vời cho trang cho bất kỳ ai khác đang tìm kiếm Stack. Lý do của tôi đằng sau Trình xây dựng được bảo vệ sẽ cho phép bạn sử dụng lớp này như là một lớp có nguồn gốc mà bạn có thể kiểm soát trạng thái khi lớp được khởi tạo.

+0

Điều gì về http://ayende.com/blog/158401/are-you-an-administrator hoặc http://blogs.msdn.com/b/jaredpar/archive/2007 /08/01/detecting-if-you-are-an-admin.aspx? Đó là cách tốt hơn? – Kiquenet

5

Bạn cũng có thể gọi vào API Windows để làm điều này:

[DllImport("shell32.dll", SetLastError=true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool IsUserAnAdmin(); 

mà quát hơn cho bạn biết người dùng đang chạy dưới quyền cao.

0

tôi phải chắc chắn rằng người dùng chạy chúng là một quản trị viên

Nếu ứng dụng của bạn phải được chạy với quyền quản trị, nó sẽ là quyền cập nhật biểu hiện của nó.
Đặt requestedExecutionlevel đến requireAdminstrator.

1

Các câu trả lời ở trên với IsInRole thực sự chính xác: nó kiểm tra xem người dùng hiện tại có đặc quyền quản trị hay không. Tuy nhiên,

Bắt đầu với Windows Vista, Kiểm soát tài khoản người dùng (UAC) xác định đặc quyền của người dùng.Nếu bạn là thành viên của nhóm Quản trị viên tích hợp, bạn được chỉ định hai mã thông báo truy cập thời gian chạy: mã thông báo truy cập người dùng chuẩn và mã thông báo truy cập quản trị viên. Theo mặc định, bạn đang ở trong vai trò người dùng chuẩn.

(từ MSDN, ví dụ https://msdn.microsoft.com/en-us/library/system.diagnostics.eventlogpermission(v=vs.110).aspx)

Như vậy, IsInRole chí mỗi mặc định xem xét các đặc quyền của người dùng, và do đó phương pháp này trả về false. Chỉ đúng khi phần mềm được chạy một cách rõ ràng với tư cách là quản trị viên.

Phương pháp kiểm tra AD khác trong https://ayende.com/blog/158401/are-you-an-administrator sẽ kiểm tra xem tên người dùng có nằm trong nhóm quản trị hay không.

phương pháp hoàn chỉnh của tôi kết hợp cả hai là như sau:

public static bool IsCurrentUserAdmin(bool checkCurrentRole = true) 
    { 
     bool isElevated = false; 

     using (WindowsIdentity identity = WindowsIdentity.GetCurrent()) 
     { 
      if (checkCurrentRole) 
      { 
       // Even if the user is defined in the Admin group, UAC defines 2 roles: one user and one admin. 
       // IsInRole consider the current default role as user, thus will return false! 
       // Will consider the admin role only if the app is explicitly run as admin! 
       WindowsPrincipal principal = new WindowsPrincipal(identity); 
       isElevated = principal.IsInRole(WindowsBuiltInRole.Administrator); 
      } 
      else 
      { 
       // read all roles for the current identity name, asking ActiveDirectory 
       isElevated = IsAdministratorNoCache(identity.Name); 
      } 
     } 

     return isElevated; 
    } 

    /// <summary> 
    /// Determines whether the specified user is an administrator. 
    /// </summary> 
    /// <param name="username">The user name.</param> 
    /// <returns> 
    /// <c>true</c> if the specified user is an administrator; otherwise, <c>false</c>. 
    /// </returns> 
    /// <seealso href="https://ayende.com/blog/158401/are-you-an-administrator"/> 
    private static bool IsAdministratorNoCache(string username) 
    { 
     PrincipalContext ctx; 
     try 
     { 
      Domain.GetComputerDomain(); 
      try 
      { 
       ctx = new PrincipalContext(ContextType.Domain); 
      } 
      catch (PrincipalServerDownException) 
      { 
       // can't access domain, check local machine instead 
       ctx = new PrincipalContext(ContextType.Machine); 
      } 
     } 
     catch (ActiveDirectoryObjectNotFoundException) 
     { 
      // not in a domain 
      ctx = new PrincipalContext(ContextType.Machine); 
     } 
     var up = UserPrincipal.FindByIdentity(ctx, username); 
     if (up != null) 
     { 
      PrincipalSearchResult<Principal> authGroups = up.GetAuthorizationGroups(); 
      return authGroups.Any(principal => 
            principal.Sid.IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid) || 
            principal.Sid.IsWellKnown(WellKnownSidType.AccountDomainAdminsSid) || 
            principal.Sid.IsWellKnown(WellKnownSidType.AccountAdministratorSid) || 
            principal.Sid.IsWellKnown(WellKnownSidType.AccountEnterpriseAdminsSid)); 
     } 
     return false; 
    } 

Đối với một người dùng trong một nhóm quản trị không đặc quyền cao (UAC được kích hoạt), phương pháp này IsCurrentUserAdmin() trả checkCurrentRole: đúng nếu checkCurrentRole == false, nhưng sai nếu checkCurrentRole == true

Nếu bạn chạy mã REQUIRES đặc quyền quản trị, hãy xem xét checkCurrentRole == true. Nếu không, bạn sẽ nhận được một ngoại lệ bảo mật sau đó. Do đó, chính xác IsInRole logic.

Các vấn đề liên quan