我发现的文章 ,关于如何提高通过调用C ++编写的COM对象CoCreateInstanceAsAdmin
。 但我一直没能找到或做的,是实现我的.NET(C#)应用程序作为一个COM对象的组件,然后打电话到该对象执行这就需要UAC提升任务的方式。 MSDN文档此作为管理COM对象模型 。
我知道,这是可能的,很容易启动应用程序(或其他应用程序)作为管理员,在一个单独的进程中执行的任务(例如见的丹尼尔蛾后 ,但我正在寻找一种方法从相同的,未升高的.NET可执行文件内所做的一切。这样做,当然,在产卵一个新的进程的COM对象,但由于透明编组,在.NET COM对象的调用者不应该(太多)意识到这一点。
任何想法,我怎么能实例化用C#编写的COM对象,从C#项目,通过CoCreateInstanceAsAdmin
API将是非常有益的。 所以我在学习如何编写C#中的COM对象,我可以从C#通过COM 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
电话。 但是,也许我只是在做梦。
看看Windows Vista中的UAC演示示例代码
(您还需要Vista的大桥为UnsafeNativeMethods.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部署设置工作这可能是一个问题。
对于我自己的目的在公堂,我决定与清单边创建一个小的托管过程中需要管理员权限。 然后,当我需要执行升高的作用,我旋转起来托管进程的一个实例,并经由.Net远程指示它执行在控制容器的加利奥的反演注册的特定命令。
这是工作的一个公平一点,但加利奥已经有了一个彻头彻尾的托管设施,将抬高到混合过程中是不是太硬。 此外,该机制确保加利奥可以在不需要在注册表中的任何其它COM组件的现有安装执行权限提升。
高程的元素的过程。 所以,如果我正确地理解你的问题,你想办法提升一个COM对象在你的过程中,比答案是你不能。 CoCreateInstanceAsAdmin的整个点是不是在你的进程中运行它。