English 中文(简体)
如何使用.NET提升COM组件
原标题:
  • 时间:2008-09-24 13:13:17
  •  标签:

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 to implement a component of my .NET (c#) application as a COM object and then call into that object to execute the tasks which need UAC elevation. MSDN documents this as the admin COM object model.

我知道,作为管理员启动应用程序(或另一个应用程序),在单独的过程中执行任务是可能的,而且非常容易(例如,请参阅来自Daniel Moth的帖子,但我正在寻找一种在同一个未提升的.NET可执行文件中执行所有操作的方法。这样做当然会在新进程中生成COM对象,但由于透明编组,.NET COM对象的调用方不应该(太)知道它。

任何关于如何通过<code>CoCreateInstanceAsAdmin</code>API从C#项目中实例化用C#编写的COM对象的想法都将非常有用。因此,我非常感兴趣的是学习如何用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 */ }
}

然后让我的主应用程序通过CoCreateInstanceAsAdmin调用初始化ElevatedClass。但也许我只是在做梦。

问题回答

查看Windows Vista UAC演示示例代码

(您还需要Vista BridgeUnsafeNativeMethods.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);
}

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

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

这是一项相当艰巨的工作,但加里奥已经有了一个非流程的托管设施,所以在组合中添加标高并不太难。此外,该机制确保Gallio可以执行权限提升,而无需事先在注册表中安装任何其他COM组件。

高程要素是过程。所以,如果我正确理解你的问题,并且你想在你的过程中提升COM对象,那么答案是你不能。CoCreateInstanceAsAdmin的全部目的是不要在你的进程中运行它。





相关问题
热门标签