16

我找到了一篇关于如何通过调用 CoCreateInstanceAsAdmin. 但是我无法找到或做的是一种将我的 .NET (c#) 应用程序的组件实现为 COM 对象然后调用该对象以执行需要 UAC 提升的任务的方法。MSDN 将此记录为管理 COM 对象模型

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

关于如何通过CoCreateInstanceAsAdminAPI 从 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 */ }
}

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

4

3 回答 3

8

查看Windows Vista UAC 演示示例代码

(对于 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);
}
于 2008-11-22T21:52:39.127 回答
3

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

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

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

于 2009-05-26T21:00:35.217 回答
2

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

于 2008-09-24T15:00:13.417 回答