2012-04-06 42 views
10

Trong ứng dụng C# của tôi, tôi cần kiểm tra xem người dùng hiện tại có phải là thành viên của nhóm Quản trị viên hay không. Nó cần phải được tương thích với cả Windows XP và Windows 7.Cách xác định xem người dùng có phải là Quản trị viên, ngay cả khi không nâng cao

Hiện nay, tôi đang sử dụng đoạn mã sau:

bool IsAdministrator 
{ 
    get 
    { 
     WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
     WindowsPrincipal principal = new WindowsPrincipal(identity); 

     return principal.IsInRole(WindowsBuiltInRole.Administrator); 
    } 
} 

Vấn đề là phương pháp này trả về false nếu ứng dụng được chạy trên Windows 7 với UAC được bật với tư cách Quản trị viên không nâng cao. Làm cách nào để xác định xem người dùng có phải là Quản trị viên ngay cả khi ứng dụng được chạy với tư cách Quản trị viên không nâng cao không?

+3

Tại sao bạn muốn biết điều đó? – svick

+4

Vâng, đối với một, biết nếu bạn là một quản trị viên cho phép bạn biết nếu bạn * có thể * được nâng lên. – aboveyou00

+0

@svick: Tôi cần hiển thị các phần tử giao diện người dùng nhất định nếu người dùng là thành viên của nhóm Quản trị viên. – markyd13

Trả lời

17

Có một API Win32 GetTokenInformation có thể được sử dụng để kiểm tra mã thông báo hiện tại. Nếu mã thông báo trả lại là mã thông báo tách, có thể là người dùng quản trị đang chạy chế độ không nâng cao.

GetTokenInformation có một tham số đầu ra tokenInformation mà mất một trong ba giá trị:

  • TokenElevationTypeDefault = 1
  • TokenElevationTypeFull = 2
  • TokenElevationTypeLimited = 3

Một giá trị của TokenElevantionTypeLimited chỉ ra rằng người dùng đang chạy với mã thông báo bị phân tách có các đặc quyền hạn chế. Khi tăng giá trị TokenElevationTypeFull được trả về. Người dùng không phải quản trị viên có giá trị là TokenElevationTypeDefault.

Có một ví dụ mã hoàn chỉnh cho C# ở http://www.davidmoore.info/2011/06/20/how-to-check-if-the-current-user-is-an-administrator-even-if-uac-is-on/

+0

Cảm ơn, đây chính xác là những gì tôi đang tìm kiếm. – markyd13

-4

Nếu bạn là một nhà quản lý, bạn có thể tạm thời vô hiệu hóa UAC từ mã sau đó kích hoạt lại nó. Chìa khóa registry là

chính: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ System Value: EnableLUA Set to: 0 để vô hiệu hóa, 1 để cho phép

Vì vậy, bạn có thể làm một cái gì đó giống như

RegistryKey myKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\Policies\\System", true); 
myKey.SetValue("EnableLUA", "1", RegistryValueKind.String); 

Sau đó kiểm tra hiệu trưởng của bạn .. Đó là một loại hack, nhưng nó đáng để bắn.

+0

bạn có nghĩa là để cố gắng vô hiệu hóa và nếu nó không bạn không? – NSGaga

+0

Chính xác ... Chỉ cần một ý nghĩ ... khá hacky mặc dù .. –

+4

Vô hiệu hóa một thiết lập bảo mật hệ thống rộng chỉ để thực hiện kiểm tra không chỉ là "loại hack". Thật kinh khủng. Đừng làm thế. –

0

Tôi biết điều này là cũ nhưng tôi đã tìm thấy cách dưới đây để hoạt động tốt trên tất cả các hệ thống. Tôi cần nó để làm việc trên .net 2 và các giải pháp khác như WinAPI và các đối tượng quản lý thất bại trên các phiên bản nhất định của Windows:

Khởi chạy một quy trình mới chạy lệnh net localgroup administrators và phân tích đầu ra một cách thích hợp. Điều này làm việc với cả UAC được kích hoạt và vô hiệu hóa và không cần một quá trình nâng cao.

+0

chỉ hoạt động đối với quản trị viên cục bộ – Tar

1

Đối với mọi người VB.NET (tôi biết bạn đang ở ngoài đó ...), đây là phiên bản mà tôi đã pha chế từ nhiều nguồn khác nhau và tôi nghĩ, được tối ưu hóa để xác định xem người dùng hiện tại (bao gồm nâng cao) có trong nhóm Quản trị viên được xác định, máy hoặc miền, có hoặc không có UAC được bật. (Rất nhiều tín dụng cho các bài đăng khác ở đây và ở nơi khác cho bài đăng này!Thứ nhất, nó sử dụng một Boolean không có khả năng giữ nguyên trạng thái Administrator vì, mặc dù kiểm tra cơ bản nhanh chóng, kiểm tra đầy đủ có thể mất hàng chục giây, vì vậy bạn chỉ muốn thực hiện nó một lần - nếu ở tất cả nếu bạn có thể giúp nó.

Thứ hai, nó sai ở phía bên của kiểm tra cơ bản là không chính xác/sai, thường là trường hợp nếu người dùng là AD-quản lý hoặc nếu máy địa phương đã bật UAC. Vì vậy, nếu số điện thoại có thể quyết định người dùng là Quản trị viên, thì sẽ.

Thứ ba, bạn có thể thêm hoặc xóa tiêu chí khỏi AuthorizationGroups như bạn thấy phù hợp nhưng những thứ bao gồm hầu hết các trường hợp.

Cuối cùng, nếu xảy ra sự cố, bạn sẽ nhận được False; nếu bạn muốn một lỗi, bạn có thể có một, nhưng cá nhân tôi không thấy điểm.

Function IsAdministrator() As Boolean 

    Static bResult As Boolean? = Nothing 
    Try 
     If bResult Is Nothing Then 
      bResult = New WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator) 
      If Not bResult Then 
       Dim oContext As PrincipalContext = Nothing 
       Try 'to get a domain context first ... 
        Domain.GetComputerDomain() 
        oContext = New PrincipalContext(ContextType.Domain) 
       Catch 
        '... if it fails, fall through to a machine context 
       End Try 
       If oContext Is Nothing Then oContext = New PrincipalContext(ContextType.Machine) 
       Dim oPrincipal As UserPrincipal = UserPrincipal.FindByIdentity(oContext, WindowsIdentity.GetCurrent().Name) 
       If oPrincipal IsNot Nothing Then 
        bResult = oPrincipal.GetAuthorizationGroups().Any(Function(p) _ 
         p.Sid.IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid) OrElse 
         p.Sid.IsWellKnown(WellKnownSidType.AccountDomainAdminsSid) OrElse 
         p.Sid.IsWellKnown(WellKnownSidType.AccountAdministratorSid) OrElse 
         p.Sid.IsWellKnown(WellKnownSidType.AccountEnterpriseAdminsSid)) 
       End If 
      End If 
     End If 
    Catch 
     bResult = False 
    End Try 
    Return bResult.GetValueOrDefault(False) 
End Function 
Các vấn đề liên quan