2011-10-12 16 views
7

मैं अद्यतनों की जांच करने के लिए एक अद्यतनकर्ता को आमंत्रित करना चाहता हूं (वास्तव में अद्यतन करने के लिए नहीं, बल्कि केवल जांच करें कि कोई है या नहीं)। मैं इसे पृष्ठभूमि में और चुपचाप करना चाहता हूं। यदि कोई अपडेट है, तो मैं उपयोगकर्ता को उन्नत अनुमतियों के लिए पूछूंगा और उसके साथ अद्यतनकर्ता चलाऊंगा। जांच में एप्लिकेशन की निर्देशिका में एक फ़ाइल पढ़ने और वेबसाइट पर किसी के साथ उस संस्करण की तुलना करना शामिल है।उन्नयन के बिना एक ऐप निष्पादित करने के लिए कैसे?

मैं इसे जांचने के लिए ऊंचाई के बिना कैसे चला सकता हूं? QProcess::start() विफल रहता है क्योंकि इसे ऊंचा अनुमति की आवश्यकता होती है और ShellExecute केवल तभी काम करता है जब मैं उसी कारण से "रनस" क्रिया जोड़ता हूं (जो मैं केवल तभी चाहता हूं कि उस निर्देशिका में वास्तव में लिख रहे हों यानी मैं एक अद्यतन करना चाहता हूं)। मुझे लगता है कि मुझे कुछ प्रकार का मैनिफेस्ट जोड़ने की ज़रूरत है लेकिन मुझे इसकी सामग्री नहीं पता है।

उत्तर

10

