代码之家  ›  专栏  ›  技术社区  ›  Pierre Arnaud

如何用.NET提升COM组件

  •  15
  • Pierre Arnaud  · 技术社区  · 16 年前

    我找到了一个 article 浅谈如何用C++调用C++编写的COM对象 CoCreateInstanceAsAdmin . 但是我没有找到或者做的是一种方法,将.NET(c#)应用程序的组件实现为COM对象,然后调用该对象来执行需要UAC提升的任务。MSDN将此记录为 admin COM object model .

    我知道,以管理员身份启动应用程序(或其他应用程序)并在单独的过程中执行任务是可能的,而且非常容易(参见 post from Daniel Moth ,但我要寻找的是一种方法,可以在同一个未提升的.NET可执行文件中执行所有操作。当然,这样做会在新进程中产生COM对象,但是由于透明的封送处理,.netcom对象的调用方不应该(太多)意识到它。

    关于如何通过 协同创建实例管理员 API将非常有用。所以我真的很感兴趣学习如何用C#编写一个COM对象,然后我可以通过COM提升api从C#调用它。

    不要介意提升的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 通过 协同创建实例管理员 打电话来。但也许我只是在做梦。

    3 回复  |  直到 15 年前
        1
  •  8
  •   Richard Szalay    16 年前

    看看 Windows Vista UAC Demo Sample Code

    (您还需要 Vista Bridge 非杀虫药方法样品(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);
    }
    
        2
  •  3
  •   Jeff Brown    15 年前

    我认为CoCreateInstanceAsAdmin工作的唯一方法是提前注册COM组件。如果您希望应用程序在XCopy部署设置中工作,则这可能是一个问题。

    出于我在Gallio的目的,我决定创建一个带有清单的托管进程,以要求管理员权限。然后,当我需要执行提升的操作时,我启动宿主进程的一个实例,并通过.Net远程处理指示它执行在Gallio的控制反转容器中注册的特定命令。

    这是一个公平的工作,但加利奥已经有一个进程外托管设施,所以添加到组合的提升不是太难。此外,该机制确保Gallio可以执行权限提升,而无需在注册表中预先安装任何其他COM组件。

        3
  •  2
  •   MSalters    16 年前

    立面元素是过程。因此,如果我正确地理解了您的问题,并且您希望在流程中提升COM对象,那么答案是您不能。CoCreateInstanceAsAdmin的整个要点是不要在您的流程中运行它。

    推荐文章