2011-10-12 48 views
7

我想調用更新程序來檢查更新(而不是實際執行更新,但只檢查是否有更新)。我想在背景中默默地做到這一點。如果有更新,我會要求用戶提升權限並運行更新。檢查包括讀取應用程序目錄中的文件,並將其中找到的版本與網站上的版本進行比較。如何在沒有提升的情況下執行應用程序?

我該如何在沒有提升的情況下運行它才能檢查? QProcess::start()失敗,因爲它需要提升的權限和ShellExecute只適用於如果我添加「runas」動詞出於同樣的原因(我只想要,如果實際上將在該目錄中寫入,即我想執行更新)。我猜我需要添加某種清單,但我不知道它的內容。

回答

10

因此,事實證明,我有另一個錯誤,導致無升級運行分支在所有情況下運行。我在帖子中描述的模型工作。爲避免Windows推斷提升權限的需要,您需要添加清單資源。 (例如,如果你的應用程序exe文件的名稱中包含單詞「更新」將觸發)

清單的內容如下:

<?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> 

到您的.exe取決於它編譯你的編譯器和環境,所以我只顯示我的:Qt Creator的和MinGW-GCC:

創建的資源包含以下內容的RC文件:

1 24 DISCARDABLE manifest.xml 

該RC文件添加到您的.pro這樣的:

win32:RC_FILE = resources.rc 

在此之後,ShellExecute的無動詞放慢參數將不擡高運行,並使用「運行方式」將擡高運行它。

+0

這大致就是我所說的。 –

+3

我更喜歡這個答案。少說話,多寫代碼。 –

0

我建議使用這些方案之一:

  • 把該文件在用戶的配置文件,而不是
  • 在這情況下,該文件的
  • 將內容複製到用戶的配置文件的只讀模式,然後運行應用程序的路徑QProcess::start()
  • 包括.qrc文件內部的文件,然後將其解壓到用戶的個人資料中的失敗的情況下讀取或運行QProcess::start()
4

由於某種原因,當應用程序請求時會出現提示提示。您可以使用應用程序清單來控制它。有關如何添加清單的詳細信息,請參閱Create and Embed an Application Manifest (UAC)文章。

我建議你如下:

  1. 獨立的更新更新檢查,讓他們在不同的.exe文件。
  2. UpdateChecker.exe不需要管理員權限,因此requestedExecutionLevel清單中的元素具有asInvoker級別。
  3. Updater.exe需要管理員權限,因爲它會將更新的應用程序文件寫入Program Files。因此requestedExecutionLevel其清單元素有requireAdministrator級別。

在你的程序中,你可以以任何你喜歡的方式啓動UpdateChecker.exe。要啓動Updater.exe,您必須使用ShellExecute;如果應用程序具有清單(並強烈建議嵌入清單),則應用程序需要管理員權限時,它將顯示UAC提示提升。沒有必要使用runas動詞。

或者,您可以檢查更新是否適用於您的主應用程序。只有在服務器上有新版本時才啓動Updater.exe。


另一個選擇是使Updater.exe都檢查更新並應用它,如果有更新,就像現在一樣。在這種情況下,Updater.exe的清單中應該有asInvoker級別。當它啓動時,沒有參數,它檢查服務器上是否有新版本。如果它找到較新的版本,則以管理員權限重新啓動自身並傳遞一個命令行參數,例如/doUpdate,它指示它執行實際更新。

爲了重新啓動本身提升,它必須使用ShellExecute函數和runas動詞,因爲ShellExecute將無法​​自動檢測到您的Updater.exe現在需要管理權限。

請記住,在Windows XP和Windows Vista/7中,runas動詞的含義不同,因此如果您要支持以前版本的Windows,則應該處理這種情況。我描述的第一種方法可以在Windows XP上運行,無需額外處理。

+0

感謝您的詳細解答!我將在週一進一步調查這個問題,並可能會採用分裂解決方案。我檢查了wyUpdate(商業更新程序)中的清單,該清單既執行檢查和更新,也將其設置爲儘可能最低的「asInvoker」權限級別。我可能忽略了一些東西,它可能按我原先的計劃工作。我會告訴你。 –

+0

我做過了,如果您有興趣,請查看下面的答案。 –

+0

@TamásSzelei感謝發佈更新。 –

相關問題