2009-08-30 16 views
15

yo soy un usuario limitado, y necesito escribir una macro de Outlook que expone una biblioteca de C# en Outlook 2003 y 2007.interoperabilidad COM sin regasm

no tengo ningún privilges Admin en absoluto, ni siquiera en Tiempo de instalación, por lo que no puedo ejecutar RegAsm y no puedo (supongo) escribir un complemento administrado.

¿Hay alguna manera de llamar .NET code de VBA en este escenario, o hay alguna otra solución?

Esto es sólo para uso personal, por lo que un truco feo es perfectamente aceptable (siempre y cuando funciona)

Respuesta

14

Lo resolví ejecutando regasm con la opción /regfile, y reemplazando HKLM con HKCU en el archivo resultante .reg.

+0

la salida de regasm que recibo cuando uso este enfoque no contiene ninguna clave HKLM, solo HKEY_CLASSES_ROOT, que también requiere privilegios de administrador para escribir. ¿Encontraste una forma de evitar esto también o mi caso es diferente al tuyo? –

+1

Heh ... no lo sé, lo encontré: HKCU \ Software \ Classes –

+0

¿Dónde colocas la DLL en la máquina del usuario? ¿Todavía no requiere ejecutar gacutil (que requiere derechos de administrador)? –

1

Desafortunadamente, debido a la forma en que COM funciona sería imposible instalar un objeto COM (interoperabilidad o de otra manera) sin privilegios de administrador.

Cuando registra un objeto com, escribe varias entradas en HKEY_CLASSES_ROOT que es una clave de nivel de máquina y, por lo tanto, requiere privilegios de administrador.

Ahora porque usted dijo que una solución hackish es aceptable aquí hay algunos pasos posibles que podría tomar para que funcione; sin embargo, si no tiene derechos de administrador, asumo que esta no es su máquina y muy probablemente una máquina de trabajo. Tomar estos pasos podría hacerte despedir. Descargo de responsabilidad estándar y otras cosas: no es mi culpa si eres un imbécil y te hacen demandar/dispararon/dispararon/asaltaron/etc.

Primero debe averiguar qué claves de registro deben agregarse. Asegúrese de estar haciendo esto en una máquina 'limpia' que no haya visto antes su componente (o uno que sepa que no tiene las teclas de registro). Instale un programa de monitoreo de la máquina para capturar las llaves. Here es un enlace a un artículo MS [no relacionado] donde recomiendan algunas aplicaciones que hacen precisamente eso.

Ahora con el monitor ejecutándose instale su complemento. Ahora debería poder obtener un registro de las claves que deben crearse. Usando su log crea archivos de exportación de registro.

Ahora aquí es donde se pone complicado. Básicamente lo que hará es arrancar el equipo desde una imagen BartPE y montar el registro y ejecutar sus scripts; Sin embargo, las rutas clave serán incorrectas, por lo que las secuencias de comandos no funcionarán "de fábrica".

MS tiene un artículo de TechNet (pero el enlace tiene parens en él así que no juega bien aquí) así que Google, debería ser el primer resultado.

Después de haber leído ese artículo, verá que el registro de máquinas se montará como una subclave de HKEY_LOCAL_MACHINE. Lo que debe hacer es cambiar sus exportaciones de registro para que coincidan con la nueva ruta. Tan pronto como se complete este paso, debe poder arrancar desde su imagen BartPE, montar el registro, importar sus scripts, desmontar la colmena y luego reiniciar. Suponiendo que haya copiado los archivos en la ruta correcta, entonces 'debería' funcionar.

Buena suerte.

+0

¿Qué hay de COM sin registro o HKCU \ Classes? – SLaks

+4

No hay forma de que esté haciendo esta solución. – SLaks

+0

Pensé que querría usarlo, pero ponga la información para otros que están pirateando. ¿Qué quiere decir con COM libre de registro? Solo puede usar HKCU \ Classes porque COM aún requiere las entradas en HKLM. –

1

He encontrado un posible solution, pero no tengo tiempo para probarlo todavía.

4

El registro de un objeto COM (por ejemplo, el control ActiveX) y su visibilidad para todos los usuarios del sistema requiere derechos administrativos.

PERO, si la visibilidad para todos los usuarios no es necesaria (o no es posible debido a la restricción limitada del usuario), entonces el objeto COM puede registrarse solo para el usuario particular.

Esto generalmente se hace registrando el objeto en HKCU en lugar de HKLM. Esto aplicará para los objetos COM "regulares" y los expuestos a través de .NET COM Interop.

También salen otros enfoques más finos, el ya mencionado RegFree COM que se dirige a un ejecutable en particular.

Por lo tanto, dado todo lo anterior, la solución para capturar toda la información en el archivo reg y reemplazar HKLM con HKCU funcionará (no es agradable, pero también lo son las herramientas).

+0

Ya hice esto. – SLaks

4

Hay RegistrationServices.RegisterAssembly .NET API (que creo que es utilizado por RegAsm.exe).

También hay RegOverridePredefKey Win32 API, poco visible pero muy útil, que permite volver a asignar HKEY_CLASSES_ROOT (utilizado por RegisterAssembly) para HKEY_CURRENT_USER\Software\Classes.

Un programa inteligente puede usar RegistrationServices.RegisterAssembly y RegOverridePredefKey para registrar un ensamblado para clientes COM bajo HKEY_CURRENT_USER.

No he probado esto por mi cuenta, pero creo que es bastante factible.

Actualizado, aparentemente este enfoque does works.

+1

Esa es una idea interesante. Lo probaré. –

Cuestiones relacionadas