2008-09-24 7 views
14

J'ai trouvé un article sur la façon d'élever un objet COM écrit en C++ en appelant CoCreateInstanceAsAdmin. Mais ce que je n'ai pas pu trouver ou faire, c'est un moyen d'implémenter un composant de mon application .NET (C#) en tant qu'objet COM puis d'appeler dans cet objet pour exécuter les tâches qui nécessitent une élévation UAC. MSDN documente cela comme admin COM object model.Comment UAC élever un composant COM avec .NET

Je suis conscient qu'il est possible et très facile de lancer l'application (ou une autre application) en tant qu'administrateur, pour exécuter les tâches dans un processus séparé (voir par exemple le post from Daniel Moth, mais ce que je cherche est un Ce faisant, bien sûr, l'objet COM apparaîtra dans un nouveau processus, mais grâce à la fonction de marshaling transparent, l'appelant de l'objet COM .NET ne devrait pas l'être (J'aurais aimé savoir comment créer un objet COM écrit en C#, à partir d'un projet C#, à travers l'API CoCreateInstanceAsAdmin, ce qui serait très utile. un objet COM en C#, que je peux ensuite invoquer de C# à travers le COM API d'élévation.

Peu importe si l'objet COM élevé ne s'exécute pas dans le même processus. Je ne veux juste pas avoir à lancer toute l'application élevée; Je voudrais juste avoir l'objet COM qui va exécuter le code être élevé. Si je pouvais écrire quelque chose le long des lignes:

// in a dedicated assembly, marked with the following attributes: 
[assembly: ComVisible (true)] 
[assembly: Guid ("....")] 

public class ElevatedClass 
{ 
    public void X() { /* do something */ } 
} 

et alors ma demande principale, juste instancie ElevatedClass par l'appel CoCreateInstanceAsAdmin. Mais peut-être que je ne fais que rêver.

Répondre

2

Les éléments d'élévation sont des processus. Donc, si je comprends bien votre question, et que vous voulez un moyen d'élever un objet COM dans votre processus, la réponse est que vous ne pouvez pas. Le point entier de CoCreateInstanceAsAdmin est de ne PAS l'exécuter dans votre processus.

8

Regardez Windows Vista UAC Demo Sample Code

(Vous devez également l'échantillon Vista Bridge pour la méthode UnsafeNativeMethods.CoGetObject)

Ce qui vous donne le code C# qui montre quelques différentes façons d'élever, y compris un objet COM

(code incomplet échantillon - saisir les fichiers ci-dessus)

[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

Je pense que CoCreateInstanceAsAdmin fonctionne uniquement si vous avez enregistré le composant COM à l'avance. Cela peut poser un problème si vous souhaitez que votre application fonctionne dans un paramètre de déploiement XCopy. Pour mes propres besoins dans Gallio, j'ai décidé de créer un petit processus d'hébergement sur le côté avec un manifeste pour exiger des privilèges d'administrateur. Ensuite, lorsque j'ai besoin d'effectuer une action élevée, je lance une instance du processus d'hébergement et l'instruis par l'intermédiaire de .Net remoting pour exécuter une commande particulière enregistrée dans le conteneur Inversion of Control de Gallio.

Il s'agit d'un peu de travail, mais Gallio disposait déjà d'une installation d'hébergement hors processus, ce qui rendait l'élévation dans le mixage pas trop difficile. De plus, ce mécanisme garantit que Gallio peut effectuer une élévation de privilèges sans nécessiter l'installation préalable d'autres composants COM dans le registre.

+0

Nous vous remercions de votre feed-back; exécuter un processus d'hébergement distinct n'est pas ce que j'avais l'intention. J'adorerais pouvoir interagir avec le composant COM élevé comme s'il s'agissait d'un objet local (c'est-à-dire que le composant COM élevé devrait pouvoir rappeler dans les autres objets .NET locaux). –

Questions connexes