2010-09-22 35 views
6

Tôi có ứng dụng C# chạy và hiển thị biểu tượng khay. Tôi có một trình cài đặt cho ứng dụng khay của tôi, ứng dụng này sẽ khởi chạy ứng dụng sau khi cài đặt. Trình cài đặt yêu cầu quyền quản trị trong khi biểu tượng khay phải được chạy với quyền bình thường. Trình cài đặt của tôi hiện đang phá vỡ điều này - khi ứng dụng khay được cài đặt được khởi chạy, nó thừa kế quyền quản trị từ quá trình cài đặt.Cách khởi chạy chương trình với quyền người dùng thay vì cho phép hoạt động

Là một phần của trình cài đặt, tôi khởi chạy ứng dụng C# để thực hiện một số công việc tùy chỉnh. Ứng dụng nhỏ này hiện đang khởi chạy ứng dụng khay bằng cách gọi:

Process.Start(@"path/to/my/tray/app.exe"); 

Có cách nào để gọi ứng dụng khay với quyền của người dùng hiện tại hơn là quyền được cấp cho trình cài đặt không?

Tôi đã nghe rằng cách được khuyến nghị để thực hiện việc này là phải có một EXE bao quanh trình cài đặt khởi chạy trình cài đặt rồi khởi chạy chương trình đã cài đặt. Tôi muốn tránh điều này nếu có thể.

Tôi đang sử dụng WiX để xây dựng trình cài đặt MSI nên tôi cũng sẽ chấp nhận các giải pháp hoạt động trực tiếp từ WiX/MSI.

Trả lời

0

Câu hỏi rất hay. Các câu trả lời tôi thấy rằng công việc bề ngoài là một chút lộn xộn; thanh lịch tổng thể nhất là trình bao bọc EXE.

Hãy xem bài viết này: http://www.codeproject.com/KB/vista-security/RunNonElevated.aspx. Nó mô tả một phương pháp mà bạn có thể có được một hook bản địa đến một trong các cửa sổ shell, mà chạy không nâng lên, và yêu cầu trình bao để bắt đầu mã của bạn cho bạn. Các móc bản địa trong C# yêu cầu các quyền CAS rất cao; để có được các điều khoản này, trình cài đặt của bạn phải được đặt tên và ký tên mạnh mẽ và mã phải yêu cầu hoặc xác nhận SecurityPermission với SecurityPermissionFlag.UnmanagedCode.

Lớp ProcessStartInfo của .NET Framework cũng chứa thuộc tính UseShellExecute Boolean, khi được thiết lập, thông báo cho Process.Start() để thực hiện cuộc gọi này đến trình bao thay vì bắt đầu quá trình trực tiếp từ miền ứng dụng hiện tại. Tôi không biết nếu điều này sẽ làm điều đó bạn cần, nhưng nó chắc chắn dễ dàng hơn nhiều để thử; bạn chỉ cần sử dụng quá trình ProcessStartInfo của Process.Start(), với một ProcessStartInfo đã khai báo có bộ cờ.

Hãy nhớ rằng bạn không thể yêu cầu trình bao bắt đầu EXE với tư cách người dùng khác với người dùng hiện đã đăng nhập (UserName và Mật khẩu không được đặt trên ProcessStartInfo). Bạn cũng phải chỉ định đường dẫn đến EXE bằng thuộc tính WorkingDirectory.

+0

UseShellExecute dường như được đặt mặc định thành true nên có vẻ như điều này sẽ không giúp ích dù tôi chưa thử nó. Cảm ơn câu trả lời của bạn nhưng tôi nghi ngờ rằng exe wrapper sẽ là giải pháp "gọn gàng" duy nhất. – mchr

+0

Tôi hiện đã thử nghiệm tính năng này và nó không hoạt động. Tôi cũng đã thử một dll C++ gọi http://msdn.microsoft.com/en-us/library/aa446583%28v=vs.85%29.aspx và khởi chạy bằng cách sử dụng mã thông báo bảo mật mới. Tuy nhiên, điều này không thể thay đổi người dùng sở hữu quy trình được khởi chạy - chỉ các quyền mà quy trình khởi chạy có. – mchr

3

Có hai cách tiếp cận. Cách đơn giản nhất là sử dụng exe shell để khởi chạy tác vụ quản trị viên đầu tiên (nhiều cách để làm điều này; tôi thích tệp kê khai) và sau đó tác vụ khác không được nâng lên. Nếu bạn từ chối làm điều đó vì lý do gì thì hãy xem bài đăng trên blog và dự án CodePlex tôi liên kết đến từ bài đăng trên blog của tôi về điều này: http://www.gregcons.com/KateBlog/NonElevatedFromElevatedManagedThisTime.aspx

1

Hoặc bạn có thể sử dụng số Windows API CreateProcessAsUser.

+0

Điều này làm việc cho tôi như một cách để chạy tác vụ được lập lịch khi người dùng đã đăng nhập từ dịch vụ –

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