2008-09-24 48 views
14

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

我知道,以管理员身份启动应用程序(或其他应用程序),以在单独的进程中执行任务是可能的和相当容易的(例如,请参阅post from Daniel Moth,但我在寻找的是在同一个未升级的.NET可执行文件中执行所有操作,这样做当然会在新进程中产生COM对象,但是由于透明编组,.NET COM对象的调用者不应该是(太多了)知道它

任何关于如何使用C#编写的COM对象,从C#项目到CoCreateInstanceAsAdmin API的任何想法都会非常有帮助,因此我非常有兴趣学习如何编写一个C#中的COM对象,我可以通过COM从C#中调用它提升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呼叫我的主要应用。但也许我只是在做梦。

回答

2

海拔的元素是过程。所以,如果我正确理解你的问题,并且你想在你的过程中提升一个COM对象,那么答案是你不能。 CoCreateInstanceAsAdmin的整个要点是不要在你的过程中运行它。

8

Windows Vista UAC Demo Sample Code

(您还需要UnsafeNativeMethods.CoGetObject方法Vista Bridge样品)

,让你的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

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

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

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

+0

谢谢您的反馈;运行一个单独的托管过程并不是我想要的。我真的很喜欢能够与提升的COM组件交互,就好像它是一个本地对象(即提升的COM组件应该能够回调到其他本地.NET对象中)。 – 2009-05-27 07:50:12