如何UAC提升与.NET中的COM组件(How to UAC elevate a COM compo

2019-06-18 10:15发布

我发现的文章 ,关于如何提高通过调用C ++编写的COM对象CoCreateInstanceAsAdmin 。 但我一直没能找到或做的,是实现我的.NET(C#)应用程序作为一个COM对象的组件,然后打电话到该对象执行这就需要UAC提升任务的方式。 MSDN文档此作为管理COM对象模型 。

我知道,这是可能的,很容易启动应用程序(或其他应用程序)作为管理员,在一个单独的进程中执行的任务(例如见的丹尼尔蛾后 ,但我正在寻找一种方法从相同的,未升高的.NET可执行文件内所做的一切。这样做,当然,在产卵一个新的进程的COM对象,但由于透明编组,在.NET COM对象的调用者不应该(太多)意识到这一点。

任何想法,我怎么能实例化用C#编写的COM对象,从C#项目,通过CoCreateInstanceAsAdmin API将是非常有益的。 所以我在学习如何编写C#中的COM对象,我可以从C#通过COM API的标高,然后调用真正的兴趣。

如果高架COM对象不会在同一进程中运行没关系。 我只是不希望有推出提升了整个应用程序; 我只是想有COM对象将执行代码升高。 如果我写沿线的东西:

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

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

再有我的主要应用程序只是实例化ElevatedClass通过CoCreateInstanceAsAdmin电话。 但是,也许我只是在做梦。

Answer 1:

看看Windows Vista中的UAC演示示例代码

(您还需要Vista的大桥为UnsafeNativeMethods.CoGetObject方法样品)

它给你的C#代码,显示了几种不同的方式来提升,其中包括COM对象

(不完全的代码示例-抓住上述文件)

[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);
}


Answer 2:

我认为CoCreateInstanceAsAdmin工作的唯一方法是,如果您已经注册的COM组件的时间提前。 如果你打算申请在Xcopy部署设置工作这可能是一个问题。

对于我自己的目的在公堂,我决定与清单边创建一个小的托管过程中需要管理员权限。 然后,当我需要执行升高的作用,我旋转起来托管进程的一个实例,并经由.Net远程指示它执行在控制容器的加利奥的反演注册的特定命令。

这是工作的一个公平一点,但加利奥已经有了一个彻头彻尾的托管设施,将抬高到混合过程中是不是太硬。 此外,该机制确保加利奥可以在不需要在注册表中的任何其它COM组件的现有安装执行权限提升。



Answer 3:

高程的元素的过程。 所以,如果我正确地理解你的问题,你想办法提升一个COM对象在你的过程中,比答案是你不能。 CoCreateInstanceAsAdmin的整个点是不是在你的进程中运行它。



文章来源: How to UAC elevate a COM component with .NET