2011-02-04 7 views
24

विन 7/यूएसी मुझे पागल कर रहा है।मैं एक बाल प्रक्रिया कैसे चला सकता हूं जिसके लिए ऊंचाई की आवश्यकता है और प्रतीक्षा करें?

मेरे सी ++ एप्लिकेशन के भीतर से, मुझे एक निष्पादन योग्य चलाने की आवश्यकता है जिसके लिए विंडोज 7 पर उन्नयन की आवश्यकता है। मैं इस चीज़ को आग लगाना चाहता हूं और आगे बढ़ने से पहले इसे समाप्त करना चाहता हूं। ऐसा करने का सबसे आसान तरीका क्या है?

मैं आमतौर पर CreateProcess() के माध्यम से इस तरह की चीज करता हूं, लेकिन यह निष्पादन योग्यों के लिए विफल रहता है जिनके लिए ऊंचाई की आवश्यकता होती है।

मैंने cmd.exe /c ...CreateProcess के माध्यम से चलने का प्रयास किया, जो काम करता है लेकिन एक बदसूरत cmd टर्मिनल विंडो पॉप अप करता है।

मैं पढ़ रहा हूं कि ShellExecute() ऊंचाई को अनुमति देगा, लेकिन यह ShellExecute() का उपयोग करते समय exe को समाप्त करने के लिए प्रतीक्षा करना आसान नहीं लगता है। कुछ आसान system() काम करेगा?

किसी अन्य विचार की बहुत सराहना की जाती है!

उत्तर

39

उपयोग ShellExecuteEx, बजाय ShellExecute। यह फ़ंक्शन उस प्रक्रिया को समाप्त करने तक अवरुद्ध करने के लिए उस हैंडल पर WaitForSingleObject पर कॉल करने के लिए उपयोग की जा सकने वाली प्रक्रिया के लिए एक हैंडल प्रदान करेगा। अंत में, बस इसे बंद करने के लिए प्रक्रिया संभाल पर CloseHandle पर कॉल करें।

नमूना कोड (त्रुटि जाँच के सबसे स्पष्टता और संक्षिप्तता के लिए छोड़ दिया जाता है):

SHELLEXECUTEINFO shExInfo = {0}; 
shExInfo.cbSize = sizeof(shExInfo); 
shExInfo.fMask = SEE_MASK_NOCLOSEPROCESS; 
shExInfo.hwnd = 0; 
shExInfo.lpVerb = _T("runas");    // Operation to perform 
shExInfo.lpFile = _T("C:\\MyApp.exe");  // Application to start  
shExInfo.lpParameters = "";     // Additional parameters 
shExInfo.lpDirectory = 0; 
shExInfo.nShow = SW_SHOW; 
shExInfo.hInstApp = 0; 

if (ShellExecuteEx(&shExInfo)) 
{ 
    WaitForSingleObject(shExInfo.hProcess, INFINITE); 
    CloseHandle(shExInfo.hProcess); 
} 

lpVerb के लिए "runas" क्रिया निर्दिष्ट क्या आवेदन के बारे में शुरू होने की बात यह है कि ऊंचे होने यूएसी कारण बनता है। यह एप्लिकेशन के मैनिफेस्ट में "आवश्यकता प्रशासक" की अनुमति स्तर को सेट करने के बराबर है। इसे एक प्रशासक और सीमित उपयोगकर्ता दोनों के लिए यूएसी ऊंचाई की आवश्यकता होगी।

लेकिन यह ध्यान देने योग्य है कि जब तक कि बिल्कुल जरूरी न हो, आपको उस एप्लिकेशन में एक मैनिफेस्ट जोड़ने का "मानक" तरीका पसंद करना चाहिए जिसे आप लॉन्च करना चाहते हैं जो इसके आवश्यक निष्पादन स्तर को निर्दिष्ट करता है। यदि आप इस मार्ग पर जाते हैं, तो आप lpVerb के रूप में बस "खुला" पास करेंगे। एक नमूना प्रकट नीचे दिखाया गया है:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
     <dependency> 
       <dependentAssembly> 
         <assemblyIdentity 
           type="win32" 
           name="Microsoft.Windows.Common-Controls" 
           version="6.0.0.0" 
           processorArchitecture="X86" 
           publicKeyToken="6595b64144ccf1df" 
           language="*" 
         /> 
       </dependentAssembly> 
     </dependency> 
     <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
       <security> 
         <requestedPrivileges> 
           <requestedExecutionLevel 
             level="requireAdministrator" 
             uiAccess="false"/> 
         </requestedPrivileges> 
       </security> 
     </trustInfo> 
