2008-09-24 20 views
14

के साथ एक COM घटक को कैसे बढ़ाएं CoCreateInstanceAsAdmin पर कॉल करके सी ++ में लिखी गई COM ऑब्जेक्ट को ऊपर उठाने के तरीके पर मुझे article मिला है। लेकिन जो मैं खोजने या करने में सक्षम नहीं हूं, वह मेरे .NET (C#) अनुप्रयोग के घटक को COM ऑब्जेक्ट के रूप में कार्यान्वित करने का एक तरीका है और उसके बाद उन ऑब्जेक्ट्स को कॉल करें जिन्हें यूएसी ऊंचाई की आवश्यकता होती है। एमएसडीएन इसे admin COM object model के रूप में दस्तावेज करता है।यूएसी

मुझे पता है कि एक अलग प्रक्रिया में कार्यों को निष्पादित करने के लिए एप्लिकेशन (या अन्य ऐप) को व्यवस्थापक के रूप में लॉन्च करना संभव और आसान है (उदाहरण के लिए post from Daniel Moth देखें, लेकिन जो मैं ढूंढ रहा हूं वह है एक ही, गैर-उन्नत .NET निष्पादन योग्य से सबकुछ करने का तरीका। ऐसा करने से, एक नई प्रक्रिया में COM ऑब्जेक्ट को जन्म दिया जाएगा, लेकिन पारदर्शी मार्शलिंग के लिए धन्यवाद, .NET COM ऑब्जेक्ट का कॉलर नहीं होना चाहिए (बहुत अधिक) इसके बारे में पता है।

CoCreateInstanceAsAdmin एपीआई के माध्यम से सी # प्रोजेक्ट से सी # में लिखी गई COM ऑब्जेक्ट को कैसे उत्पन्न किया जा सकता है, इस बारे में कोई भी विचार बहुत उपयोगी होगा। इसलिए मुझे वास्तव में लिखने में सीखने में दिलचस्पी है सी # में एक COM ऑब्जेक्ट, जिसे मैं COM के माध्यम से सी # से आवेक कर सकता हूं ऊंचाई एपीआई।

कोई बात नहीं है कि उन्नत COM ऑब्जेक्ट एक ही प्रक्रिया में नहीं चलता है। मैं सिर्फ पूरे आवेदन को लॉन्च नहीं करना चाहता हूं; मैं सिर्फ COM ऑब्जेक्ट रखना चाहता हूं जो कोड को ऊपर उठाएगा। मैं पंक्तियों के साथ कुछ लिखते हैं तो हो सकता है:

// in a dedicated assembly, marked with the following attributes: 
[assembly: ComVisible (true)] 
[assembly: Guid ("....")] 

public class ElevatedClass 
{ 
    public void X() { /* do something */ } 
} 

और फिर बस instanciate ElevatedClassCoCreateInstanceAsAdmin कॉल के माध्यम से अपने मुख्य आवेदन किया है। लेकिन शायद मैं सिर्फ सपना देख रहा हूँ।

उत्तर

2

ऊंचाई के तत्व प्रक्रियाएं हैं। इसलिए, यदि मैं आपके प्रश्न को सही ढंग से समझता हूं, और आप अपनी प्रक्रिया में COM ऑब्जेक्ट को ऊपर उठाने का एक तरीका चाहते हैं, तो उत्तर से आप ऐसा नहीं कर सकते हैं। CoCreateInstanceAsAdmin का पूरा बिंदु आपकी प्रक्रिया में इसे चलाने के लिए नहीं है।

8

Windows Vista UAC Demo Sample Code

पर देखो

जो तुम सी # कोड है कि तरक्की के लिए कुछ अलग अलग तरीकों से, एक COM वस्तु

सहित चलता देता है (आप भी UnsafeNativeMethods.CoGetObject विधि के लिए Vista Bridge नमूना की जरूरत है) (अपूर्ण कोड नमूना - उपर्युक्त फाइलों को पकड़ें)

[return: MarshalAs(UnmanagedType.Interface)] 
static internal object LaunchElevatedCOMObject(Guid Clsid, Guid InterfaceID) 
    { 
    string CLSID = Clsid.ToString("B"); // B formatting directive: returns {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} 
    string monikerName = "Elevation:Administrator!new:" + CLSID; 

    NativeMethods.BIND_OPTS3 bo = new NativeMethods.BIND_OPTS3(); 
    bo.cbStruct = (uint)Marshal.SizeOf(bo); 
    bo.hwnd = IntPtr.Zero; 
    bo.dwClassContext = (int)NativeMethods.CLSCTX.CLSCTX_ALL; 

    object retVal = UnsafeNativeMethods.CoGetObject(monikerName, ref bo, InterfaceID); 

    return (retVal); 
} 
2

मुझे लगता है कि एकमात्र तरीका CoCreateInstanceAsAdmin काम करता है यदि आपने समय से पहले COM घटक पंजीकृत किया है। यदि आप एक्सकॉपी परिनियोजन सेटिंग में काम करने के लिए अपना आवेदन करना चाहते हैं तो यह एक समस्या हो सकती है।

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

यह काम का एक उचित काम है, लेकिन गैलियो पहले ही प्रक्रिया होस्टिंग सुविधा से बाहर था इसलिए मिश्रण में ऊंचाई जोड़ना बहुत मुश्किल नहीं था। इसके अलावा, यह तंत्र सुनिश्चित करता है कि गैलियो रजिस्ट्री में किसी भी अन्य COM घटकों की पूर्व स्थापना की आवश्यकता के बिना विशेषाधिकार उन्नयन कर सकता है।

+0

आपकी फीड-बैक के लिए धन्यवाद; एक अलग होस्टिंग प्रक्रिया चलाना मेरा इरादा नहीं है। मैं वास्तव में ऊंचा COM घटक के साथ बातचीत करने में सक्षम होना चाहूंगा जैसे कि यह एक स्थानीय वस्तु थी (यानी ऊंचा COM घटक अन्य स्थानीय .NET ऑब्जेक्ट्स में वापस कॉल करने में सक्षम होना चाहिए)। –