तो यह पता चला है कि मेरे पास एक और बग थी जिसने सभी मामलों में गैर-ऊंची चल रही शाखा को चलाने के लिए प्रेरित किया था। पोस्ट में वर्णित मॉडल मैं काम करता हूं। उन्नत अनुमतियों की आवश्यकता को अवरुद्ध करने वाले विंडोज़ से बचने के लिए, आपको एक मेनिफेस्ट संसाधन जोड़ना होगा। (उदाहरण के लिए, यदि आपका आवेदन 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 पर निर्भर करता है अपने संकलक और पर्यावरण, इसलिए मैं केवल दिखा रहा हूँ मेरा: क्यूटी निर्माता और MinGW-जीसीसी:

1 24 DISCARDABLE manifest.xml 

:

निम्नलिखित सामग्री के साथ संसाधनों के लिए एक आर सी फ़ाइल बनाएँ क्रिया पैरामीटर ऊंचाई के बिना चलेंगे बिना

win32:RC_FILE = resources.rc 

इस के बाद, ShellExecute, और "runas" का उपयोग ऊंचाई के साथ यह चलेंगे: इस तरह से अपनी .pro को यह आर सी फ़ाइल जोड़ें।

+0

यह वही है जो मैंने कहा था। –

+3

मुझे यह जवाब बेहतर लगता है। कम बात, अधिक कोड। –

0

मैं इन परिदृश्यों में से एक का उपयोग करने के लिए सुझाव:

  • उपयोगकर्ता के बजाय प्रोफ़ाइल आवेदन के पथ
  • प्रति यह के मामले में उपयोगकर्ता के प्रोफ़ाइल के लिए उस फ़ाइल की सामग्री में तो चलाने केवल पढ़ने के लिए मोड है उस फ़ाइल डाल QProcess::start()
  • .qrc फ़ाइल के अंदर है कि फ़ाइल को शामिल तो की नाकाम रहने के मामले में उपयोगकर्ता के प्रोफ़ाइल पर उसे निकालने के पढ़ने के लिए या चलाने QProcess::start()
4

एलिवेशन प्रॉम्प्ट तब प्रकट होता है जब आपका एप्लिकेशन अनुरोध करता है, किसी कारण से। आप इसे एप्लिकेशन मैनिफेस्ट के साथ नियंत्रित कर सकते हैं। मैनिफेस्ट को जोड़ने के तरीके के विवरण के लिए Create and Embed an Application Manifest (UAC) आलेख देखें।

मैं तुम्हें सुझाव है निम्नलिखित:

  1. अलग अपने Updater और अद्यतन परीक्षक, ताकि वे विभिन्न .EXE फ़ाइलों में हैं।
  2. UpdateChecker.exe कोई प्रशासक विशेषाधिकारों की आवश्यकता है, और इस तरह requestedExecutionLevel प्रकट का तत्व asInvoker स्तर है।
  3. Updater.exe को व्यवस्थापकीय विशेषाधिकारों की आवश्यकता होती है क्योंकि यह प्रोग्राम फ़ाइलों में अद्यतन एप्लिकेशन फ़ाइल लिखता है। इसलिए requestedExecutionLevel इसके मेनिफेस्ट के तत्व में requireAdministrator स्तर है।

अपने प्रोग्राम में आप UpdateChecker.exe को जो भी चाहें लॉन्च कर सकते हैं। Updater.exe को शुरू करने के लिए आपको ShellExecute का उपयोग करना होगा; यह ऊंचाई के लिए यूएसी संकेत दिखाएगा यदि आवेदन प्रशासक विशेषाधिकारों चाहता है, तो आवेदन (और मैं दृढ़ता से प्रकट एम्बेड करने की सलाह देते हैं) प्रकट किया है। runas क्रिया का उपयोग करने की आवश्यकता नहीं है।

वैकल्पिक रूप से आप देख सकते हैं कि नई जानकारी उपलब्ध करने या अपने मुख्य अनुप्रयोग से नहीं है। और केवल Updater.exe लॉन्च करें जब सर्वर पर कोई नया संस्करण हो।


एक अन्य विकल्प Updater.exe अद्यतन के लिए दोनों की जांच करने और उसे लागू करने के लिए हो सकता है अगर वहाँ एक है, जैसे आप इसे अब क्या। इस मामले में Updater.exe के पास इसके मेनिफेस्ट में asInvoker स्तर होना चाहिए। जब यह शुरू होता है, मानकों बिना , यह जाँच करता है सर्वर पर एक नया संस्करण है कि क्या वहाँ।यदि यह नया संस्करण पाता है, तो यह प्रशासक विशेषाधिकारों के साथ फिर से लॉन्च करता है और एक कमांड-लाइन पैरामीटर पास करता है, उदाहरण के लिए /doUpdate, जो निर्देश देता है कि यह वास्तविक अद्यतन करता है।

क्रम फिर से लांच ही ऊंचा करने के लिए यह क्योंकि ShellExecute स्वचालित रूप से पता लगाने के लिए अपने Updater.exe अब प्रशासनिक विशेषाधिकार की जरूरत में असमर्थ होगा, ShellExecute समारोह और runas क्रिया का उपयोग करना पड़ता है।

ध्यान रखें कि runas क्रिया का अर्थ Windows XP और Windows Vista/7 के बीच भिन्न है, इसलिए यदि आप Windows के पिछले संस्करणों का समर्थन करना चाहते हैं तो आपको इस स्थिति को संभालना चाहिए। मैंने जो पहला दृष्टिकोण वर्णित किया है, वह बिना अतिरिक्त हैंडलिंग के विंडोज़ XP पर काम करेगा।

+0

विस्तृत उत्तर के लिए धन्यवाद! मैं सोमवार को समस्या की जांच करूँगा और विभाजन समाधान के साथ जा सकता हूं। मैंने wyUpdate (एक वाणिज्यिक अद्यतनकर्ता) में मैनिफेस्ट की जांच की है जो जांच और अद्यतन दोनों करता है और यह "asInvoker" अनुमति स्तर पर सेट है जो सबसे कम संभव है। मैंने कुछ अनदेखा कर दिया होगा, जैसा कि मैंने मूल रूप से योजना बनाई थी, यह काम कर सकती है। मैं आपको बता दूँगा। –

+0

मैंने रुचि रखते हैं, यदि आप रुचि रखते हैं, तो नीचे मेरा जवाब देखें। –

+0

@ TamásSzelei अद्यतन पोस्ट करने के लिए धन्यवाद। –

संबंधित मुद्दे