private
static
bool
GetProcessElevated()
{
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)
throw
new
ApplicationException(
"Unable to get process elevation info."
);
elevationResult = (TOKEN_ELEVATION_TYPE)Marshal.ReadInt32(elevationTypePtr);
bool
elevated = elevationResult == TOKEN_ELEVATION_TYPE.TokenElevationTypeFull;
return
elevated;
}
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);
#region Enums
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
}
#endregion Enums