Những gì tôi đã sử dụng thành công để truy xuất file trên máy tính là đoạn mã sau:
#region imports
[DllImport("advapi32.dll", SetLastError = true)]
private static extern bool LogonUser(string
lpszUsername, string lpszDomain, string lpszPassword,
int dwLogonType, int dwLogonProvider, ref
IntPtr phToken);
[DllImport("kernel32.dll", CharSet = CharSet.Auto,
SetLastError = true)]
private static extern bool CloseHandle(IntPtr handle
);
[DllImport("advapi32.dll", CharSet = CharSet.Auto,
SetLastError = true)]
public extern static bool DuplicateToken(IntPtr
existingTokenHandle,
int SECURITY_IMPERSONATION_LEVEL, ref IntPtr
duplicateTokenHandle);
#endregion
#region logon consts
// logon types
const int LOGON32_LOGON_INTERACTIVE = 2;
const int LOGON32_LOGON_NETWORK = 3;
const int LOGON32_LOGON_NEW_CREDENTIALS = 9;
// logon providers
const int LOGON32_PROVIDER_DEFAULT = 0;
const int LOGON32_PROVIDER_WINNT50 = 3;
const int LOGON32_PROVIDER_WINNT40 = 2;
const int LOGON32_PROVIDER_WINNT35 = 1;
#endregion
Và sau đó để ký kết một phần, chỉ cần sử dụng:
IntPtr token = IntPtr.Zero;
bool isSuccess = LogonUser("username", "domain", "password",
LOGON32_LOGON_NEW_CREDENTIALS,
LOGON32_PROVIDER_DEFAULT, ref token);
using (WindowsImpersonationContext person = new WindowsIdentity(token).Impersonate())
{
//do your thing
person.Undo();
}
Như bạn có thể thấy, "Hoàn tác()" sẽ khiến bạn không còn đăng nhập với tư cách người dùng đó nữa. Vì vậy, không sử dụng nó trước khi bạn hoàn tất. Nhưng đừng quên sử dụng nó!
Nguồn
2010-03-29 21:59:10
+1 Đây thực sự là cách duy nhất để làm điều đó. – Nate
Tôi có thể giữ biến "mã thông báo" trong khoảng thời gian dài và sau đó sử dụng khối "sử dụng/Hoàn tác()" tại các điểm khác nhau trong chế ngự bằng cùng một mã thông báo? " – JCCyC
Tôi nghĩ vậy. Đó là Mạo danh thực sự đăng nhập. Những gì tôi đã sử dụng là một "GetImpersonation()" mà trả về một WindowsImpersonationContext như trên –