2010-11-10 5 views
10

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

योजना यह एक ऐसा फ़ंक्शन निर्यात करने के लिए है जो एक फ़ंक्शन को एक चरम संख्या के साथ एक सूचक को लेता है और इसे एक अलग संदर्भ में निष्पादित करता है। इस तरह, एक एप्लिकेशन इस ऑब्जेक्ट का उपयोग व्यवस्थापक अधिकारों के साथ कुछ क्रियाओं को करने के लिए कर सकता है, उन्हें केवल उस ऑब्जेक्ट का उपयोग करना है और इसे उस फ़ंक्शन में पॉइंटर पास करना है जिसे अधिकारों के साथ निष्पादित किया जाना है।

यह आंशिक रूप से काम करता है, को कॉल करना CoCreateInstance ठीक हो जाता है, फ़ंक्शन पॉइंटर पास हो जाता है और मेरा फ़ंक्शन निष्पादित होता है। हालांकि, जब मैं इस ऑब्जेक्ट का उदाहरण का उपयोग कर CoCreateInstanceAsAdmin का उपयोग करता हूं, तो समस्याएं होती हैं;


HRESULT CoCreateInstanceAsAdmin(HWND hwnd, REFCLSID rclsid, REFIID riid, __out void ** ppv) 
{ 
// Manual implementation of CreateInstanceAsAdmin 
CComPtr BindCtx; 
HRESULT hr = CreateBindCtx(0,&BindCtx); 
BIND_OPTS3 bo; 
memset(&bo, 0, sizeof(bo)); 
bo.cbStruct = sizeof(bo); 
bo.grfMode = STGM_READWRITE; 
bo.hwnd = hwnd; 
bo.dwClassContext = CLSCTX_LOCAL_SERVER; 
hr = BindCtx->SetBindOptions(&bo); 
if (SUCCEEDED(hr)) 
{ 
    // Use the passed in CLSID to help create the COM elevation moniker string 
    CComPtr Moniker; 
    WCHAR wszCLSID[50]; 
    WCHAR wszMonikerName[300]; 
    StringFromGUID2(rclsid,wszCLSID,sizeof(wszCLSID)/sizeof(wszCLSID[0])); 
    //Elevation:Administrator!new 
    hr = StringCchPrintfW(wszMonikerName, sizeof(wszMonikerName)/sizeof(wszMonikerName[0]), L"Elevation:Administrator!new:%s", wszCLSID); 
    if (SUCCEEDED(hr)) 
    { 
    // Create the COM elevation moniker 
    ULONG ulEaten = 0; 
    ULONG ulLen = (ULONG)wcslen(wszMonikerName); 
    LPBC pBindCtx = BindCtx.p; 
    hr = MkParseDisplayName(pBindCtx,wszMonikerName,&ulEaten,&Moniker); 
    if (SUCCEEDED(hr) && ulEaten == ulLen) 
    { 
    // Use passed in reference to IID to bind to the object 
    IDispatch * pv = NULL; 
    hr = Moniker->BindToObject(pBindCtx,NULL,riid,ppv); 
    } 
    } 
} 
return hr; 
} 

CoCreateInstanceAsAdmin साथ "क्लास पंजीकृत नहीं" विफल रहता है कॉलिंग: यहाँ कोड है।

वस्तु निम्न रजिस्ट्री कुंजी बनाने के द्वारा पंजीकृत है


[HKEY_CLASSES_ROOT\COMsurrogate] 
@="COMsurrogate Class" 

[HKEY_CLASSES_ROOT\COMsurrogate\CurVer] 
@="COMsurrogate.1" 

[HKEY_CLASSES_ROOT\COMsurrogate\CLSID] 
@="{686B6F70-06AE-4dfd-8C26-4564684D9F9F}" 

[HKEY_CLASSES_ROOT\CLSID\{686B6F70-06AE-4dfd-8C26-4564684D9F9F}] 
@="COMsurrogate Class" 
"LocalizedString"="@C:\\Windows\\system32\\COMsurrogate.dll,-101" 
"DllSurrogate"="" 

[HKEY_CLASSES_ROOT\CLSID\{686B6F70-06AE-4dfd-8C26-4564684D9F9F}\ProgID] 
@="COMsurrogate.1" 

