2011-10-12 20 views
7

Tôi muốn gọi trình cập nhật để kiểm tra các bản cập nhật (không thực sự cập nhật nhưng chỉ kiểm tra nếu có). Tôi muốn làm điều này trong nền và âm thầm. Nếu có bản cập nhật, tôi sẽ yêu cầu người dùng cấp quyền truy cập và chạy trình cập nhật với điều đó. Việc kiểm tra liên quan đến việc đọc một tệp trong thư mục của ứng dụng và so sánh phiên bản được tìm thấy trong đó với một tệp trên trang web.Làm cách nào để thực thi một ứng dụng mà không có độ cao?

Tôi làm cách nào để chạy mà không có độ cao chỉ để kiểm tra? QProcess::start() không thành công vì nó cần quyền cao và ShellExecute chỉ hoạt động nếu tôi thêm động từ "runas" vì lý do tương tự (mà tôi chỉ muốn nếu có thực sự viết trong thư mục đó tức là tôi muốn thực hiện cập nhật). Tôi đoán tôi cần phải thêm một số loại biểu hiện nhưng tôi không biết nội dung của nó.

Trả lời

10

Vì vậy, hóa ra tôi đã có một lỗi khác khiến cho nhánh chạy không nâng cao chạy trong mọi trường hợp. Mô hình tôi mô tả trong bài đăng hoạt động. Để tránh Windows suy ra sự cần thiết phải có quyền nâng cao, bạn cần thêm tài nguyên tệp kê khai. (Ví dụ, nếu tên của exe ứng dụng của bạn có chứa từ "updater" nó sẽ được kích hoạt)

Nội dung của biểu hiện như sau:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
     <security> 
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> 
       <requestedExecutionLevel level="asInvoker" uiAccess="false" /> 
      </requestedPrivileges> 
     </security> 
    </trustInfo> 
</assembly> 

Biên soạn nó để .exe của bạn phụ thuộc vào bạn tôi biên dịch và môi trường, vì vậy tôi chỉ hiển thị: Qt Creator và mingw-gcc:

Tạo một file rc cho các nguồn lực với các nội dung sau đây:

1 24 DISCARDABLE manifest.xml 

Thêm tập tin này để rc .pro của bạn như thế này:

win32:RC_FILE = resources.rc 

Sau này, nếu không có sự ShellExecute paramter động từ sẽ chạy mà không có độ cao, và sử dụng "runas" sẽ chạy nó với độ cao.

+0

Đây là những gì tôi nói. –

+3

Tôi thích câu trả lời này tốt hơn. Ít nói, nhiều mã hơn. –

0

tôi đề nghị sử dụng một trong những kịch bản:

  • đặt tập tin đó trong hồ sơ cá nhân của người dùng thay vì con đường ứng dụng của
  • nội dung
  • bản sao của tập tin đó để lý lịch thành viên trong trường hợp nó trong chế độ chỉ đọc sau đó chạy QProcess::start()
  • bao gồm tập tin bên trong .qrc tập tin sau đó giải nén nó vào lý lịch thành viên trong trường hợp thất bại của đọc hoặc chạy QProcess::start()
4

Lời nhắc độ cao xuất hiện khi ứng dụng của bạn yêu cầu, vì một lý do nào đó. Bạn có thể kiểm soát nó bằng tệp kê khai ứng dụng. Xem bài viết Create and Embed an Application Manifest (UAC) để biết chi tiết về cách thêm tệp kê khai.

tôi sẽ đề nghị bạn như sau:

  1. riêng của bạn UpdaterUpdate Checker, để chúng trong các tập tin .EXE khác nhau.
  2. UpdateChecker.exe không yêu cầu quyền quản trị viên, và do đó requestedExecutionLevel phần tử của tệp kê khai có mức asInvoker.
  3. Updater.exe yêu cầu đặc quyền của quản trị viên vì nó ghi tệp ứng dụng đã cập nhật vào Tệp chương trình. Do đó, requestedExecutionLevel phần tử của tệp kê khai của nó có cấp độ requireAdministrator.

Trong chương trình của bạn, bạn có thể khởi chạy UpdateChecker.exe theo bất kỳ cách nào bạn muốn. Để bắt đầu Updater.exe, bạn sẽ phải sử dụng ShellExecute; nếu ứng dụng có tệp kê khai (và tôi khuyên bạn nên nhúng tệp kê khai), nó sẽ hiển thị lời nhắc UAC cho độ cao nếu ứng dụng muốn đặc quyền của quản trị viên. Không cần sử dụng động từ runas.

Hoặc bạn có thể kiểm tra xem bản cập nhật có khả dụng hay không từ ứng dụng chính của bạn. Và khởi động Updater.exe chỉ khi có một phiên bản mới trên máy chủ.


Một tùy chọn khác sẽ làm cho Updater.exe kiểm tra cập nhật và áp dụng nếu có, giống như bạn làm ngay bây giờ. Trong trường hợp này Updater.exe cần có mức asInvoker trong tệp kê khai của nó. Khi nó bắt đầu, không có thông số, nó sẽ kiểm tra xem có phiên bản mới trên máy chủ hay không.Nếu nó tìm thấy phiên bản mới hơn, nó tự động khởi chạy lại với đặc quyền của quản trị viên và chuyển thông số dòng lệnh, ví dụ: /doUpdate, hướng dẫn nó thực hiện cập nhật thực tế.

Để tự khởi động lại, nó phải sử dụng chức năng ShellExecuterunas động từ, vì ShellExecute sẽ không thể tự động phát hiện Updater.exe của bạn hiện yêu cầu quyền quản trị.

Hãy nhớ rằng ý nghĩa của runas động từ khác nhau giữa Windows XP và Windows Vista/7, vì vậy bạn nên xử lý tình huống này nếu bạn muốn hỗ trợ các phiên bản trước của Windows. Cách tiếp cận đầu tiên tôi mô tả sẽ hoạt động trên Windows XP mà không cần xử lý thêm.

+0

Cảm ơn câu trả lời chi tiết! Tôi sẽ điều tra vấn đề thêm vào thứ hai và có thể đi với giải pháp tách. Tôi đã kiểm tra tệp kê khai trong wyUpdate (một trình cập nhật thương mại) thực hiện cả việc kiểm tra và cập nhật và nó được đặt thành cấp phép "asInvoker", mức thấp nhất có thể. Tôi có thể đã bỏ qua một cái gì đó, nó có thể làm việc như tôi đã lên kế hoạch ban đầu. Tôi sẽ cho bạn biết. –

+0

Tôi đã làm, nếu bạn quan tâm, hãy xem câu trả lời của tôi bên dưới. –

+0

@ TamásSzelei Cảm ơn bạn đã đăng cập nhật. –

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