How to UAC elevate a COM component with .NET

后端 未结 3 1915
无人共我
无人共我 2020-12-02 15:23

I\'ve found an article on how to elevate a COM object written in C++ by calling CoCreateInstanceAsAdmin. But what I have not been able to find or do, is a way

相关标签:
3条回答
  • 2020-12-02 15:37

    I think the only way CoCreateInstanceAsAdmin works is if you have registered the COM component ahead of time. That may be a problem if you intend your application to work in an XCopy deployment setting.

    For my own purposes in Gallio I decided to create a little hosting process on the side with a manifest to require admin privileges. Then when I need to perform an elevated action, I spin up an instance of the hosting process and instruct it via .Net remoting to execute a particular command registered in Gallio's Inversion of Control container.

    This is a fair bit of work but Gallio already had an out of process hosting facility so adding elevation into the mix was not too hard. Moreover, this mechanism ensures that Gallio can perform privilege elevation without requiring prior installation of any other COM components in the registry.

    0 讨论(0)
  • 2020-12-02 15:45

    Look at Windows Vista UAC Demo Sample Code

    (You also need the Vista Bridge sample for UnsafeNativeMethods.CoGetObject method)

    Which gives you C# code that shows a few different ways to elevate, including a COM object

    (Incomplete code sample - grab the files above)

    [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);
    }
    
    0 讨论(0)
  • 2020-12-02 15:45

    The elements of elevation are processes. So, if I understand your question correctly, and you want a way to elevate a COM object in your process, than the answer is you can't. The entire point of CoCreateInstanceAsAdmin is to NOT run it in your process.

    0 讨论(0)
提交回复
热议问题