Disposable Unimpersonation

Tags: .NET, CodeSnippets

A while ago, I discussed the possibility of using RevertToSelf() to avoid Double Hop problems. I suggested this pattern can be wrapped inside a class implementing IDisposable to easily use it.

This is the implementation of this Unimpersonator class:

Code:

using System;
using System.Runtime.InteropServices;
using System.Security.Principal;
namespace Strawjackal.Utils
{
   public class Unimpersonator : IDisposable
   {
      private WindowsIdentity m_CurrentUser;
     
      public Unimpersonator()
      {
         m_CurrentUser = WindowsIdentity.GetCurrent();
         RevertToSelf();
      }

      public void Dispose()
      {
         if (m_CurrentUser != null)
         m_CurrentUser.Impersonate();
      }

      [DllImport("advapi32.dll")]
      private static extern int RevertToSelf();

   }
}

Usage:

using (new Unimpersonator())
{
   // Perform network access
}

No Comments