.net - venirse - COM Interop sin regasmo
porque un hombre dura mucho en la cama (5)
Soy un usuario limitado y necesito escribir una macro de Outlook que expone una biblioteca C # en Outlook 2003 y 2007.
No tengo privilegios de administrador en absoluto, ni siquiera en el momento de la instalación, por lo que no puedo ejecutar RegAsm y no puedo (supongo) escribir un complemento administrado.
¿Hay alguna manera de llamar al código .Net de VBA en este escenario, o hay alguna otra solución?
Esto es solo para uso personal, por lo que un truco feo es perfectamente aceptable (siempre y cuando funcione)
Desafortunadamente, debido a la forma en que funciona COM sería imposible instalar un objeto COM (interoperabilidad o de otro modo) sin privilegios de administrador.
Cuando registra un objeto com, escribe varias entradas en HKEY_CLASSES_ROOT
que es una clave de nivel de equipo 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 necesita 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. Aquí hay un enlace a un artículo de 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 contiene paréntesis, por lo que no funciona 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.
Encontré una posible solución , pero aún no tengo tiempo para probarla.
Lo resolví ejecutando regasm
con la opción /regfile
y reemplazando HKLM con HKCU en el archivo .reg
resultante.
Registrar un objeto COM (por ejemplo, control ActiveX) y hacerlo visible para todos los usuarios en el 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 en 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 de grano más fino, el ya mencionado RegFree COM que se dirige a un ejecutable en particular.
Entonces, 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).
Hay RegistrationServices.RegisterAssembly
.NET API (que creo que es utilizado por RegAsm.exe
).
También RegOverridePredefKey
la API RegOverridePredefKey
Win32, poco RegOverridePredefKey
pero bastante útil, que permite reasignar HKEY_CLASSES_ROOT
(utilizado por RegisterAssembly
) a HKEY_CURRENT_USER/Software/Classes
.
Un programa inteligente puede usar RegistrationServices.RegisterAssembly
y RegOverridePredefKey
para registrar un ensamblado para clientes COM en HKEY_CURRENT_USER
.
No lo he intentado yo mismo, pero creo que es bastante factible.
Actualizado , aparentemente este enfoque funciona .