替换当前Windows用户与其他用户一起运行EXE

时间:2011-04-19 12:11:10

标签: c# .net permissions windows

假设我构建了一个从网络文件夹中读取文件的Windows应用程序。网络折叠限制只能访问一个用户“fooUser”。该应用程序安装在网络上的多台计算机上。

我需要用“fooUser”替换当前用户,以便能够通过代码访问网络文件夹中的文件。

4 个答案:

答案 0 :(得分:7)

这是一个非常简单的假冒计划,可以让你成为任何人一个镜头期(授予你相应的证书。)
这堂课将为你完成所有繁重的工作......

  public class Impersonator : IDisposable
  {

    const int LOGON32_PROVIDER_DEFAULT = 0;
    const int LOGON32_LOGON_INTERACTIVE = 2;

    [DllImport("advapi32.dll", SetLastError = true)]
    public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    public extern static bool CloseHandle(IntPtr handle);

    private IntPtr token = IntPtr.Zero;
    private WindowsImpersonationContext impersonated;
    private readonly string _ErrMsg = "";

    public bool IsImpersonating
    {
      get { return (token != IntPtr.Zero) && (impersonated != null); }
    }

    public string ErrMsg
    {
      get { return _ErrMsg; }
    }

    [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
    public Impersonator(string userName, string password, string domain)
    {
      StopImpersonating();

      bool loggedOn = LogonUser(userName, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token);
      if (!loggedOn)
      {
        _ErrMsg = new System.ComponentModel.Win32Exception().Message;
        return;
      }

      WindowsIdentity identity = new WindowsIdentity(token);
      impersonated = identity.Impersonate();
    }

    private void StopImpersonating()
    {
      if (impersonated != null)
      {
        impersonated.Undo();
        impersonated = null;
      }

      if (token != IntPtr.Zero)
      {
        CloseHandle(token);
        token = IntPtr.Zero;
      }
    }

    public void Dispose()
    {
      StopImpersonating();
    }
  }

你可以像这样使用它;

using (Impersonator = new Impersonator(yourName,yourPassword,yourDomain))
{
 // Read files from network drives.
 // Other activities....
}

将模仿者置于“使用”块中,或者在完成模拟任务时将其处置,或者系统将继续无限期冒充,这将导致各种问题。

答案 1 :(得分:0)

答案 2 :(得分:0)

您可以查看此问题LogonUser and delegation是否对您有所帮助。

答案 3 :(得分:0)

您可以设置映射驱动器到使用“fooUser”凭据的文件夹共享。

虽然如果您拥有该用户的登录名/密码,您可以使用您的代码来使用模拟。 根据我对Windows Impersonation from C#的回答:

  

对于模拟代码,请参阅   以下两个Code Project文章:

     

http://www.codeproject.com/KB/cs/cpimpersonation1.aspx

     

http://www.codeproject.com/KB/cs/zetaimpersonator.aspx

     

和他们的Microsoft KB文章   基于:

     

http://support.microsoft.com/default.aspx?scid=kb;en-us;Q306158