用其他用户替换当前正在运行EXE的Windows用户

| 假设我构建了一个Windows应用程序,该应用程序从网络文件夹中读取文件。网络折叠将访问权限限制为仅一个用户“ fooUser”。该应用程序安装在网络上的多台计算机中。 我需要用\“ fooUser \”替换当前用户,以便能够通过代码访问网络文件夹上的文件。
已邀请:
这是一个非常简单的模拟方案,可以让您在试用期内成为任何人(只要您拥有适当的凭据即可。) 本课程将为您完成所有繁重的工作。
  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....
}
将模仿者放在“ using”块中,或者在完成模仿任务后将其处置,这很重要,否则系统将无限期继续模仿,这将导致各种问题。
使用Runas实用程序:http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/runas.mspx?mfr=true 希望这可以帮助。
您可以检查LogonUser和委托是否可以帮助您。
您可以将映射的驱动器设置为使用\'fooUser \'凭据的文件夹共享。 尽管如果您具有用户的登录名/密码,则可以使代码使用模拟。 根据我对C#的Windows模拟的回答: 有关模拟代码,请参见 以下两篇代码项目文章: 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;zh-CN;Q306158

要回复问题请先登录注册