2012-07-20 39 views
20

मैं कुछ घंटों तक इस पर अटक गया हूं जब तक कि मैं अंत में ऐसा करने में कामयाब रहा। वहां पहले से ही लिंक जो मुझे सही दिशा ओर इशारा कर रहे हैं:एप्लिकेशन को कैसे चलाया जाए जिसके लिए व्यवस्थापक अधिकारों की आवश्यकता होती है, जिनके पास

लेकिन मैं सोचा है कि इस समस्या का सरल सिंहावलोकन कोई मदद कर सकता है :)।

+0

['लॉगऑनसर '] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa378184 (v = vs.85) .aspx) अच्छी तरह से काम करना चाहिए, मुझे लगता है। यह विवरण में प्रक्रियाओं को सही बनाने का उल्लेख करता है। – chris

+0

.... आपका प्रश्न क्या है? –

+2

ऐसा नहीं है, यह उन लोगों के लिए एक समाधान है जो I – Samuel

उत्तर

27

रियल समस्या: (विकिपीडिया से: http://en.wikipedia.org/wiki/User_Account_Control)

एक निष्पादन योग्य है कि "requireAdministrator" उसके मेनिफ़ेस्ट में के रूप में चिह्नित किया गया है CreateProcess का उपयोग कर एक गैर ऊपर उठाया प्रक्रिया से शुरू नहीं किया जा सकता है()। इसके बजाय, ERROR_ELEVATION_REQUIRED वापस कर दिया जाएगा। ShellExecute() या ShellExecuteEx() का उपयोग इसके बजाय किया जाना चाहिए।

(Btw, ERROR_ELEVATION_REQUIRED त्रुटि == 740)

समाधान: (एक ही साइट)

एक देशी Win32 आवेदन एक ही "runas" क्रिया एक ShellExecute में जोड़ा जा सकता में() या ShellExecuteEx() कॉल करें।

ShellExecute(hwnd, "runas", "C:\\Windows\\Notepad.exe", 0, 0, SW_SHOWNORMAL);

यह भी सहायक हो सकता है: (स्रोत: http://mark.koli.ch/2009/12/uac-prompt-from-java-createprocess-error740-the-requested-operation-requires-elevation.html)

2 - मूल यूएसी फ्लो

ठीक है, तो इससे पहले कि आप इसे में खुदाई, मैंने सोचा कि यह हो सकता है एक यूएसी जागरूक आवेदन के बुनियादी प्रवाह की व्याख्या करने के लिए सहायक हो और सबकुछ एक साथ कैसे फिट बैठता है। आम तौर पर, आपका एप्लिकेशन एक अप्रतिबंधित उपयोगकर्ता के रूप में चलता है। लेकिन, कभी-कभी इसे एक प्रशासक होना चाहिए (जो भी करना है)। तो, यहाँ मूल विचार है, छद्म कोड में:

if(0 == CreateProcess(argv[2], params, NULL, NULL, false, 0, NULL, NULL, &si, &pi)) { 
     //runas word is a hack to require UAC elevation 
     ShellExecute(NULL, "runas", argv[2], params, NULL, SW_SHOWNORMAL); 
} 

और बस completness की खातिर - ShellExecute और CreateProcess के लिए MSDN लिंक:

int main (int argc, char **argv) { 

    HRESULT operation = tryToDoSomethingPrivileged(); 

    if (operation == ACCESS_DENIED && !alreadyElevated) { 

    // Spawn a copy of ourselves, via ShellExecuteEx(). 
    // The "runas" verb is important because that's what 
    // internally triggers Windows to open up a UAC prompt. 
    HANDLE child = ShellExecuteEx(argc, argv, "runas"); 

    if (child) { 
     // User accepted UAC prompt (gave permission). 
     // The unprivileged parent should wait for 
     // the privileged child to finish. 
     WaitForSingleObject(child, INFINITE); 
     CloseHandle(pid); 
    } 
    else { 
     // User rejected UAC prompt. 
     return FAILURE; 
    } 

    return SUCCESS; 

    } 

    return SUCCESS; 

} 

अंत में, इस मैं इसे कैसे किया है है :

http://msdn.microsoft.com/en-us/library/bb762153%28v=vs.85%29.aspx

http://msdn.microsoft.com/en-us/library/ms682425%28VS.85%29.aspx

+0

मैंने अपने एक ऐप में एक ही दृष्टिकोण का उपयोग किया है (एक एकल विशेषाधिकार प्राप्त कार्य करने के लिए "रनस" के माध्यम से स्वयं की एक उन्नत प्रतिलिपि बनाना, जहां स्पॉन्डेड बाल प्रक्रिया के लिए कमांड लाइन यह बताती है कि कौन सा कार्य करना है), और यद्यपि ऐसा नहीं है कि माइक्रोसॉफ्ट लोगों को यूएसी ऊंचाई का उपयोग करने के लिए कैसे पसंद करता है, यह उन मामलों में काम करता है जहां मुख्य पर एक यूएसी प्रकट होता है .exe ओवरकिल है। माइक्रोसॉफ्ट विशेषाधिकार प्राप्त कार्य को अपने स्वयं के .exe में एक यूएसी मेनिफेस्ट के साथ पसंद करता है, या अपने स्वयं के COM ऑब्जेक्ट में जो COM ऊंचाई मॉनीकर के माध्यम से तत्काल होता है। –

+3

ShellExecuteEx एक तर्क लेता है, SHELLEXECUTEINFO के लिए एक सूचक। http://msdn.microsoft.com/en-us/library/windows/desktop/bb762154(v=vs.85).aspx –

+1

मैंने नोट किया कि दस्तावेज़ों में "रनस" ऑपरेशन का उल्लेख दूसरों के बीच नहीं किया गया है (ShellExecute के): यहां तक ​​कि उस पृष्ठ पर कुछ उपयोगकर्ता ने तर्क दिया कि क्या इसका उपयोग सुरक्षित है या नहीं। तथ्य यह है कि यह काम करता है भरोसेमंद नहीं है (क्योंकि आपको इसे जांचना है और कुछ मामलों में यह काम नहीं कर सकता है) क्योंकि दस्तावेज के कुछ टुकड़े इसे बताते हैं। क्या कोई ऐसा व्यक्ति है जिसके पास रनस की विश्वसनीयता के बारे में कुछ संदर्भ है? – reallynice