C# 模擬身份

有時候我們的程式需要去存取某些網路上的資源(像是去別台機器抓取檔案),或是執行一些特定身份才能執行的工作,該怎麼辦呢?

很簡單,我們可以把我們的程式模擬成你需要轉換的身份去執行。

神鬼交鋒


程式如下:

using System;
using System.Security.Principal;
using System.Runtime.InteropServices;

namespace PClass
{
    public class PImpersonate
    {
        IntPtr token = IntPtr.Zero;
        WindowsImpersonationContext impersonatedUser = null;

        private string _DomainName;
        private string _strUserName;
        private string _strPassword;

        public PImpersonate(string DomainName, string strUserName, string strPassword)
        {
            _DomainName = DomainName;
            _strUserName = strUserName;
            _strPassword = strPassword;

        }

        public void Login()
        {
            try
            {
                bool result = LogonUser(_strUserName, _DomainName,
                                        _strPassword,
                                        LogonSessionType.Network,
                                        LogonProvider.Default,
                                        out token);
                if (result)
                {
                    WindowsIdentity id = new WindowsIdentity(token);
                    impersonatedUser = id.Impersonate();
                }
                else
                {
                }
            }
            catch
            {
            }
            finally
            {
            }
        }

        public void Logout()
        {
            try
            {
                if (impersonatedUser != null)
                    impersonatedUser.Undo();
                // Free the token
                if (token != IntPtr.Zero)
                    CloseHandle(token);
            }
            catch
            {
            }
        }

        [DllImport("advapi32.dll", SetLastError = true)]
        static extern bool LogonUser(
          string principal,
          string authority,
          string password,
          LogonSessionType logonType,
          LogonProvider logonProvider,
          out IntPtr token);
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool CloseHandle(IntPtr handle);
        enum LogonSessionType : uint
        {
            Interactive = 2,
            Network,
            Batch,
            Service,
            NetworkCleartext = 8,
            NewCredentials
        }
        enum LogonProvider : uint
        {
            Default = 0, // default for platform (use this!)
            WinNT35,     // sends smoke signals to authority
            WinNT40,     // uses NTLM
            WinNT50      // negotiates Kerb or NTLM
        }

    }
}


上面這一段程式忘記是去哪邊抄來的…..
(我應該有稍微改過…)

該如何使用呢?


PClass.PImpersonate Impersonate_User = new PClass.PImpersonate("網域名稱", "帳號", "密碼"); 
//若是本機帳號則在網域的地方改成特定的機器名稱,如下
//PClass.PImpersonate Impersonate_User = new PClass.PImpersonate("機器名稱", "帳號", "密碼");


Impersonate_User.Login();//開始用前面設定的帳號執行程式

//這邊就可以開始執行需要特定身份才能執行的程式囉

Impersonate_User.Logout();//登出

完畢,收工!

延伸閱讀:

CODE-C#變身術懶人包 – from 黑暗執行緒

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *