2011-01-09 32 views
7

nềnCấp đặc quyền của quản trị viên cho một ứng dụng được khởi chạy khi khởi động mà không có nhắc nhở UAC?

Tôi đã viết một nhỏ C# /. NET 4.0 ứng dụng đồng bộ hóa các thiết lập khác nhau từ một trò chơi được cài đặt trong Program Files đến và đi từ các bản sao khác của cùng một trò chơi trên các máy khác nhau (nghĩ Chrome đồng bộ bookmark, nhưng đối với trò chơi này). Đồng bộ chính nó là một việc tương đối đơn giản, xử lý các tệp được lưu trữ bên trong thư mục Program Files của trò chơi.

Trên máy của tôi, tính năng này hoạt động tốt mà không phải nâng cấp ứng dụng của tôi thông qua UAC. Windows 7 làm cho trò chơi sử dụng ảo hóa chương trình tập tin và ứng dụng của tôi hoạt động tốt với điều đó.

Tuy nhiên, trên rất nhiều máy kiểm tra, tôi nhận được báo cáo rằng ứng dụng không thể hoạt động với các tệp và trong các trường hợp đến thậm chí không thể xem thư mục của trò chơi! Việc người dùng nhấp chuột phải và "Chạy với tư cách quản trị viên" sẽ giải quyết được sự cố trong mọi trường hợp.

Vì vậy, chúng tôi chỉ cần đặt tệp kê khai của ứng dụng để yêu cầu đặc quyền quản trị, phải không? Đó là tốt (mặc dù không lý tưởng) khi người dùng gọi thủ công ứng dụng hoặc quá trình đồng bộ hóa vì họ sẽ tương tác với ứng dụng và sẵn sàng chấp nhận yêu cầu UAC.

Tuy nhiên, một trong những tính năng của ứng dụng của tôi là tùy chọn "Tự động đồng bộ hóa", cho phép người dùng "đặt và quên" ứng dụng. Với tập này, ứng dụng sẽ tự đặt vào sổ đăng ký tại HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Run để chạy lúc khởi động và nằm trong khay hệ thống đồng bộ các cài đặt trong nền khi cần.

Rõ ràng, tôi cần phải thông minh hơn ở đây. Trình bày một dấu nhắc UAC ngay sau khi người dùng đăng nhập vào tài khoản của họ hoặc trong khoảng thời gian ngẫu nhiên sau đó không phải là cách để chuyển tiếp.

Vì vậy, câu hỏi của tôi!

Cách tốt nhất để tiếp cận tình huống mà tôi cần chạy một ứng dụng khi khởi động cần đặc quyền quản trị viên là gì? Có cách nào để người dùng cho phép cài đặt khiến hệ thống tự động chạy ứng dụng với các đặc quyền chính xác mà không cần nhắc nhở khi khởi động/đăng nhập không?

Cập nhật Chỉ cần rõ ràng, điều này phải đạt được trong mã.

+1

Tôi nghĩ điều này sẽ khai sáng cho bạn: http://stackoverflow.com/questions/2488632/win-c-run-app-as-administrator-without-uac-prompt/2488645#2488645 Chúc mừng :) – Machinarius

Trả lời

6

Bạn nên xem xét việc thực hiện chức năng Đồng bộ hóa của mình trong Dịch vụ Windows. Đây là phương pháp ưa thích để chạy chức năng 'nền' trên Windows.

Dịch vụ có thể chạy dưới tài khoản của người dùng (giả sử họ có quyền sửa đổi tệp) hoặc bạn có thể sử dụng một tài khoản khác. Trường hợp xấu nhất, bạn có thể chạy như SYSTEM (mặc dù, đây không phải là thực hành tốt nhất).

Nếu bạn đã có chức năng xử lý nền của bạn hoạt động, thì đây sẽ là một quá trình đơn giản để chuyển đổi sang Dịch vụ.

Có một dự án mẫu ở đây đó sẽ đặt bạn vào con đường đúng đắn: http://www.codeproject.com/KB/dotnet/simplewindowsservice.aspx

+0

Cảm ơn - cài đặt như một dịch vụ có vẻ là cách để làm. Cảm ơn! – iKenndac

2

Tôi sẽ sử dụng tên miền không gian an ninh và kiểm tra nội tuyến cho vai trò người dùng.

using System.Threading; 
using System.Security.Principal; 

namespace StackOverflow_Demo 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); 
     WindowsPrincipal currentPrincipal = (WindowsPrincipal) Thread.CurrentPrincipal; 

     if (currentPrincipal.IsInRole("Administrators")) 
     { 
      // continue programm 
     } 
     else 
     { 
      // throw exception/show errorMessage - exit programm 
     } 
    } 
    } 
} 

Người dùng hiện tại có thể khởi động ứng dụng của bạn và sẽ nhận được thông báo nếu anh không phải là thành viên của vai trò quản trị viên!

Hy vọng điều này có thể hữu ích!

+0

Cảm ơn, nhưng đó không phải là câu trả lời cho câu hỏi mà tôi đã hỏi! – iKenndac

+0

oh Tôi xin lỗi, tôi chỉ đọc lại câu hỏi ban đầu của bạn. Dường như việc sử dụng dịch vụ cửa sổ có thể là một lựa chọn tốt. Trong trường hợp tôi tìm một giải pháp khác, tôi sẽ đăng nó ... –

1

Vì bạn đã đề cập khi chạy lúc khởi động, tại sao không sử dụng tác vụ theo lịch thay vì những gì bạn đang làm với sổ đăng ký? Bạn có thể thiết lập chúng từ mã - có a project on CodePlex về cơ bản là một trình bao bọc được quản lý để lưu bạn phải tự mình thực hiện PInvokes. Bạn chạy ứng dụng "thiết lập tác vụ khởi động" nhỏ của mình được nâng lên và nó chỉ định rằng ứng dụng sẽ khởi chạy được nâng lên và người dùng thậm chí sẽ không được nhắc. Tôi tin đó là câu trả lời cho câu hỏi trong đoạn cuối của bạn.

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