public static SafeTokenHandle FromThread(IntPtr hThread, AccessTypes desiredAccess = AccessTypes.TokenDuplicate, bool openAsSelf = true) { SafeTokenHandle val; if (!NativeMethods.OpenThreadToken(hThread, desiredAccess, openAsSelf, out val)) { if (Marshal.GetLastWin32Error() == ERROR_NO_TOKEN) { SafeTokenHandle pval = FromCurrentProcess(); if (!NativeMethods.DuplicateTokenEx(pval, AccessTypes.TokenImpersonate | desiredAccess, IntPtr.Zero, SECURITY_IMPERSONATION_LEVEL.Impersonation, TokenType.TokenImpersonation, ref val)) { throw new System.ComponentModel.Win32Exception(); } if (!NativeMethods.SetThreadToken(IntPtr.Zero, val)) { throw new System.ComponentModel.Win32Exception(); } } else { throw new System.ComponentModel.Win32Exception(); } } return(val); }