ImpersonateLoggedOnUser không mạo danh phiên đăng nhập từ mã thông báo người dùng, chỉ là ngữ cảnh bảo mật. Tuy nhiên, CreateProcessAsUser sẽ có thể tạo một quy trình mới trong phiên đăng nhập được liên kết với mã thông báo người dùng được chỉ định.
Lưu ý rằng việc gọi LogonUser để nhận mã thông báo người dùng cho CreateProcessAsUser sẽ không hoạt động, vì mã thông báo này sẽ không nằm trong cùng phiên đăng nhập với tư cách người dùng đã đăng nhập. Bạn phải tìm một trong các quy trình của người dùng và nhân đôi mã thông báo của nó.
Phiên đăng nhập không được ghi lại đầy đủ, nhưng tất cả bạn thực sự cần biết rằng mỗi lần người dùng được xác thực phiên đăng nhập riêng biệt được tạo và mỗi phiên đăng nhập đó có một bộ ánh xạ ổ đĩa mạng khác nhau. Phiên đăng nhập không giống như phiên dịch vụ đầu cuối.
Trong Windows Vista trở lên, hai phiên đăng nhập được tạo khi người dùng quản trị đăng nhập, một phiên được liên kết với mã thông báo bị hạn chế và mã được liên kết với mã thông báo nâng lên.
Bạn có thể tra cứu phiên đăng nhập được liên kết với mã thông báo bằng cách sử dụng hàm GetTokenInformation với tùy chọn TokenStatistics. Phiên đăng nhập được xác định bởi AuthenticationId LUID. Để thực hiện công việc này, dịch vụ của bạn sẽ cần phải tìm ra lần đầu tiên khi người dùng đăng nhập, đợi một quá trình liên quan đến phiên mới bắt đầu, đảm bảo quá trình này không phải là quá trình nâng cao, sau đó sao chép mã thông báo truy cập.
Thay vào đó, tùy chọn tốt nhất của bạn là chia ứng dụng thành hai thành phần. Một thành phần sẽ chạy với tư cách là người dùng (bạn có thể khởi động tự động bằng cách sử dụng phím Run) và chịu trách nhiệm ánh xạ ổ đĩa mạng. Nó có thể liên hệ với dịch vụ để có được bất kỳ thông tin cần thiết, hoặc thông qua một đường ống được đặt tên hoặc một khóa registry.
Nguồn
2011-12-05 18:21:55
http://www.ljcreate.com/support/faqs/answers.asp?ID=1254 có trợ giúp không? –
Đã thêm "OS: Win XP", vì vậy không thực sự, nhưng cảm ơn. –
Có nhiều cách khác nhau (phức tạp) có thể thực hiện được. Một là nhân đôi mã thông báo người dùng liên kết với một trong các quy trình tương tác và sau đó gọi CreateProcessAsUser. Khác là bằng cách tiêm một cuộc gọi đến NetUseAdd vào một trong các quy trình tương tác. Nhưng nó gần như chắc chắn sẽ hợp lý hơn khi chỉ chạy mã của bạn trong ngữ cảnh tương tác để bắt đầu. Để nhắc lại câu hỏi của Werner: bạn đang cố gắng làm gì? –