Phát hiện xem đang chạy với tư cách Quản trị viên có hay không có đặc quyền nâng cao?


82

Tôi có một ứng dụng cần phát hiện xem nó có đang chạy với các đặc quyền nâng cao hay không. Tôi hiện có mã được thiết lập như sau:

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

Điều này hoạt động để phát hiện xem người dùng có phải là quản trị viên hay không, nhưng không hoạt động nếu chạy với tư cách quản trị viên mà không nâng cấp. (Ví dụ trong vshost.exe).

Làm cách nào để xác định liệu độ cao [đã có hiệu lực hoặc] có thể thực hiện được hay không?

Câu trả lời:


55

Thử thứ này đi:

using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Security.Principal;

public static class UacHelper
{
    private const string uacRegistryKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";
    private const string uacRegistryValue = "EnableLUA";

    private static uint STANDARD_RIGHTS_READ = 0x00020000;
    private static uint TOKEN_QUERY = 0x0008;
    private static uint TOKEN_READ = (STANDARD_RIGHTS_READ | TOKEN_QUERY);

    [DllImport("advapi32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool OpenProcessToken(IntPtr ProcessHandle, UInt32 DesiredAccess, out IntPtr TokenHandle);

    [DllImport("advapi32.dll", SetLastError = true)]
    public static extern bool GetTokenInformation(IntPtr TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, IntPtr TokenInformation, uint TokenInformationLength, out uint ReturnLength);

    public enum TOKEN_INFORMATION_CLASS
    {
        TokenUser = 1,
        TokenGroups,
        TokenPrivileges,
        TokenOwner,
        TokenPrimaryGroup,
        TokenDefaultDacl,
        TokenSource,
        TokenType,
        TokenImpersonationLevel,
        TokenStatistics,
        TokenRestrictedSids,
        TokenSessionId,
        TokenGroupsAndPrivileges,
        TokenSessionReference,
        TokenSandBoxInert,
        TokenAuditPolicy,
        TokenOrigin,
        TokenElevationType,
        TokenLinkedToken,
        TokenElevation,
        TokenHasRestrictions,
        TokenAccessInformation,
        TokenVirtualizationAllowed,
        TokenVirtualizationEnabled,
        TokenIntegrityLevel,
        TokenUIAccess,
        TokenMandatoryPolicy,
        TokenLogonSid,
        MaxTokenInfoClass
    }

    public enum TOKEN_ELEVATION_TYPE
    {
        TokenElevationTypeDefault = 1,
        TokenElevationTypeFull,
        TokenElevationTypeLimited
    }

    public static bool IsUacEnabled
    {
        get
        {
            RegistryKey uacKey = Registry.LocalMachine.OpenSubKey(uacRegistryKey, false);
            bool result = uacKey.GetValue(uacRegistryValue).Equals(1);
            return result;
        }
    }

    public static bool IsProcessElevated
    {
        get
        {
            if (IsUacEnabled)
            {
                IntPtr tokenHandle;
                if (!OpenProcessToken(Process.GetCurrentProcess().Handle, TOKEN_READ, out tokenHandle))
                {
                    throw new ApplicationException("Could not get process token.  Win32 Error Code: " + Marshal.GetLastWin32Error());
                }

                TOKEN_ELEVATION_TYPE elevationResult = TOKEN_ELEVATION_TYPE.TokenElevationTypeDefault;

                int elevationResultSize = Marshal.SizeOf((int)elevationResult);
                uint returnedSize = 0;
                IntPtr elevationTypePtr = Marshal.AllocHGlobal(elevationResultSize);

                bool success = GetTokenInformation(tokenHandle, TOKEN_INFORMATION_CLASS.TokenElevationType, elevationTypePtr, (uint)elevationResultSize, out returnedSize);
                if (success)
                {
                    elevationResult = (TOKEN_ELEVATION_TYPE)Marshal.ReadInt32(elevationTypePtr);
                    bool isProcessAdmin = elevationResult == TOKEN_ELEVATION_TYPE.TokenElevationTypeFull;
                    return isProcessAdmin;
                }
                else
                {
                    throw new ApplicationException("Unable to determine the current elevation.");
                }
            }
            else
            {
                WindowsIdentity identity = WindowsIdentity.GetCurrent();
                WindowsPrincipal principal = new WindowsPrincipal(identity);
                bool result = principal.IsInRole(WindowsBuiltInRole.Administrator);
                return result;
            }
        }
    }
}

8
Hoạt động nếu tài khoản chạy với tư cách là quản trị viên cục bộ nhưng nếu bạn sử dụng quản trị viên miền, biến isProcessAdmin trả về false. Nhưng UAC chấp nhận Quản trị viên miền là hợp lệ khi nâng cấp đặc quyền (tạo thư mục trong cửa sổ, chạy với tư cách quản trị viên, v.v.) ... Làm cách nào để tôi có thể sửa đổi chức năng của bạn để tính đến trường hợp đó?
VSP

1
Bạn cũng có thể muốn xem xét rằng nếu tài khoản là quản trị viên tích hợp thì UAC được nâng lên theo mặc định vì vậy IsProcessEle nâng sẽ trả về false trong trường hợp này (vì IsUacEnabled là true và elevationResult là TokenElevationTypeDefault) ngay cả khi quá trình chạy với chế độ nâng cao mà không có đã nhắc người dùng. Hay nói cách khác, tài khoản được nâng lên và quá trình chạy ở kiểu độ cao mặc định.
Mister Cook,

2
Mã này yêu cầu các câu lệnh sử dụng sau: using System.Diagnostics; sử dụng System.Runtime.InteropServices; sử dụng System.Security.Principal; Nó dường như cũng được phản chiếu ở đây.
Scott Solmer

Điều này khiến tôi có một ngoại lệ ở Windows 8, Marshal.SizeOf((int)elevationResult)tôi vẫn chưa biết tại sao. Thông báo ngoại lệ là: Không tìm thấy phương pháp. Tại địa chỉ:Int32 System.Runtime.InteropServices.Marshal.SizeOf(!!0).
CularBytes

Còn TokenElevationTypeLimited thì sao? Có nên không coi là đặt isProcessAdmin thành true?
Olivier MATROT

33

(câu trả lời mới sáu năm sau khi câu hỏi được hỏi)

Tuyên bố từ chối trách nhiệm: Đây chỉ là điều gì đó đã xảy ra trên hệ điều hành cụ thể của tôi với các cài đặt cụ thể của tôi với người dùng cụ thể của tôi:

using System.Security.Principal;

// ...

    static bool IsElevated
    {
      get
      {
        return WindowsIdentity.GetCurrent().Owner
          .IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid);
      }
    }

Vì vậy, khi tôi chạy "Chạy với tư cách quản trị viên" này, trình truy cập thuộc tính gettrả về true. Khi chạy bình thường (ngay cả khi người dùng của tôi "là" quản trị viên, chỉ cần không chạy ứng dụng cụ thể này "với tư cách quản trị viên"), nó sẽ trả về false.

Điều này có vẻ đơn giản hơn nhiều so với nhiều câu trả lời khác.

Tôi không biết nếu có trường hợp nào không thành công.

Tái bút! Điều này cũng có vẻ ổn:

