2009-04-07 42 views
5

Tôi có một ứng dụng đang chạy với tư cách người dùng bình thường và một dịch vụ đang chạy dưới dạng hệ thống cục bộ. Tôi muốn ứng dụng có thể yêu cầu dịch vụ bắt đầu lại ứng dụng, khi dịch vụ đã thực hiện một số nội dung khác. (Vì vậy, ứng dụng sẽ không chạy trong khi dịch vụ đang thực hiện "điều"). Để dịch vụ có thể khởi động ứng dụng khi người dùng bắt đầu ứng dụng, nó cần một mã thông báo người dùng. Ứng dụng gửi mã thông báo tới dịch vụ trước khi nó thoát, nhưng token/handle không hợp lệ khi dịch vụ đang cố gắng sử dụng nó. (Điều đầu tiên nó xảy ra với nó là DuplicateTokenEx để nhận mã thông báo chính.)Làm cách nào để nhận được mã thông báo người dùng hợp lệ cho CreateProcessAsUser?

Mã thông báo người dùng luôn chỉ hợp lệ trong quá trình được gọi là OpenProcessToken?

Có cách nào khác có thể thực hiện được không? Tôi không muốn người dùng phải "đăng nhập" vào ứng dụng bằng logonuser. Điều đó sẽ chỉ là ngớ ngẩn. Tôi đoán tôi có thể giao một quy trình xử lý cho "explorer.exe" từ ứng dụng tới dịch vụ mà dịch vụ có thể sử dụng để nhận mã thông báo người dùng, nhưng điều đó sẽ yêu cầu quyền truy cập PROCESS DUP HANDLE ngay. Tôi không vui mừng về giải pháp đó, nhưng có lẽ đó là cách để làm điều đó?

Trả lời

2
+0

Cảm ơn, tôi sẽ đi kèm bài viết đầu tiên, tạo mã thông báo với ZwCreateToken. Đó là một chút lộn xộn để đóng gói tất cả những thứ tôi cần trong một tin nhắn, nhưng dường như đã làm việc cho những người khác .. –

+0

Bài viết đầu tiên dường như có một số lỗi, thứ hai trông khá tốt.Nhưng tôi không chắc chắn lý do tại sao bạn sẽ sử dụng ZwCreateToken (một phương pháp không được tài liệu, không được hỗ trợ và không hoàn toàn ổn định) khi có các phương pháp được làm tài liệu để thực hiện những gì bạn muốn. –

+0

Xin lỗi, ý tôi là thứ hai. Thậm chí không thể tìm thấy đầu tiên. Tôi đang làm một cái gì đó như http://www.apnilife.com/E-Books_apnilife/Windows%20Programming_apnilife/Windows%20NT%20Undocumented%20APIs/1996%20Ch08_apnilife.pdf. Bạn đang đề cập đến CreateToken? –

3

Bạn có nhiều vấn đề ở đây vì vậy tôi sẽ cố gắng giải quyết chúng một cách riêng biệt và bạn có thể sửa cho tôi nếu tôi đã hiểu lầm:

  1. Dường như bạn có dịch vụ và một ứng dụng người dùng không thể thực thi một số chức năng nhất định cùng một lúc. Để đạt được điều này, bạn có dịch vụ dừng ứng dụng, thực hiện chức năng đặc biệt, sau đó khởi động lại ứng dụng. Nếu điều này là đúng thì theo ý kiến ​​của tôi, bạn có một lỗi thiết kế. Thay vì dừng lại, sau đó khởi động lại ứng dụng, bạn nên phối hợp truy cập vào tài nguyên được chia sẻ thông qua loại trừ lẫn nhau bằng cách sử dụng mutex có tên và/hoặc sử dụng phương pháp IPC như ống được đặt tên để truyền đạt ý định.

  2. Mã thông báo người dùng luôn chỉ hợp lệ trong quá trình được gọi là OpenProcessToken? Có, xử lý mã thông báo bạn nhận được là một chỉ mục trong bảng xử lý của quá trình, nó không thể chuyển trực tiếp. Bạn sẽ cần phải sử dụng DuplicateHandle mà có thể là những gì bạn muốn nhưng có thể lộn xộn.

  3. Bạn muốn tìm cách tốt nhất để mã thông báo của người dùng khởi chạy ứng dụng vào phiên (tương tác) của người dùng. Nếu đây là trường hợp, cách tốt nhất là truy xuất mã phiên của người dùng và sử dụng nó. Bạn có thể kiểm tra this article và mã mẫu, trong C# nhưng phải tương đối dễ dàng để chuyển sang ngôn ngữ bạn chọn.

CHỈNH SỬA: Đã cập nhật để bao gồm Windows 2000. Vì bạn đang mở một xử lý cho chính quy trình (nếu cần, quy trình có thể gửi ID tiến trình). Sau đó nó có thể mở mã thông báo gắn liền với quá trình đó, sao chép nó và sử dụng mã thông báo kết quả để khởi động (hoặc khởi chạy lại) ứng dụng đích.

+0

1. Có vẻ như là một lỗi thiết kế. Vấn đề là, dịch vụ có thể muốn nâng cấp ứng dụng: có thể thậm chí không phải là ứng dụng tương tự sẽ được khởi chạy. 2. Đồng ý, đúng vậy. Thay vào đó, tôi sẽ cố tạo một mã thông báo mới. 3. Phải làm việc vào năm 2000, quên đề cập đến ... –

+0

Tại sao dịch vụ không chỉ gọi OpenProcessToken và DuplicateTokenEx chính nó hơn là có quá trình gửi một cái gì đó đến dịch vụ? –

+0

Quá trình tạo không được chạy như hệ thống cục bộ trong trường hợp đó? Nếu tôi làm điều đó tôi có thể cũng chỉ cần gọi CreateProcess và không bận tâm với thẻ người dùng ở tất cả. –

Các vấn đề liên quan