[料理佳餚] C# 切換 Windows Form 的執行身分

  • 25000
  • 0
  • C#
  • 2016-05-23

曾經的一個需求,需要在 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 >

相關資源

C# 指南
ASP.NET 教學
ASP.NET MVC 指引
Azure SQL Database 教學
SQL Server 教學
Xamarin.Forms 教學