545
Chương 13: Bảo mật
Ứng dụng này sử dụng hàm
LogonUser
của Win32 API để thu lấy Windows access token cho
người dùng được chỉ định, giả nhận người dùng này, rồi trở về ngữ cảnh của người dùng cũ.
Ví dụ, lệnh
ImpersonationExample nnbphuong81 password
sẽ giả nhận người dùng
nnbphuong81
nếu người dùng đó đã tồn tại trong cơ sở dữ liệu tài khoản cục bộ.
using System;
using System.IO;
using System.Security.Principal;
using System.Security.Permissions;
using System.Runtime.InteropServices;
// Bảo đảm assembly có quyền truy xuất mã lệnh không-được-quản-lý
// và có quyền kiểm soát principal của tiểu trình.
[assembly:SecurityPermission(SecurityAction.RequestMinimum,
UnmanagedCode=true, ControlPrincipal=true)]
public class ImpersonationExample {
// Định nghĩa các hằng số được sử dụng cùng với hàm LogonUser.
const int LOGON32_PROVIDER_DEFAULT = 0;
const int LOGON32_LOGON_INTERACTIVE = 2;
// Nhập hàm Win32 LogonUser từ advapi32.dll. Chỉ định
// "SetLastError = true" để có thể truy xuất các mã lỗi của Win32.
[DllImport("advapi32.dll", SetLastError=true)]
static extern int LogonUser(string userName, string domain,
string password, int logonType, int logonProvider,
ref IntPtr accessToken);
public static void Main(string[] args) {
// Tạo một IntPtr mới để giữ lấy access token
// do hàm LogonUser trả về.
IntPtr accessToken = IntPtr.Zero;
// Gọi LogonUser để thu lấy access token cho người dùng
// được chỉ định. Biến accessToken được truyền cho LogonUser
// bằng tham chiếu và sẽ chứa tham chiếu đến Windows access token
// nếu LogonUser thành công.
int result = LogonUser(