title: Start a .Net Process as a Different User
body: <p>I want to start a Process with Admin rights. When I run the code below the Process complains saying it needs Admin rights:</p>
  
  <pre><code>public class ImpersonationHelper : IDisposable
  {
      IntPtr m_tokenHandle = new IntPtr(0);
      WindowsImpersonationContext m_impersonatedUser;
  
      #region Win32 API Declarations
  
      const int LOGON32_PROVIDER_DEFAULT = 0;
      const int LOGON32_LOGON_INTERACTIVE = 2;    //This parameter causes LogonUser to create a primary token.
  
      [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);
  
      [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
      public extern static bool DuplicateToken(IntPtr ExistingTokenHandle,
      int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);
  
      #endregion
  
      /// &lt;summary&gt;
      /// Constructor. Impersonates the requested user. Impersonation lasts until
      /// the instance is disposed.
      /// &lt;/summary&gt;
      public ImpersonationHelper(string domain, string user, string password)
      {
          // Call LogonUser to obtain a handle to an access token.
          bool returnValue = LogonUser(user, domain, password,
              LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
              ref m_tokenHandle);
          if (false == returnValue)
          {
              int ret = Marshal.GetLastWin32Error();
              throw new System.ComponentModel.Win32Exception(ret);
          }
  
          // Impersonate
          m_impersonatedUser = new WindowsIdentity(m_tokenHandle).Impersonate();
      }
  
      #region IDisposable Pattern
  
      /// &lt;summary&gt;
      /// Revert to original user and cleanup.
      /// &lt;/summary&gt;
      protected virtual void Dispose(bool disposing)
      {
          if (disposing)
          {
              // Revert to original user identity
              if (m_impersonatedUser != null)
                  m_impersonatedUser.Undo();
          }
  
          // Free the tokens.
          if (m_tokenHandle != IntPtr.Zero)
              CloseHandle(m_tokenHandle);
      }
  
      /// &lt;summary&gt;
      /// Explicit dispose.
      /// &lt;/summary&gt;
      public void Dispose()
      {
          Dispose(true);
          GC.SuppressFinalize(this);
      }
  
      /// &lt;summary&gt;
      /// Destructor
      /// &lt;/summary&gt;
      ~ImpersonationHelper()
      {
          Dispose(false);
      }
  
      #endregion
  }
  
  using (new ImpersonationHelper("xxx.blabla.com", "xxxx", "xxxx"))
  {
      if (!string.IsNullOrEmpty(txtFilename.Text))
          Process.Start(txtFilename.Text);
  }
  </code></pre>