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);

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