2009-02-03 34 views
31

Tôi muốn hiển thị một số phần tử giao diện người dùng bổ sung khi quá trình đang được chạy với tư cách Quản trị viên so với khi không, tương tự như cách Visual Studio 2008 hiển thị 'Quản trị viên' trong thanh tiêu đề khi chạy dưới dạng quản trị viên. Làm thế nào tôi có thể nói?Làm cách nào để biết liệu quy trình của tôi có đang chạy với tư cách Quản trị viên không?

+0

trả lời cho điều này là như nhau: http://stackoverflow.com/questions/95912/how-can-i-detect-if-my-process-is-running-uac-elevated-or- không phải – DSO

+0

Ngoài ra, hãy xem http://www.blackwasp.co.uk/CheckAdmin.aspx –

Trả lời

33

Về mặt kỹ thuật, nếu bạn muốn xem các thành viên là các địa phương quản trị tài khoản, sau đó bạn có thể nhận được security identifier (SID) của người sử dụng dòng điện qua User property trên WindowsIdentity class, như vậy (các tĩnh GetCurrent method được người dùng Windows hiện tại):

WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent(); 

string sid = windowsIdentity.User.ToString(); 

Thuộc tính User trả về SID của người dùng has a number of predefined values for various groups and users.

Sau đó, bạn sẽ kiểm tra để xem nếu the SID has the following pattern, indicating it is the local administrator account (which is a well-known SID):

S-1-5- {phần SID khác} -500

Hoặc, nếu bạn không muốn để phân tích chuỗi, bạn có thể sử dụng lớp SecurityIdentifier:

// Get the built-in administrator account. 
var sid = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, 
    null); 

// Compare to the current user. 
bool isBuiltInAdmin = (windowsIdentity.User == sid); 

Howeve r, tôi nghi ngờ rằng những gì bạn thực sự muốn biết là nếu người dùng hiện tại là thành viên của quản trị viên nhóm cho máy địa phương. Bạn có thể nhận SID này bằng cách sử dụng WellKnownSidType của BuiltinAdministratorsSid:

// Get the SID of the admin group on the local machine. 
var localAdminGroupSid = new SecurityIdentifier(
    WellKnownSidType.BuiltinAdministratorsSid, null); 

Sau đó, bạn có thể kiểm tra Groups property trên WindowsIdentity của người sử dụng để xem nếu người dùng đó là một thành viên của nhóm quản trị cục bộ, như vậy:

bool isLocalAdmin = windowsIdentity.Groups. 
    Select(g => (SecurityIdentifier) g.Translate(typeof(SecurityIdentifier))). 
    Any(s => s == localAdminGroupSid); 
+2

Điều này có kiểm tra xem người dùng hiện tại có phải là quản trị viên hay quy trình đang chạy với tư cách là quản trị viên không?Người dùng không phải là quản trị viên vẫn có thể chạy một quy trình với tư cách quản trị viên bằng cách nhấp chuột phải vào quá trình và chọn "Chạy với tư cách quản trị viên". –

+1

@JanTacci Nếu người dùng nhấp chuột phải và chọn chạy với tư cách là quản trị viên, thì quá trình này sẽ chạy với tư cách người dùng trong nhóm quản trị viên được chọn từ hộp thoại UAC được hiển thị, quá trình này không chạy dưới người dùng đã đăng nhập tại điểm đó . – casperOne

+2

là quản trị viên và chạy ứng dụng với tư cách quản trị viên là hai điều khác nhau. Ngay cả khi tôi là quản trị viên, tôi vẫn có thể chạy ứng dụng mà không có đặc quyền, trong trường hợp của tôi, nó gây ra sự cố cho tôi. –

19

Tôi nghĩ đây là một cơ chế đơn giản.

using System.Security.Principal; 

WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
WindowsPrincipal principal = new WindowsPrincipal(identity); 
bool isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator); 
0

Tôi cảm thấy điều quan trọng cần lưu ý là tôi đã gặp khó khăn khi cố gắng sử dụng câu trả lời của WellpernSidType.BuiltinAdministratorsSid cho mỗi casperOne ở trên. Theo số WellKnownSiDType MSDN, BuiltinAdministratorsSid "Chỉ ra SID khớp với tài khoản quản trị viên." Vì vậy, tôi mong đợi mã của casperOne hoạt động, và đoán nó có thể xảy ra trong một số môi trường. Thật không may, nó không có trên Windows 2003 của tôi với .NET 2.0 (mã kế thừa). Nó thực sự trả về S-1-5-32-544, theo this article là sid cho nhóm quản trị nhóm. Do đó, sự so sánh thất bại đối với tôi. Tôi sẽ phải thực hiện so sánh chuỗi của riêng tôi để bắt đầu với "S-1-5-21" (kb 243330 cho biết "21" được bao gồm mặc dù blog được tham chiếu ở trên không) và kết thúc bằng "500".

2

Đây là một lớp lót để thực hiện.

using System.Security.Principal; 

static bool IsElevated => new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator); 
Các vấn đề liên quan