c# com uac elevation moniker

c# - Cómo UAC eleva un componente COM con.NET



elevation moniker (3)

Encontré un artículo sobre cómo elevar un objeto COM escrito en C ++ llamando a CoCreateInstanceAsAdmin . Pero lo que no he podido encontrar o hacer, es una forma de implementar un componente de mi aplicación .NET (c #) como un objeto COM y luego llamar a ese objeto para ejecutar las tareas que necesitan elevación de UAC. MSDN documenta esto como el modelo de objeto COM de administrador .

Soy consciente de que es posible y bastante fácil iniciar la aplicación (u otra aplicación) como administrador, para ejecutar las tareas en un proceso separado (ver, por ejemplo, la publicación de Daniel Moth , pero lo que estoy buscando es una forma para hacer todo desde dentro del mismo ejecutable de .NET no elevado. Hacerlo generará, por supuesto, el objeto COM en un nuevo proceso, pero gracias a una clasificación transparente, la persona que llama del objeto .NET COM no debería (también mucho) consciente de eso.

Cualquier idea sobre cómo podría instanciar un objeto COM escrito en C #, desde un proyecto C #, a través de la API CoCreateInstanceAsAdmin sería muy útil. Así que estoy realmente interesado en aprender cómo escribir un objeto COM en C #, que luego puedo invocar desde C # a través de las API de elevación COM.

No importa si el objeto COM elevado no se ejecuta en el mismo proceso. Simplemente no quiero tener que iniciar toda la aplicación elevada; Me gustaría que el objeto COM que ejecutará el código sea elevado. Si pudiera escribir algo a lo largo de las líneas:

// in a dedicated assembly, marked with the following attributes: [assembly: ComVisible (true)] [assembly: Guid ("....")] public class ElevatedClass { public void X() { /* do something */ } }

y luego hacer que mi aplicación principal simplemente instanciara ElevatedClass través de la llamada CoCreateInstanceAsAdmin . Pero tal vez solo estoy soñando.


Los elementos de elevación son procesos. Entonces, si entiendo tu pregunta correctamente y quieres una forma de elevar un objeto COM en tu proceso, entonces la respuesta es que no puedes. El objetivo de CoCreateInstanceAsAdmin es NO ejecutarlo en su proceso.


Mire el código de ejemplo de demostración de Windows Vista UAC

(También necesita la muestra Vista Bridge para el método UnsafeNativeMethods.CoGetObject)

Lo que le da código C # que muestra algunas maneras diferentes de elevar, incluido un objeto COM

(Ejemplo de código incompleto: tome los archivos anteriores)

[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); }


Creo que la única forma en que CoCreateInstanceAsAdmin funciona es si ha registrado el componente COM antes de tiempo. Eso puede ser un problema si tiene la intención de que su aplicación funcione en una configuración de implementación de XCopy.

Para mis propios fines en Gallio, decidí crear un pequeño proceso de hosting en el lado con un manifiesto para requerir privilegios de administrador. Luego, cuando necesito realizar una acción elevada, enciendo una instancia del proceso de alojamiento e indico a través de .Net remoto para ejecutar un comando particular registrado en el contenedor de inversión de control de Gallio.

Esto es un poco de trabajo, pero Gallio ya tenía una instalación de hospedaje fuera de proceso, por lo que agregar elevación a la mezcla no era demasiado difícil. Además, este mecanismo asegura que Gallio puede realizar la elevación de privilegios sin requerir la instalación previa de cualquier otro componente COM en el registro.