Ứng dụng của tôi cần chạy một số tập lệnh và tôi phải chắc chắn rằng người dùng đang chạy chúng là quản trị viên ... Cách tốt nhất để thực hiện việc này bằng C# là gì?Kiểm tra xem người dùng hiện tại có phải là quản trị viên
Trả lời
using System.Security.Principal;
public static bool IsAdministrator()
{
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
return new WindowsPrincipal(WindowsIdentity.GetCurrent())
.IsInRole(WindowsBuiltInRole.Administrator);
@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ể. –
@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
Đ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
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.
Đ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
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.
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
.
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.
- 1. Phát hiện xem người dùng có phải là quản trị viên
- 2. 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
- 3. Kiểm tra xem người dùng mysql có tồn tại
- 4. Trong .NET, hãy kiểm tra xem người dùng hiện tại có thể ghi vào thư mục
- 5. Cách viết truy vấn LDAP để kiểm tra xem người dùng có phải là thành viên của nhóm không?
- 6. Loại trừ một trường trong quản trị django cho người dùng không phải là quản trị viên cấp cao
- 7. Kiểm tra xem địa chỉ email paypal có phải là người dùng đã xác minh không
- 8. Kiểm tra xem người dùng có ở trong nhóm
- 9. Tôi có thể sử dụng người dùng hiện tại làm quản trị viên Django khi bật quản trị viên lần đầu tiên không?
- 10. Kiểm tra xem đây có phải là
- 11. Kiểm tra xem người dùng đã tồn tại trong drupal
- 12. Cho phép quản trị viên thêm người dùng với Devise
- 13. Kiểm tra xem người dùng có được đăng xuất không theo quy định
- 14. Magento - Kiểm tra xem Quản trị viên và Khách hàng có đăng nhập
- 15. Cách kiểm tra xem quy trình có quyền quản trị
- 16. Cách buộc người dùng vào tài khoản Quản trị viên người dùng trong WinForms
- 17. Kiểm tra xem chủ đề hiện tại có phải là chủ đề chính
- 18. Kiểm tra xem người dùng cụ thể có vai trò
- 19. Gói Wix Burn - Phải là Quản trị viên
- 20. Quản trị viên Google Apps có thể quản lý tệp người dùng bằng SDK Drive không?
- 21. Mở rộng hồ sơ người dùng ở Django. Quản trị viên tạo người dùng
- 22. Kiểm tra xem một chuỗi có phải là số
- 23. Hệ thống xác thực người dùng/quản trị viên riêng tại Django
- 24. Kiểm tra quyền quản trị viên trong tập lệnh PowerShell?
- 25. Làm thế nào để kiểm tra xem người dùng có đặc quyền quản trị cục bộ trong win32
- 26. Kiểm tra xem char có phải là một dòng mới
- 27. Kiểm tra xem tab hiện tại có trống trong vim
- 28. Kiểm tra xem biến có phải là ngày có Twig
- 29. Cách kiểm tra xem tệp có phải là hình ảnh
- 30. Chức năng kiểm tra xem chuỗi có phải là ngày
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
Đ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
không làm việc cho tôi nhận được false FY.I i am admin –