Ömer Çelik

Yazılımcının Günlüğü

C# - ImpersonateUser Kullanımı

Uygulama içerisinde bazı işlemleri yaparken kullanıcı yetkisi yeterli olmayabiliyor. Bunun için yetki gereken işleri yapmadan önce yetkili birinin bilgilerini verir sonra yetkiyi tekrar alabiliriz.

 

Bu işlem için ImpersonateUser isminde bir class tanımlayalım ve içeriğini aşağıdaki gibi dolduralım.

 

 

    public class ImpersonateUser

    {

        [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 static IntPtr tokenHandle = new IntPtr(0);

        private static WindowsImpersonationContext impersonatedUser;

        [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]

        public void Impersonate(string domainName, string userName, string password)

        {

            {

                const int LOGON32_PROVIDER_DEFAULT = 0;

                const int LOGON32_LOGON_INTERACTIVE = 2;

                tokenHandle = IntPtr.Zero;

                bool returnValue = LogonUser(

                userName,

                domainName,

                password,

                LOGON32_LOGON_INTERACTIVE,

                LOGON32_PROVIDER_DEFAULT,

                ref tokenHandle);

                if (false == returnValue)

                {

                    int ret = Marshal.GetLastWin32Error();

                    throw new System.ComponentModel.Win32Exception(ret);

                }

                WindowsIdentity newId = new WindowsIdentity(tokenHandle);

                {

                    impersonatedUser = newId.Impersonate();

                }

            }

        }

 

        public void Undo()

        {

            impersonatedUser.Undo();

            if (tokenHandle != IntPtr.Zero)

            {

                CloseHandle(tokenHandle);

            }

        }

    }

 

 

Yazmış olduğumuz bu class ımızı aşağıdaki gibi kullanabiliriz.

 

   

       ImpersonateUser iu = new ImpersonateUser();

            iu.Impersonate("domain", "yetkili kullanıcı adı", "Parola");

//kod bloğumuz

            iu.Undo();

 

Loading