</assembly> 

अंत में, यह सुनिश्चित करें कि जो कुछ भी अपने आवेदन में तत्व प्रक्रिया यूएसी ऊंचाई की आवश्यकता होती है के निष्पादन से चलाता है marked accordingly है या नहीं। उपयोगकर्ता इंटरफ़ेस में इसे मॉडल करने का आपका काम है; विंडोज़ आपके लिए इसे संभाल नहीं करता है।यह प्रविष्टि बिंदु पर शील्ड आइकन प्रदर्शित करके किया जाता है;

                UAC shield displayed on a button                                            : उदाहरण के लिए 10                         UAC shield displayed on a menu item

+0

यह अच्छा लग रहा है और बहुत ही गहन है, धन्यवाद के वारिस नहीं है से शुरू करने के लिए है करने के लिए एक ही रास्ता पारित! मेरे बच्चे exe पहले से ही इसके रूप में "आवश्यकता प्रशासक" के रूप में चिह्नित किया गया है; क्षमा करें, इसके बारे में स्पष्ट होना चाहिए था। – KenG

+1

@ केएनजी: आपका स्वागत है; मुझे खुशी है कि यह आपके लिए काम करता है। मैंने मूल रूप से यह माना था कि आपके पास प्रकट हुआ था और बस निष्पादित करने और प्रतीक्षा करने की कोशिश कर रहा था, लेकिन बाद में मुझे एहसास हुआ कि आपका प्रश्न वास्तव में यह नहीं कहता था, इसलिए मैं वापस गया और कुछ और विवरण जोड़े। इस तरह, मुझे संदेह है कि मेरा जवाब भी भविष्य में दूसरों के लिए उपयोगी होगा। –

+1

यदि ऐप तैयार किया जा रहा है तो इसमें यूएसी मैनिफेस्ट है, तो आप 'CreateProcess()' का उपयोग कर सकते हैं, आपको 'ShellExecutEx() 'का उपयोग करने की आवश्यकता नहीं है। ऐप के मेनिफेस्ट ऐसा करने के लिए कहता है, 'CreateProcess()' आवश्यक यूएसी प्रॉम्प्ट और एलिवेशन करता है। –

0

आप क्या कर सकते हैं बच्चे की प्रक्रिया "stdin" (जैसे कि आप उस प्रक्रिया में इनपुट को रीडायरेक्ट करना चाहते थे) के लिए एक पाइप बनाते हैं और पाइप को तोड़ने की प्रतीक्षा करते हैं।

ध्यान दें कि प्रक्रिया वास्तव में पुनर्निर्देशित इनपुट प्राप्त नहीं करेगी।

उदा। यदि आप

echo help | diskpart 

करने के लिए unelevated कमांड प्रॉम्प्ट से कोशिश आप ऊंचाई देखेंगे और जब तक आप अलग विंडो को बंद कमांड विंडो इंतजार करेंगे।

0

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

वैसे, शैलएक्सैक कॉल काम नहीं करेगा यदि आप अपने ऐप को प्रोग्राम फाइल निर्देशिका आदि जैसे सुरक्षित स्थान से लॉन्च कर रहे हैं, तो पहले से ही सेवा मॉडल में जाने से पहले।

तो अपने प्रक्रिया शुरू करने के लिए और से यूएसी, यह एक प्रक्रिया पहले से ही सुरक्षा के लिए विशेषाधिकार प्राप्त

+0

'शैलएक्सक्यूट/एक्स() 'निर्दिष्ट" रनस "क्रिया के साथ निर्दिष्ट प्रक्रियाओं को लॉन्च कर सकता है प्रोग्राम फ़ाइलें फ़ोल्डर में यदि कॉलिंग ऐप ऊंचा नहीं है। मैं इसे अपनी परियोजनाओं में से एक में करता हूं, यह ठीक काम करता है। –

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

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