C#如何在系统上运行的应用程序中更改用户上下文

C#如何在系统上运行的应用程序中更改用户上下文,c#,security,system,C#,Security,System,我有一个与系统用户一起运行的应用程序。我需要在应用程序中的一些代码在用户上下文(与用户本身)上运行。例如,我需要在用户上下文中使用webclient,因为这样我的防火墙才能识别用户名,但稍后我需要运行一些其他代码,例如,在系统上下文中运行exe(与系统用户一起),因为我需要特权 有办法做到这一点吗 谢谢 我使用此代码模拟某些操作 using System; using System.ComponentModel; using System.Runtime.InteropServices; usi

我有一个与系统用户一起运行的应用程序。我需要在应用程序中的一些代码在用户上下文(与用户本身)上运行。例如,我需要在用户上下文中使用webclient,因为这样我的防火墙才能识别用户名,但稍后我需要运行一些其他代码,例如,在系统上下文中运行exe(与系统用户一起),因为我需要特权

有办法做到这一点吗


谢谢

我使用此代码模拟某些操作

using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Security.Principal;
using NLog;
namespace Core.Impersonation
{
    public class ImpersonatedUser : IDisposable
    {
        private static Logger logger = LogManager.GetCurrentClassLogger();
        IntPtr userHandle;
        WindowsImpersonationContext impersonationContext;
        public ImpersonatedUser(string user, string domain, string password)
        {
            logger.Debug("Impersonating user: " + domain + @"\" + user);
            userHandle = IntPtr.Zero;
            bool loggedOn = LogonUser(
                user,
                domain,
                password,
                LogonType.Interactive,
                LogonProvider.Default,
                out userHandle);

            if (!loggedOn)
                throw new Win32Exception(Marshal.GetLastWin32Error());

            // Begin impersonating the user
            impersonationContext = WindowsIdentity.Impersonate(userHandle);
        }

        public void Dispose()
        {
            if (userHandle != IntPtr.Zero)
            {
                CloseHandle(userHandle);
                userHandle = IntPtr.Zero;
                impersonationContext.Undo();
                logger.Debug("Finished Impersonating user");
            }
        }

        [DllImport("advapi32.dll", SetLastError = true)]
        static extern bool LogonUser(
            string lpszUsername,
            string lpszDomain,
            string lpszPassword,
            LogonType dwLogonType,
            LogonProvider dwLogonProvider,
            out IntPtr phToken
            );

        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool CloseHandle(IntPtr hHandle);

        enum LogonType : int
        {
            Interactive = 2,
            Network = 3,
            Batch = 4,
            Service = 5,
            NetworkCleartext = 8,
            NewCredentials = 9,
        }

        enum LogonProvider : int
        {
            Default = 0,
        }
    }
}
然后是用法:

using (var i = new ImpersonatedUser("someLogin", "someDomain", "thePassword"))
{
    var u = System.Environment.UserName;
}

你所描述的毫无意义。如果没有很好地解释,很抱歉。在我的工作中,我们有一个使用kerberos进行身份验证的代理,允许用户浏览internet,如果用户系统尝试访问internet,访问将被拒绝。因此,我需要在用户上下文中运行此程序,但稍后在程序中,我有一个函数需要以管理员权限运行exe(经典用户在自己的计算机中不是管理员),所以这就是我需要做的。谢谢!是否有一种方法可以使用登录到上下文中的用户而不是发送用户凭据?如果我使用此方法:
使用(var i=new ImpersonatedUser(“用户”、“域”、“传递”){Process startInfo=new Process();startInfo.startInfo.FileName=@“c:\windows\system32\cmd.exe”;startInfo.Start();startInfo.WaitForExit();var u=System.Environment.UserName;Dispose();}
命令不会以预期用户启动。如果要以其他用户身份启动进程,请在ProcessStartinfo中设置适当的设置。有关示例,请参见。