2008-09-24 22 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