    static bool IsElevated
    {
      get
      {
        var id = WindowsIdentity.GetCurrent();
        return id.Owner != id.User;
      }
    }

1
Cám ơn vì cái này! - Tôi đã sử dụng điều này trong PowerShell [Security.Principal.WindowsIdentity] :: GetCurrent (). Owner.IsWellKnown ([System.Security.Principal.WellKnownSidType] :: BuiltinAdministratorsSid)
Lewis

Khi đặt thông báo thành 'không bao giờ hiển thị bất kỳ thông báo nào', điều này sẽ trả về true. Có lẽ trong một số trường hợp bạn thực sự cần chạy phần mềm với tư cách quản trị viên, nó có thể đưa ra một dấu hiệu sai.
CularBytes

2
Điều này sẽ không phân biệt giữa quá trình "bán chưa được khai thác" và quá trình chưa được kích hoạt đúng cách: có thể nó IsElevatedsẽ trả về false nhưng quá trình này có thể vẫn đang chạy với mức độ toàn vẹn cao. Một quy trình thực sự không nâng cao có mức độ toàn vẹn trung bình. Điều này có lẽ không liên quan đối với 99% ứng dụng, nhưng điều đáng nói là vì các công cụ như Process Hacker vẫn có thể tuyên bố một quy trình như vậy được nâng cao. Quy trình "bán chưa được đào tạo" không phải là thứ bạn thường thấy; nó có thể xảy ra khi ai đó không khởi chạy đúng quy trình con chưa được kích hoạt.
Roman Starkov

Whats "đang chạy với mức độ toàn vẹn cao"?
StingyJack

@StingyJack đó là một câu hỏi quá lớn để trả lời trong phần bình luận, nhưng hãy xem ở đâyở đây .
Roman Starkov

19

Đây là phiên bản đã sửa đổi của câu trả lời này để bao gồm những thứ như cách xử lý tài nguyên và xử lý thích hợp của Quản trị viên miền.

public static class UacHelper
{
    private const string uacRegistryKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";
    private const string uacRegistryValue = "EnableLUA";

