c # - Udskift nuværende Windows-bruger Kører EXE med en anden bruger

Indlæg af Hanne Mølgaard Plasc

Problem



Sig, om jeg har opbygget et Windows-program, der læser filer fra en netværksmappe. Netværksfoldene begrænser adgangen til kun én bruger 'fooUser'. Programmet installeres i flere maskiner på netværket.


Jeg skal erstatte den nuværende bruger med 'fooUser' for at kunne få adgang til filerne i netværksmappen efter kode.

Bedste reference


Her er et meget simpelt efterligningssystem, der giver dig mulighed for at være nogen for en skudperiode (givet dig de relevante legitimationsoplysninger.)

Denne klasse vil gøre alt det tunge løft for dig ....


  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();
    }
  }


Og du kan bruge det som sådan;


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


Det er meget vigtigt at placere impersonatoren i 'brug' -blokken eller at bortskaffe den, når du er færdig med at gøre dine upersonlige opgaver, eller systemet vil fortsætte med at efterligne ubestemt tid, hvilket vil forårsage alle slags problemer.

Andre referencer 1


brug runas hjælpeprogrammet: http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/runas.mspx?mfr=true[3]


Håber dette hjælper.

Andre referencer 2


Du kan kontrollere, om dette spørgsmål LogonUser og delegation vil hjælpe dig.

Andre referencer 3


Du kan bare oprette et kortnummer til mappedelen, der bruger 'fooUser' legitimationsoplysninger.


Selvom du har login/adgangskode til brugeren, kan du få din kode til at bruge efterligning.
Som svar på Windows Impersonation fra C #:



  For Impersonation-koden, se
  følgende to Code Project artikler:

  
  http://www.codeproject.com/KB/cs/cpimpersonation1.aspx[6]

  
  http://www.codeproject.com/KB/cs/zetaimpersonator.aspx[7]

  
  og Microsoft KB artiklen de er
  baseret på:

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