[HKEY_CLASSES_ROOT\CLSID\{686B6F70-06AE-4dfd-8C26-4564684D9F9F}\VersionIndependentProgID] 
@="COMsurrogate" 

[HKEY_CLASSES_ROOT\CLSID\{686B6F70-06AE-4dfd-8C26-4564684D9F9F}\InprocServer32] 
@="@C:\\windows\system32\COMsurrogate.dll" 
"ThreadingModel"="Apartment" 

[HKEY_CLASSES_ROOT\CLSID\{686B6F70-06AE-4dfd-8C26-4564684D9F9F}\NotInsertable] 

[HKEY_CLASSES_ROOT\CLSID\{686B6F70-06AE-4dfd-8C26-4564684D9F9F}\Programmable] 

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

उन चीजों में से जिन्हें मैंने हल करने का प्रयास किया है, इसे एटीएल के माध्यम से कार्यान्वित करना है (जैसे पंजीकरण स्वचालित है)। यह काम करता है, लेकिन समस्या यह है कि मैं MIDL जेनरेट फ़ंक्शन प्रोटोटाइप में फ़ंक्शन पॉइंटर पास नहीं कर सकता।

मैं VARIANT प्रकार का उपयोग कर इसे पारित करने की कोशिश की:


v.vt = VT_PTR; 
void (*myptr)(void); 
myptr = &DoTheStuff; 
v.byref = myptr; 
hr = theElevated->CoTaskExecuter(0, v); 

परिणाम के रूप में मैं "अमान्य तर्क प्रकार" मिलता है।

क्या कोई इस विषय पर कुछ प्रकाश डाल सकता है? शायद मैं जो हासिल करने की कोशिश कर रहा हूं वह डिजाइन द्वारा संभव नहीं है?

+0

यक। क्या यह एक अलग प्रक्रिया के रूप में चलाने के लिए माना जाता है? क्या यह विंडोज के 64-बिट संस्करण पर है? एक खाली DllSurrogate x64 Win7 पर एक समस्या है। एपआईडी या प्रॉक्सी/स्टब का कोई संकेत नहीं है। रेफरी: http://msdn.microsoft.com/en-us/library/ms686606%28VS.85%29.aspx –

+2

यक! यह बात भारी अनुपात के सुरक्षा छेद है। यदि आपको उन्नत विशेषाधिकारों के साथ कोड निष्पादित करने के लिए कुछ चाहिए तो इसे निष्पादित करने के लिए निश्चित फ़ंक्शन दें।इसे मनमाने ढंग से फ़ंक्शन पॉइंटर्स निष्पादित करने का अर्थ है कि आप मूल प्रोग्राम को भी बढ़ा सकते हैं! –

+5

आप एक आउट-ऑफ-प्रोसेस COM ऑब्जेक्ट के लिए एक सार्थक सूचक नहीं पारित कर सकते हैं, "आउट ऑफ़ प्रोसेस" बिट आपको उस पर चिपका देना चाहिए। इस तरह के परिदृश्य में आप सबसे अच्छा कर सकते हैं एक पूर्व-पंजीकृत ऑब्जेक्ट है जो काम करता है और आप इसे सीमा पार करते हैं, लेकिन फिर आप उस COM ऑब्जेक्ट को पहले स्थान पर बढ़ा सकते हैं। त्रुटि डबल चेक के रूप में यह HKEY_CLORENT_USER की बजाय HKEY_LOCAL_MACHINE (सॉफ़्टवेयर \ क्लासेस \ CLSID \ ... पर नेविगेट करें) में पंजीकृत कर रहा है। यदि यह वर्तमान उपयोगकर्ता में है तो उन्नत उपयोगकर्ता इसे Vista + में COM लागू करने के तरीके के कारण नहीं देख सकता है। – tyranid

उत्तर

0

मेरा मानना ​​है कि आपके पास जो समस्याएं हैं, वे डिज़ाइन द्वारा हैं और खिड़की के सुरक्षा सुधारों का इरादा संभावित सुरक्षा जोखिमों से बचने में मदद करना था।

0

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