Codebase list poshc2 / 39f6cef resources / modules / Get-TokenElevationType.ps1
39f6cef

Tree @39f6cef (Download .tar.gz)

Get-TokenElevationType.ps1 @39f6cefraw · history · blame

function Get-TokenElevationType {
<#
.SYNOPSYS
    This module uses a C# wrapper around a native API dll to determine the 
    token type of the current process, as well as the status of UAC.  
    Return values for the token type are:
        TokenElevationTypeDefault - Unprivileged token issued to standard 
            users, OR under certain conditions, to the default Administrator
            account when it is enabled and 'Admin approval mode for built-in 
            administrator account' is off.
        TokenElevationtypeLimited - Split token issued to a process from a 
            privileged user but running unprivileged.  
        TokenElevationTypeFull    - Usually indicates a split token with full 
            administrative rights.  

Function: Get-TokenElevationType  
Modifications: Jon Hickman (@0metasec)
Attributions: This code was adapted to purpose from code located at
  https://stackoverflow.com/questions/1220213/detect-if-running-as-administrator-with-or-without-elevated-privileges  
  contributed by https://stackoverflow.com/users/80566/steven
License: Modifications by Jon Hickman are MIT licensed  

.DESCRIPTION  

Running Get-TokenElevationType will return a value that exposes the 
TOKEN_ELEVATION_TYPE enum from the GetTokenInformation advapi32.dll call, 
as well as the status of UAC. If UAC is off, all tokens contain the full 
group membership and rights (no split tokens).  

#>


$assembly = @"
using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Security.Principal;

public static class UacPoll
{
    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 string IsProcessElevated()
    {
        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);
                    string output = (elevationResult.ToString() + " and UAC is enabled");
                    return output;
                }
                else
                {
                    throw new ApplicationException("Unable to determine the current elevation.");
                    
                }
        }
        else { return "UAC IS OFF FIRE AWAY"; }
    }
}
"@
    if (-not [bool]([appdomain]::CurrentDomain.GetAssemblies() | ? { $_.gettypes() -match 'UacPoll' })) {
        Add-type -typedefinition $assembly -Language CSharp
    }
    [UacPoll]::IsProcessElevated()
    
}