public T GetInfo <T>(TOKEN_INFORMATION_CLASS type)
            {
                int    cbSize = Marshal.SizeOf(typeof(T));
                IntPtr pType  = Marshal.AllocHGlobal(cbSize);

                try
                {
                    // Retrieve token information.
                    if (!NativeMethods.GetTokenInformation(this, type, pType, cbSize, out cbSize))
                    {
                        throw new System.ComponentModel.Win32Exception();
                    }

                    // Marshal from native to .NET.
                    switch (type)
                    {
                    case TOKEN_INFORMATION_CLASS.TokenType:
                    case TOKEN_INFORMATION_CLASS.TokenImpersonationLevel:
                    case TOKEN_INFORMATION_CLASS.TokenSessionId:
                    case TOKEN_INFORMATION_CLASS.TokenSandBoxInert:
                    case TOKEN_INFORMATION_CLASS.TokenOrigin:
                    case TOKEN_INFORMATION_CLASS.TokenElevationType:
                    case TOKEN_INFORMATION_CLASS.TokenHasRestrictions:
                    case TOKEN_INFORMATION_CLASS.TokenUIAccess:
                    case TOKEN_INFORMATION_CLASS.TokenVirtualizationAllowed:
                    case TOKEN_INFORMATION_CLASS.TokenVirtualizationEnabled:
                        return((T)Convert.ChangeType(Marshal.ReadInt32(pType), typeof(T)));

                    case TOKEN_INFORMATION_CLASS.TokenLinkedToken:
                        return((T)Convert.ChangeType(Marshal.ReadIntPtr(pType), typeof(T)));

                    case TOKEN_INFORMATION_CLASS.TokenUser:
                    case TOKEN_INFORMATION_CLASS.TokenGroups:
                    case TOKEN_INFORMATION_CLASS.TokenPrivileges:
                    case TOKEN_INFORMATION_CLASS.TokenOwner:
                    case TOKEN_INFORMATION_CLASS.TokenPrimaryGroup:
                    case TOKEN_INFORMATION_CLASS.TokenDefaultDacl:
                    case TOKEN_INFORMATION_CLASS.TokenSource:
                    case TOKEN_INFORMATION_CLASS.TokenStatistics:
                    case TOKEN_INFORMATION_CLASS.TokenRestrictedSids:
                    case TOKEN_INFORMATION_CLASS.TokenGroupsAndPrivileges:
                    case TOKEN_INFORMATION_CLASS.TokenElevation:
                    case TOKEN_INFORMATION_CLASS.TokenAccessInformation:
                    case TOKEN_INFORMATION_CLASS.TokenIntegrityLevel:
                    case TOKEN_INFORMATION_CLASS.TokenMandatoryPolicy:
                    case TOKEN_INFORMATION_CLASS.TokenLogonSid:
                        return((T)Marshal.PtrToStructure(pType, typeof(T)));

                    case TOKEN_INFORMATION_CLASS.TokenSessionReference:
                    case TOKEN_INFORMATION_CLASS.TokenAuditPolicy:
                    default:
                        return(default(T));
                    }
                }
                finally
                {
                    Marshal.FreeHGlobal(pType);
                }
            }