Ejemplo n.º 1
0
        //private static readonly byte[] _genericIv = ConvertEx.FromBase16String("C9DCF37AED8574A1441FD82DB743765C");

        public static WindowsImpersonationContext ImpersonateWindowsUser(string userName, string domain, string password)
        {
            var token          = IntPtr.Zero;
            var tokenDuplicate = IntPtr.Zero;

            try
            {
                if (CoreExtensions.RevertToSelf())
                {
                    if (CoreExtensions.LogonUserA(userName, domain, password, CoreExtensions.LOGON32_LOGON_INTERACTIVE, CoreExtensions.LOGON32_PROVIDER_DEFAULT, ref token) != 0)
                    {
                        if (CoreExtensions.DuplicateToken(token, 2, ref tokenDuplicate) != 0)
                        {
                            var tempWindowsIdentity  = new WindowsIdentity(tokenDuplicate);
                            var impersonationContext = tempWindowsIdentity.Impersonate();
                            if (impersonationContext != null)
                            {
                                CoreExtensions.CloseHandle(token);
                                CoreExtensions.CloseHandle(tokenDuplicate);
                                return(impersonationContext);
                            }
                        }
                    }
                }
            }
            finally
            {
                if (token != IntPtr.Zero)
                {
                    CoreExtensions.CloseHandle(token);
                }
                if (tokenDuplicate != IntPtr.Zero)
                {
                    CoreExtensions.CloseHandle(tokenDuplicate);
                }
            }
            throw new Exception("Unable to login.");
        }