GetTokenInformation (advapi32)
Last changed: -14.140.20.18

.
Summary
Retrieves a specified type of information about an access token

C# Signature:

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

C# Signature without user defined enum:

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

VB.NET Definition:

    Public Declare Function GetTokenInformation Lib "advapi32.dll" ( _
    ByVal TokenHandle As IntPtr, ByVal TokenInformationClass As TOKEN_INFORMATION_CLASS, _
    ByVal TokenInformation As IntPtr, ByVal TokenInformationLength As System.UInt32, _
    ByRef ReturnLength As System.UInt32) As Boolean

User-Defined Types:

TOKEN_INFORMATION_CLASS

Notes:

Call once with zero for the third and fourth parameters to obtain the required size, then allocate the buffer and call again supplying these parameters.

Tips & Tricks:

Please add some!

Sample Code:

// Prints out sid of current user

using System;
using System.Runtime.InteropServices;
using System.Security.Principal;
using System.Text;
namespace test
{
     class clsLookupAccountName
     {

         enum TOKEN_INFORMATION_CLASS
         {
             TokenUser = 1,
             TokenGroups,
             TokenPrivileges,
             TokenOwner,
             TokenPrimaryGroup,
             TokenDefaultDacl,
             TokenSource,
             TokenType,
             TokenImpersonationLevel,
             TokenStatistics,
             TokenRestrictedSids,
             TokenSessionId,
             TokenGroupsAndPrivileges,
             TokenSessionReference,
             TokenSandBoxInert,
             TokenAuditPolicy,
             TokenOrigin
         }

         public struct TOKEN_USER
         {
             public SID_AND_ATTRIBUTES User ;
         }

             [StructLayout(LayoutKind.Sequential)]
         public struct SID_AND_ATTRIBUTES
         {

             public IntPtr Sid ;
             public int Attributes ;
         }

         // Using IntPtr for pSID insted of Byte[]
         [DllImport("advapi32", CharSet=CharSet.Auto, SetLastError=true)]
         static extern bool ConvertSidToStringSid(
             IntPtr pSID,
             out IntPtr ptrSid);


         [DllImport("kernel32.dll")]
         static extern IntPtr LocalFree(IntPtr hMem);


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


         [STAThread]
         static void Main(string[] args)
         {
             int TokenInfLength = 0 ;
             bool Result ;

             // first call gets lenght of TokenInformation
             Result = GetTokenInformation( WindowsIdentity.GetCurrent().Token , TOKEN_INFORMATION_CLASS.TokenUser , IntPtr.Zero , TokenInfLength , out TokenInfLength );

             IntPtr TokenInformation = Marshal.AllocHGlobal( TokenInfLength ) ;

             Result = GetTokenInformation( WindowsIdentity.GetCurrent().Token  , TOKEN_INFORMATION_CLASS.TokenUser , TokenInformation , TokenInfLength , out TokenInfLength ) ;

             if( Result )
             {
             TOKEN_USER TokenUser = ( TOKEN_USER )Marshal.PtrToStructure( TokenInformation , typeof( TOKEN_USER ) ) ;

             IntPtr pstr = IntPtr.Zero;
             Boolean ok = ConvertSidToStringSid( TokenUser.User.Sid  , out pstr );
             string sidstr = Marshal.PtrToStringAuto( pstr );
             LocalFree(pstr);
             Console.WriteLine(@"Found sid {0}",sidstr);
             }

             Marshal.FreeHGlobal( TokenInformation );

             Console.ReadLine();
         }
     }
}

There's a sample based on this at http://stackoverflow.com/questions/2146153/how-to-get-the-logon-sid-in-c/2146418#2146418 that gets the LogonSID instead.

Alternative Managed API:

Do you know one? Please contribute it!

Documentation