曾經的一個需求,需要在 Client 端對位於檔案伺服器上的檔案進行操作時,切換到另一個具有權限的 Domain 身分,只用過這一次,分享給大家參考。
DllImport advapi32.dll 並且宣告 LogonUser 方法
驗證要切換的身分必須借助 advapi32.dll 的 LogonUser 方法,我們在要執行驗證的程式碼中把宣告寫進去。
[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken);
呼叫 LogonUser 取得 Token
LogonUser 的表達式為 LogonUser(帳號, 網域, 密碼, 登入類別, 登入提供者, out UserToken);
登入類別有 3 種可選
- 2 = LOGON32LOGONINTERACTIVE
- 3 = LOGON32LOGONNETWORK
- 9 = LOGON32LOGONNEW_CREDENTIALS
登入提供者有 4 種可選
- 0 = LOGON32PROVIDERDEFAULT
- 1 = LOGON32PROVIDERWINNT35
- 2 = LOGON32PROVIDERWINNT40
- 3 = LOGON32PROVIDERWINNT50
通常登入類別選 9、登入提供者選 0,LogonUser 除了會回傳有沒有登入成功之外,還會輸出一個 UserToken,這個 UserToken 記得保存下來重覆利用。
切換到另一個身分
使用 WindowsIdentity.Impersonate()
這個方法切換身分,參數則帶入剛剛取得的 UserToken,這個方法會回傳一個 WindowsImpersonationContext
,記得保存下來。
WindowsImpersonationContext impersonationContext = WindowsIdentity.Impersonate(userToken);
切換回原先身分
利用剛剛取得的 impersonationContext
執行 Undo()
就可以切換回原身分了。
impersonationContext.Undo();
參考資料
< Source Code >