Проверка прав администратора - C#

Узнай цену своей работы

Формулировка задачи:

Для работы моего приложения нужны права администратора, как проверить с какими правами запустилась программа

Решение задачи: «Проверка прав администратора»

textual
Листинг программы
/// <summary>
/// The function checks whether the primary access token of the process belongs 
/// to user account that is a member of the local Administrators group, even if 
/// it currently is not elevated.
/// </summary>
/// <returns>
/// Returns true if the primary access token of the process belongs to user 
/// account that is a member of the local Administrators group. Returns false 
/// if the token does not.
/// </returns>
/// <exception cref="System.ComponentModel.Win32Exception">
/// When any native Windows API call fails, the function throws a Win32Exception 
/// with the last error code.
/// </exception>
internal bool IsUserInAdminGroup()
{
    bool fInAdminGroup = false;
    SafeTokenHandle hToken = null;
    SafeTokenHandle hTokenToCheck = null;
    IntPtr pElevationType = IntPtr.Zero;
    IntPtr pLinkedToken = IntPtr.Zero;
    int cbSize = 0;
 
    try
    {
        // Open the access token of the current process for query and duplicate.
        if (!NativeMethod.OpenProcessToken(Process.GetCurrentProcess().Handle,
            NativeMethod.TOKEN_QUERY | NativeMethod.TOKEN_DUPLICATE, out hToken))
        {
            throw new Win32Exception(Marshal.GetLastWin32Error());
        }
 
        // Determine whether system is running Windows Vista or later operating 
        // systems (major version >= 6) because they support linked tokens, but 
        // previous versions (major version < 6) do not.
        if (Environment.OSVersion.Version.Major >= 6)
        {
            // Running Windows Vista or later (major version >= 6). 
            // Determine token type: limited, elevated, or default. 
 
            // Allocate a buffer for the elevation type information.
            cbSize = sizeof(TOKEN_ELEVATION_TYPE);
            pElevationType = Marshal.AllocHGlobal(cbSize);
            if (pElevationType == IntPtr.Zero)
            {
                throw new Win32Exception(Marshal.GetLastWin32Error());
            }
 
            // Retrieve token elevation type information.
            if (!NativeMethod.GetTokenInformation(hToken, 
            TOKEN_INFORMATION_CLASS.TokenElevationType, pElevationType,
                cbSize, out cbSize))
            {
                throw new Win32Exception(Marshal.GetLastWin32Error());
            }
 
            // Marshal the TOKEN_ELEVATION_TYPE enum from native to .NET.
            TOKEN_ELEVATION_TYPE elevType = (TOKEN_ELEVATION_TYPE)
            Marshal.ReadInt32(pElevationType);
 
            // If limited, get the linked elevated token for further check.
            if (elevType == TOKEN_ELEVATION_TYPE.TokenElevationTypeLimited)
            {
                // Allocate a buffer for the linked token.
                cbSize = IntPtr.Size;
                pLinkedToken = Marshal.AllocHGlobal(cbSize);
                if (pLinkedToken == IntPtr.Zero)
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
 
                // Get the linked token.
                if (!NativeMethod.GetTokenInformation(hToken,
                TOKEN_INFORMATION_CLASS.TokenLinkedToken, pLinkedToken,
                    cbSize, out cbSize))
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
 
                // Marshal the linked token value from native to .NET.
                IntPtr hLinkedToken = Marshal.ReadIntPtr(pLinkedToken);
                hTokenToCheck = new SafeTokenHandle(hLinkedToken);
            }
        }
                
        // CheckTokenMembership requires an impersonation token. If we just got 
        // a linked token, it already is an impersonation token.  If we did not 
        // get a linked token, duplicate the original into an impersonation 
        // token for CheckTokenMembership.
        if (hTokenToCheck == null)
        {
            if (!NativeMethod.DuplicateToken(hToken,
                SECURITY_IMPERSONATION_LEVEL.SecurityIdentification,
                out hTokenToCheck))
            {
                throw new Win32Exception(Marshal.GetLastWin32Error());
            }
        }
 
        // Check if the token to be checked contains admin SID.
        WindowsIdentity id = new WindowsIdentity(hTokenToCheck.DangerousGetHandle());
        WindowsPrincipal principal = new WindowsPrincipal(id);
        fInAdminGroup = principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    finally
    {
        // Centralized cleanup for all allocated resources. 
        if (hToken != null)
        {
            hToken.Close();
            hToken = null;
        }
        if (hTokenToCheck != null)
        {
            hTokenToCheck.Close();
            hTokenToCheck = null;
        }
        if (pElevationType != IntPtr.Zero)
        {
            Marshal.FreeHGlobal(pElevationType);
            pElevationType = IntPtr.Zero;
        }
        if (pLinkedToken != IntPtr.Zero)
        {
            Marshal.FreeHGlobal(pLinkedToken);
            pLinkedToken = IntPtr.Zero;
        }
    }
    return fInAdminGroup;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.6 из 5
Похожие ответы