Пример #1
0
            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);
            }