    private static uint STANDARD_RIGHTS_READ = 0x00020000;
    private static uint TOKEN_QUERY = 0x0008;
    private static uint TOKEN_READ = (STANDARD_RIGHTS_READ | TOKEN_QUERY);

    [DllImport("advapi32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool OpenProcessToken(IntPtr ProcessHandle, UInt32 DesiredAccess, out IntPtr TokenHandle);

    [DllImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool CloseHandle(IntPtr hObject);

    [DllImport("advapi32.dll", SetLastError = true)]
    public static extern bool GetTokenInformation(IntPtr TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, IntPtr TokenInformation, uint TokenInformationLength, out uint ReturnLength);

    public enum TOKEN_INFORMATION_CLASS
    {
        TokenUser = 1,
        TokenGroups,
        TokenPrivileges,
        TokenOwner,
        TokenPrimaryGroup,
        TokenDefaultDacl,
        TokenSource,
        TokenType,
        TokenImpersonationLevel,
        TokenStatistics,
        TokenRestrictedSids,
        TokenSessionId,
        TokenGroupsAndPrivileges,
        TokenSessionReference,
        TokenSandBoxInert,
        TokenAuditPolicy,
        TokenOrigin,
        TokenElevationType,
        TokenLinkedToken,
        TokenElevation,
        TokenHasRestrictions,
        TokenAccessInformation,
        TokenVirtualizationAllowed,
        TokenVirtualizationEnabled,
        TokenIntegrityLevel,
        TokenUIAccess,
        TokenMandatoryPolicy,
        TokenLogonSid,
        MaxTokenInfoClass
    }

    public enum TOKEN_ELEVATION_TYPE
    {
        TokenElevationTypeDefault = 1,
        TokenElevationTypeFull,
        TokenElevationTypeLimited
    }

    public static bool IsUacEnabled
    {
        get
        {
            using (RegistryKey uacKey = Registry.LocalMachine.OpenSubKey(uacRegistryKey, false))
            {
                bool result = uacKey.GetValue(uacRegistryValue).Equals(1);
                return result;
            }
        }
    }

    public static bool IsProcessElevated
    {
        get
        {
            if (IsUacEnabled)
            {
                IntPtr tokenHandle = IntPtr.Zero;
                if (!OpenProcessToken(Process.GetCurrentProcess().Handle, TOKEN_READ, out tokenHandle))
                {
                    throw new ApplicationException("Could not get process token.  Win32 Error Code: " +
                                                   Marshal.GetLastWin32Error());
                }

                try
                {
                    TOKEN_ELEVATION_TYPE elevationResult = TOKEN_ELEVATION_TYPE.TokenElevationTypeDefault;

                    int elevationResultSize = Marshal.SizeOf(typeof(TOKEN_ELEVATION_TYPE));
                    uint returnedSize = 0;

                    IntPtr elevationTypePtr = Marshal.AllocHGlobal(elevationResultSize);
                    try
                    {
                        bool success = GetTokenInformation(tokenHandle, TOKEN_INFORMATION_CLASS.TokenElevationType,
                                                           elevationTypePtr, (uint) elevationResultSize,
                                                           out returnedSize);
                        if (success)
                        {
                            elevationResult = (TOKEN_ELEVATION_TYPE) Marshal.ReadInt32(elevationTypePtr);
                            bool isProcessAdmin = elevationResult == TOKEN_ELEVATION_TYPE.TokenElevationTypeFull;
                            return isProcessAdmin;
                        }
                        else
                        {
                            throw new ApplicationException("Unable to determine the current elevation.");
                        }
                    }
                    finally
                    {
                        if (elevationTypePtr != IntPtr.Zero)
                            Marshal.FreeHGlobal(elevationTypePtr);
                    }
                }
                finally
                {
                    if (tokenHandle != IntPtr.Zero)
                        CloseHandle(tokenHandle);
                }
            }
            else
            {
                WindowsIdentity identity = WindowsIdentity.GetCurrent();
                WindowsPrincipal principal = new WindowsPrincipal(identity);
                bool result = principal.IsInRole(WindowsBuiltInRole.Administrator) 
                           || principal.IsInRole(0x200); //Domain Administrator
                return result;
            }
        }
    }
}

Tất cả phụ thuộc vào người dùng mà bạn đang sử dụng dịch vụ. Bạn đang cố gắng phát hiện xem dịch vụ đang chạy với tư cách là Hệ thống cục bộ, Dịch vụ cục bộ, Dịch vụ mạng hay người dùng windows? Việc phát hiện "trạng thái quản trị" sẽ không hoạt động để phân biệt giữa Hệ thống cục bộ và Dịch vụ cục bộ, bạn cần phải kiểm tra điều đó bằng cách kiểm tra trực tiếp người dùng nào đang chạy quy trình.
Scott Chamberlain

Điều này khiến tôi có một ngoại lệ ở Windows 8, Marshal.SizeOf((int)elevationResult)tôi vẫn chưa biết tại sao. Thông báo ngoại lệ là: Không tìm thấy phương pháp. Tại địa chỉ:Int32 System.Runtime.InteropServices.Marshal.SizeOf(!!0).
CularBytes

@RageCompex bạn có đang sử dụng một nền tảng bị hạn chế như ứng dụng toàn cầu hay Unity3d không?
Scott Chamberlain

1
Ah, bạn đang biên dịch với 4.5.1 vì nó đang cố gắng sử dụng quá tải này nhưng người dùng chưa cài đặt 4.5.1. Hãy thử thay thế nó bằng Marshal.SizeOf(typeof(TOKEN_ELEVATION_TYPE)),
Scott Chamberlain

2
Tuy nhiên, @ScottChamberlain int elevationResultSize = Marshal.SizeOf(typeof(TOKEN_ELEVATION_TYPE))ném một ArgumentExceptionứng dụng 32 Bit .NET 4.0 int elevationResultSize = Marshal.SizeOf((int)elevationResult)đã hoạt động.
Martin Braun

16

Các CodePlex dự án UAChelper có mã rằng séc trên độ cao trong UserAccountControl.cppUserAccountControl::IsUserAdmin , rằng séc nếu UAC được kích hoạt và sau đó kiểm tra xem quá trình được nâng lên.

bool UserAccountControl::IsCurrentProcessElevated::get()
{
    return GetProcessTokenElevationType() == TokenElevationTypeFull;    //elevated
}

từ hàm:

int UserAccountControl::GetProcessTokenElevationType()
{
    HANDLE hToken;
    try
    {
        if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
            throw gcnew Win32Exception(GetLastError());

        TOKEN_ELEVATION_TYPE elevationType;
        DWORD dwSize;
        if (!GetTokenInformation(hToken, TokenElevationType, &elevationType, sizeof(elevationType), &dwSize))
            throw gcnew Win32Exception(GetLastError());

        return elevationType;
    }
    finally
    {
        CloseHandle(hToken);
    }
}

10

Trong .net Framwork 4.5, tôi đã tìm thấy một phương pháp khác phù hợp với mình. Liên quan đến tập lệnh sau có thể được tìm thấy ở đây (bằng tiếng Đức)

 rem --- Admintest.bat ---
 whoami /groups | find "S-1-5-32-544" > nul
 if errorlevel 1 goto ende
 echo Benutzer %username% ist lokaler Administrator.
 :ende

Trong C #, nó trông như thế này:

    private bool IsAdmin
    {
        get
        {
            WindowsIdentity identity = WindowsIdentity.GetCurrent();
            if (identity != null)
            {
               WindowsPrincipal principal = new WindowsPrincipal(identity);
               List<Claim> list = new List<Claim>(principal.UserClaims);
               Claim c = list.Find(p => p.Value.Contains("S-1-5-32-544"));
               if (c != null)
                  return true;
            }
            return false;
        }
    }

Nhưng trong .net <4,5 WindowsPrincipallớp không chứa thuộc UserClaimstính và tôi không tìm thấy cách nào để lấy thông tin này.


FYI: Chỉ xác định nếu tài khoản là người quản lý, không nếu ứng dụng được nâng lên
CularBytes

Để kiểm tra xem người dùng có phải là thành viên của S-1-5-32-544 (Nhóm quản trị viên) trong .Net <4.5 hay không, bạn chỉ có thể sử dụng mã trong câu hỏi ban đầu. Hiệu trưởng sẽ chỉ là thành viên của nhóm Quản trị viên nếu quá trình đang chạy trên cao và người dùng nằm trong nhóm. Nếu quá trình này không được nâng cao, hiệu trưởng sẽ không có trong nhóm.
Adam

1
Câu trả lời hay, ngắn gọn và hiệu quả, tôi đã cho bạn +1 cho câu trả lời đó. NB Tôi đã đặt đây là một thuộc tính trong mã của tôi ( private bool IsAdmin{ get { ... } }), sau đó bạn không cần dấu ngoặc nếu bạn gọi IsAdmin.
Matt

4

Sử dụng TokenElevationTypesẽ hiệu quả, nhưng nếu bạn PInvokeCheckTokenMembership() chống lại SID của nhóm quản trị, mã của bạn cũng sẽ hoạt động khi UAC tắt và trên 2000 / XP / 2003 và cũng sẽ xử lý từ chối SID.

Ngoài ra còn có một IsUserAnAdmin()chức năng CheckTokenMembershipkiểm tra cho bạn, nhưng MSDN nói rằng nó có thể không ở đó mãi mãi


Tôi thấy CheckTokenMembership không đủ khi tuân theo UAC - github.com/chocolatey/choco/blob/… trả về false. Kiểm tra mã (tôi đang thay thế nó) và xem đầu ra từ Win2012R2 - i.imgur.com/gX3JP0W.png
ferventcoder

@ferventcoder Nó phụ thuộc vào những gì bạn thực sự muốn biết; người dùng có phải là quản trị viên được nâng cao ngay bây giờ hay họ có thể nâng cấp nếu được yêu cầu. Ví dụ: bạn có thể kiểm tra TOKEN_ELEVATION_TYPE và kết thúc bằng một cái gì đó như: bool is_or_can_elevate () {return process_is_elended () || TokenElevationTypeLimited == get_current_token_elevation_type (); }. Một vấn đề khác là định nghĩa của eleised không giống nhau ở mọi nơi, bạn có thể có một cửa sổ giao diện điều khiển với tiền tố "Administrator:" và đồng thời ở dưới mức toàn vẹn Cao! TokenElevation không phải lúc nào cũng khớp với TokenIntegrityLevel.
Anders,

Thời gian vui vẻ. Tôi muốn biết liệu tôi có một quy trình nâng cao tách biệt với việc người dùng có phải là quản trị viên hay không. Đây là nơi tôi đã kết thúc. Hãy cho tôi biết tôi nên đi đâu nếu sai - github.com/chocolatey/choco/issues/77#issuecomment-73523774github.com/chocolatey/choco/commit/…
ferventcoder

@ferventcoder is_processes_elended () {return CheckTokenMembership / IsInRole || TokenElevation / TokenIntegrityLevel> = 0x3000; } CheckTokenMembership hoặc IsInRole cho <Vista và Vista + khi tắt UAC. TokenElevation hoặc TokenIntegrityLevel> = 0x3000 tùy thuộc vào chính xác cách bạn muốn phát hiện độ cao. Tôi tin rằng conhost.exe sử dụng TokenElevation nhưng nó bị hỏng IMHO và bạn nên kiểm tra mức độ thực tế ... (Bạn cần các công cụ đặc biệt để tạo mã thông báo đánh lừa TokenElevation mặc dù) Xem thêm: windowssucks.wordpress.com/2011/02/07 / uac-are-you-high / #
Anders,

... và thậm chí điều đó là sai, về lý thuyết có thể có một mã thông báo nâng cao và không nằm trong nhóm quản trị viên. Vì vậy, nếu bạn chỉ muốn mọi người trong nhóm quản trị viên và đảm bảo rằng họ được nâng cao, bạn nên thực hiện kiểm tra CheckTokenMembership / IsInRole và sau đó kiểm tra Mã thông báo * sẽ không thành công (Không có UAC) hoặc giá trị của nó phải chỉ ra độ cao ... Điều này tất nhiên phụ thuộc về những gì bạn thực sự muốn truy cập. Bạn có thể cần phải là hệ thống / quản trị viên và được nâng cao, hoặc chỉ được nâng cao, điều đó phụ thuộc vào ACL.
Anders

4

Câu trả lời này có một số vấn đề. Đầu tiên, nó không nhận được bất kỳ quy trình Hệ thống nào chạy với tư cách Quản trị viên (ví dụ: trong NT-Authority / SYSTEM). Ví dụ mã bên dưới khắc phục tất cả các sự cố (phát hiện, LocalAdmins, DomainAdmins và LocalSystemAdmins)

Nếu bạn chỉ muốn Quy trình hiện tại, hãy thay thế pHandlebằngProcess.GetCurrentProcess().Handle

LƯU Ý: Bạn phải có một số đặc quyền để chạy nó. (Mọi AdminProcess đều có chúng nhưng cần kích hoạt chúng trước, Dịch vụ đã kích hoạt chúng theo mặc định)

internal static bool IsProcessElevatedEx(this IntPtr pHandle) {

        var token = IntPtr.Zero;
        if (!OpenProcessToken(pHandle, MAXIMUM_ALLOWED, ref token))
                throw new Win32Exception(Marshal.GetLastWin32Error(), "OpenProcessToken failed");

        WindowsIdentity identity = new WindowsIdentity(token);
        WindowsPrincipal principal = new WindowsPrincipal(identity);
        bool result = principal.IsInRole(WindowsBuiltInRole.Administrator)
                   || principal.IsInRole(0x200); //Domain Administrator
        CloseHandle(token);
        return result;
}

1

Tôi nghĩ rằng có một vấn đề nữa. Tôi đã kiểm tra các giải pháp do bạn cung cấp và phải nói rằng trong quá trình cài đặt Windows 7 và đăng nhập với tư cách quản trị viên, kiểm tra không hoạt động. Windows không bao giờ trả về thông tin mà quá trình chạy ở chế độ nâng cao. Vì vậy, trình tự:

if (IsUacEnabled)
    return IsProcessInElevatedMode();
return IsUserAdmin();

không trả về true khi đăng nhập với tư cách Quản trị viên nhưng tiến trình có tất cả các đặc quyền để thực hiện các hoạt động hệ thống (ví dụ: dừng các dịch vụ hệ thống). Trình tự làm việc là:

if (IsUserAdmin())
    return true;

if (IsUacEnabled)
    return IsProcessInElevatedMode();

return false;

Trước tiên, bạn nên kiểm tra xem quá trình có chạy trong ngữ cảnh Quản trị viên hay không. Thông tin bổ sung:

IsUacEnabled() - checks if the UAC has been enabled in the system (Windows)
IsProcessInElevatedMode() - checks if the process is run in an elevated mode
IsUserAdmin() - checks if the current user has an Administrtor role

Tất cả các phương pháp đó đã được mô tả trong các bài viết trước.


1
Đây không phải là một câu trả lời nhưng bình luận cho là về bài đăng khác
MickyD

1

Sử dụng gói UACHelper nuget : https://www.nuget.org/packages/UACHelper/

if (UACHelper.IsElevated)
    // something
else
    // something else

Có rất nhiều thuộc tính khác có thể được sử dụng để phát hiện xem trên thực tế, người dùng có phải là quản trị viên hay quá trình đang chạy dưới ảo hóa UAC hay chủ sở hữu máy tính để bàn là chủ sở hữu quy trình. (Chạy từ tài khoản giới hạn)

Kiểm tra đọc tôi để biết thêm thông tin.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.