Exemplo n.º 1
0
        public static bool Impersonate(string userName, string domain, string password, TokenImpersonationLevel impersonationLevel)
        {
            lock (_syncRoot) {
                var threadID = Thread.CurrentThread.ManagedThreadId;

                if (IsCurrentlyImpersonated)
                {
                    Revert();
                }


                var newUserToken = new TokenHandle();
                var luRet        = NativeMethods.LogonUser(userName, domain, password, NativeMethods.LOGON32_LOGON_INTERACTIVE, NativeMethods.LOGON32_PROVIDER_DEFAULT, ref newUserToken);
                if (luRet == false)
                {
                    newUserToken.Close();
                    return(false);
                }

                var duplicatedUserToken = new TokenHandle();
                var dtRet = NativeMethods.DuplicateToken(newUserToken, (Int32)impersonationLevel, ref duplicatedUserToken);
                if (dtRet == false)
                {
                    duplicatedUserToken.Close();
                    newUserToken.Close();
                    return(false);
                }

                try {
                    var newIdentity          = new WindowsIdentity(duplicatedUserToken.DangerousGetHandle());
                    var impersonationContext = newIdentity.Impersonate();

                    _impersonationPerThreadID.Add(threadID, new TransferBag(newUserToken, duplicatedUserToken, impersonationContext));

                    return(true);
                } finally {
                    duplicatedUserToken.Close();
                    newUserToken.Close();
                }
            }
        }