【问题标题】:How to UAC elevate a COM component with .NET如何 UAC 使用 .NET 提升 COM 组件
【发布时间】:2010-09-12 17:25:22
【问题描述】:

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

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

任何关于如何通过CoCreateInstanceAsAdmin 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。但也许我只是在做梦。

【问题讨论】:

    标签: c# com uac elevation moniker


    【解决方案1】:

    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 部署设置中工作,这可能是个问题。

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

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

      【讨论】:

      • 感谢您的反馈;运行单独的托管进程不是我想要的。我真的很想能够与提升的 COM 组件进行交互,就好像它是一个本地对象一样(即提升的 COM 组件应该能够回调到其他本地 .NET 对象)。
      【解决方案3】:

      提升的元素是过程。因此,如果我正确理解了您的问题,并且您想要一种在您的流程中提升 COM 对象的方法,那么答案是您不能。 CoCreateInstanceAsAdmin 的全部意义在于不在您的进程中运行它。

      【讨论】:

        猜你喜欢
        • 2013-05-28
        • 1970-01-01
        • 2012-06-16
        • 1970-01-01
        • 1970-01-01
        • 2011-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多