Adaptar add-in de VSTO de Office 2010 a 2007

16.5.12 / Comments (0) / by Enric Carrión

Post con consejitos sueltos para si os halláis en estas lides. Un VSTO desarrollado sobre la plantilla de proyecto “Outlook 2010 Add-in” (o “Word” o “Excel”, etc…), que funciona correctamente para Office 2010, pero de la noche a la mañana se nos pide compatibilidad con Office 2007. Y, por defecto, mucha compatibilidad no tiene.

Los cambios básicos a realizar para hacerlo compatible con la misma aplicación pero en versión 2007 son:

  • Reemplazar las DLL de VSTO, que estarán referenciadas en su versión 14.0.0.0, por la DLL de la versión 12.0.0.0. Estas DLL son las “Microsoft.Office.Interop.Xxxxxx” y la “Office”.

image

  • Si usamos Ribbon Custom UI, con un fichero XML que define nuestros controles, habrá que cambiar el namespace del nodo raíz del XML.
  • Recompilar el proyecto y detectar las llamadas y métodos de la API que no son compatibles con la versión 12.0.0.0 de los ensamblados. En general, la estructura de clases y métodos es casi idéntica, pero hay métodos nuevos introducidos en 2010, como por ejemplo en la clase Microsoft.Office.Interop.Outlook.Explorer. No puedo dar la receta para mantener la compatibilidad en todos estos casos ni siquiera la garantía que la API de 2007 pueda cubrir de una manera u otra todo lo que ofrece la de 2010. Pero eso ya depende de vuestra aplicación y de cómo esté implementada…

Project could not be opened because the Microsoft Visual C# 2010 compiler could not be created. Please re-install Visual Studio

24.4.12 / Comments (0) / by Enric Carrión

Esto después de instalar el SDK de Azure desde el Web Platform Installer; abrimos nuestros proyectos de nuevo y están (unavailable). Intentamos cargarlos: nos viene con éstas y se queda tan ancho.

Untitled2

Don’t panic. Necesitamos ejecutar:

  • devenv /ResetSkipPkgs

desde la carpeta C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE

Gracias, foros.

http://social.msdn.microsoft.com/Forums/nl-NL/Vsexpressinstall/thread/04be49aa-de6b-4f45-9a27-86e3f214a0fe

SharePoint 2010: ficheros de log vacíos o muy pequeños

28.3.12 / Comments (0) / by Enric Carrión

Usando AutoSPInstaller para instalar una granja SharePoint he observado que, por defecto, los ficheros de la carpeta 14\LOGS no trazan todos los eventos que deberían trazar, básicamente se limita a mostrar eventos de los tipos:

  • WcfReceiveRequest: LocalAddress
  • Entering monitored scope (ExecuteWcfServerOperation)
  • MetadataWebServiceApplication.GetChangesForFullListSync
  • Leaving Monitored Scope (ExecuteWcfServerOperation)

Y ningún evento del proceso OWSTIMER.exe o posible ventanas de comandos (powershell.exe).

Por ahí, mirando los permisos mínimos requeridos para las cuentas de servicio, veo que es necesario que la cuenta asignada al servicio “SharePoint 2010 Tracing” esté en el grupo “Performance Log Users” de Directorio Activo.

Pues bien, en mi caso lo está, pero lo que he descubierto es que también es necesario que lo esté la cuenta de servicio de granja (farm service account), es decir la que está asignada al servicio “SharePoint 2010 Timer” (OWSTIMER).

Resumen: Farm service account debe pertenecer a “Performance Log Users”. Reiniciar “SharePoint 2010 Tracing” y "“SharePoint 2010 Timer” después de este cambio.

Después de este cambio, mis ficheros de logs brotan hermosos como amapolas en campo de trigo.

PD: los permisos requeridos para cada cuenta de servicio están en http://technet.microsoft.com/en-us/library/cc678863.aspx. En esa página establece también que el grupo “Users” del servidor debería tener acceso de lectura y escritura a la carpeta %ProgramFiles%\Microsoft Office Servers\14.0\Logs . En mi caso esto no era así, y lo he modificado para que lo sea, pero este cambió no resultó determinante en mi problema.

TestDriven.Net y “Could not load file or assembly System.Data.SQLite”

25.1.12 / Comments (0) / by Enric Carrión

Una rápida: si usáis TestDriven.Net junto con NUnit para realizar pruebas unitarias de repositorios con SQLite, la primera vez que ejecutéis todo este tinglado os pueden fallar los TextFixtures por el siguiente error:

TestFixture failed: System.BadImageFormatException : Could not load file or assembly 'System.Data.SQLite, Version=1.0.77.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139' or one of its dependencies. An attempt was made to load a program with an incorrect format.

Esto indica que TestDriven.Net está ejecutando NUnit en una plataforma distinta a la de SQLite (típicamente esto va a ocurrir porque todo vuestro entorno es x64 y TestDriven.Net está ejecutando nunit-x86.exe). Para cambiar esta configuración demos ir a Tools de Visual Studio > TestDriven.Net y seleccionar en Any CPU tests “Run in 64-bit process”.

image

Perogrullada, sí, pero me ha llevado un ratito.

SharePoint 2010: Añadir un nuevo servidor a una granja con soluciones desplegadas

24.1.12 / Comments (0) / by Enric Carrión

Por mucho que sean nuestras hijas, las aplicaciones que hemos parido pueden no ser perfectas y un día, necesitar más infraestructura hardware para poder seguir rindiendo igual. Si una de estas aplicaciones es una solución WSP desplegada en una granja, uno de los escenarios posibles a encontrarnos a futuro es el de instalar un nuevo Web Front End a la granja para balancear carga. ¿Cómo proceder? Ante todo, no asustarse.
  • Instalar pre-requisitos de SharePoint 2010 y setup (binarios) de SharePoint 2010 en el nuevo servidor.
  • Instalar el nivel de parcheado y de language packs exactamente igual que en los frontales existentes.
    • Dudas:
    • ¿Cómo conozco el nivel de parcheado exacto? Central Administration > Upgrade and Migration > Check product and patch installation status (/_admin/PatchStatus.aspx)
    • ¿Cómo interpreto todo ese churro de información? Ahí están todos los componentes de SharePoint y para cada uno tenemos su número de build, que puede ser distinto según el componente. Importante: identificar si hay Service Packs (en 2010 básicamente SP1 a fecha de hoy) y Hotfixes, y si entre la jerarquía de componentes encontramos Language Packs. Habrá que descargar e instalar esos tres tipos de parches. ¿En qué orden? Bien, eso ya da para otro post y hay mucha información relacionada, solo dejo dos referencias muy útiles:
    • ¿Paso el Configuration Wizard después de cada parche o language pack? No. Al final de todo.
  • Ejecutar (ahora sí) el asistente SharePoint 2010 Products Configuration Wizard.
  • Abrir el SharePoint 2010 Management Shell desde el nuevo servidor y ejecutar, para cada solución WSP existente:
Install-SPSolution -Identity misolucion.wsp -WebApplication http://mihost -Local -Force -GACDeployment




  • Es importante especificar –Local para desplegar la solución solo en éste nuevo servidor y –Force para forzar el desplegado, ya que si no nos devolverá errores diciendo que las features ya se encuentran desplegadas en la granja:
Install-SPSolution : A feature with ID XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX has already been installed in this farm.  Use the force attribute to explicitly re-install the feature.
  • El atributo –GACDeployment es opcional dependiendo de si nuestra solución va a desplegar DLL’s al GAC o no. Lo mismo para –WebApplication dependiendo de si es solución global o no.
Listo. No fue tan difícil, ¿no?

“An error occurred when updating a property” mapeando atributos de AD en User Profile Service de SharePoint 2010

20.12.11 / Comments (0) / by Enric Carrión

Creando propiedades de usuario en el User Profile Service que están mapeadas a atributos del Directorio Activo, podemos encontrarnos con que, al definir un mapping y guardar la propiedad nos de error, sin más explicación: “An error occurred when updating a property.

image

La operación ha producido eventos de los servicios de Forefront Identity Manager (FIM) en el Visor de sucesos, pero son demasiado crípticos como para dar pistas claras. Los reproduzco en su totalidad para quién busque similitudes (siento la enorme longitud).

Log Name:      Application
Source:        FIMSynchronizationService
Date:          19/12/2011 17:50:53
Event ID:      6306
Task Category: (3)
Level:         Error
Keywords:      Classic
User:          N/A
Computer:      SV-PUIGINTRA.PUIGINTRA.local
Description:
The server encountered an unexpected error while performing an operation for the client.
 
"BAIL: MMS(3140): mastate.cpp(11174): 0x8023060f (The version identifier passed in is not the latest)
BAIL: MMS(3140): server.cpp(4068): 0x8023060f (The version identifier passed in is not the latest)
Forefront Identity Manager 4.0.2450.34"
Event Xml:
<Event xmlns="
http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="FIMSynchronizationService" />
    <EventID Qualifiers="49152">6306</EventID>
    <Level>2</Level>
    <Task>3</Task>
    <Keywords>0x80000000000000</Keywords>
    <TimeCreated SystemTime="2011-12-19T16:50:53.000000000Z" />
    <EventRecordID>5937</EventRecordID>
    <Channel>Application</Channel>
    <Computer>SV-PUIGINTRA.PUIGINTRA.local</Computer>
    <Security />
  </System>
  <EventData>
    <Data>BAIL: MMS(3140): mastate.cpp(11174): 0x8023060f (The version identifier passed in is not the latest)
BAIL: MMS(3140): server.cpp(4068): 0x8023060f (The version identifier passed in is not the latest)
Forefront Identity Manager 4.0.2450.34</Data>
  </EventData>
</Event>

Log Name:      Application
Source:        Forefront Identity Manager
Date:          19/12/2011 17:47:21
Event ID:      3
Task Category: None
Level:         Error
Keywords:      Classic
User:          N/A
Computer:      XXXXXXXX
Description:
Microsoft.ResourceManagement: Microsoft.ResourceManagement.ResourceManagementException: Exception from HRESULT: 0x8023060F ---> System.Runtime.InteropServices.COMException (0x8023060F): Exception from HRESULT: 0x8023060F
   at MIISRCW.IMMSServer.SetMVData(String pszMVDataXML)
   at Microsoft.ResourceManagement.SyncConfig.ModifyMVData(String mvDataXml)
   at Microsoft.ResourceManagement.ActionProcessor.SyncConfigActionProcessor.Update(Guid objectId, CultureInfo locale, IList`1 updateParameters, Guid cause)
   --- End of inner exception stack trace ---
   at Microsoft.ResourceManagement.Utilities.ExceptionManager.ThrowException(Exception exception)
   at Microsoft.ResourceManagement.ActionProcessor.SyncConfigActionProcessor.Update(Guid objectId, CultureInfo locale, IList`1 updateParameters, Guid cause)
   at Microsoft.ResourceManagement.ActionProcessor.SyncConfigActionProcessor.ProcessInputRequest(RequestType request)
   at Microsoft.ResourceManagement.ActionProcessor.ActionDispatcher.ProcessInputRequest(RequestType request)
   at Microsoft.ResourceManagement.WebServices.RequestDispatcher.ExecuteAction(RequestType request)
   at Microsoft.ResourceManagement.WebServices.RequestDispatcher.ExecuteAction[ResponseBodyType](RequestType request)
   at Microsoft.ResourceManagement.WebServices.RequestDispatcher.DispatchRequest[ResponseBodyType](RequestType request, Guid requestIdentifier, Object redispatchSingleInstanceKey)
   at Microsoft.ResourceManagement.WebServices.RequestDispatcher.DispatchRequest[ResponseBodyType](RequestType request)
   at Microsoft.ResourceManagement.WebServices.RequestDispatcher.DispatchRequest(RequestType request)
   at Microsoft.ResourceManagement.WebServices.ResourceManagementService.Put(Message request)
Event Xml:
<Event xmlns="
http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="Forefront Identity Manager" />
    <EventID Qualifiers="0">3</EventID>
    <Level>2</Level>
    <Task>0</Task>
    <Keywords>0x80000000000000</Keywords>
    <TimeCreated SystemTime="2011-12-19T16:47:21.000000000Z" />
    <EventRecordID>5933</EventRecordID>
    <Channel>Application</Channel>
    <Computer>XXXXXXXX</Computer>
    <Security />
  </System>
  <EventData>
    <Data>Microsoft.ResourceManagement: Microsoft.ResourceManagement.ResourceManagementException: Exception from HRESULT: 0x8023060F ---&gt; System.Runtime.InteropServices.COMException (0x8023060F): Exception from HRESULT: 0x8023060F
   at MIISRCW.IMMSServer.SetMVData(String pszMVDataXML)
   at Microsoft.ResourceManagement.SyncConfig.ModifyMVData(String mvDataXml)
   at Microsoft.ResourceManagement.ActionProcessor.SyncConfigActionProcessor.Update(Guid objectId, CultureInfo locale, IList`1 updateParameters, Guid cause)
   --- End of inner exception stack trace ---
   at Microsoft.ResourceManagement.Utilities.ExceptionManager.ThrowException(Exception exception)
   at Microsoft.ResourceManagement.ActionProcessor.SyncConfigActionProcessor.Update(Guid objectId, CultureInfo locale, IList`1 updateParameters, Guid cause)
   at Microsoft.ResourceManagement.ActionProcessor.SyncConfigActionProcessor.ProcessInputRequest(RequestType request)
   at Microsoft.ResourceManagement.ActionProcessor.ActionDispatcher.ProcessInputRequest(RequestType request)
   at Microsoft.ResourceManagement.WebServices.RequestDispatcher.ExecuteAction(RequestType request)
   at Microsoft.ResourceManagement.WebServices.RequestDispatcher.ExecuteAction[ResponseBodyType](RequestType request)
   at Microsoft.ResourceManagement.WebServices.RequestDispatcher.DispatchRequest[ResponseBodyType](RequestType request, Guid requestIdentifier, Object redispatchSingleInstanceKey)
   at Microsoft.ResourceManagement.WebServices.RequestDispatcher.DispatchRequest[ResponseBodyType](RequestType request)
   at Microsoft.ResourceManagement.WebServices.RequestDispatcher.DispatchRequest(RequestType request)
   at Microsoft.ResourceManagement.WebServices.ResourceManagementService.Put(Message request)</Data>
  </EventData>
</Event>

Me dirijo a la referencia más clara respecto a mapeos de propiedades de AD con propiedades de usuario, que es:

http://blogs.msdn.com/b/tehnoonr/archive/2010/11/22/mapping-user-profile-properties-in-sharepoint-2010-to-ldap-attributes.aspx

Ahí, ejecuto el script PowerShell de mapeo entre propiedad de AD/FIM y SharePoint que proporciona Tehnoon Raza. En el método AddNewMapping, se produce una excepción con mensaje “Unable to process Put message”, que provoca los mismos eventos en el Visor de sucesos.

El autor nos dice que, para este caso, comprobemos que la propiedad de AD está expuesta en FIM usando el Forefront Service Manager (miisclient.exe). Nota: para ejecutarlo deberéis hacerlo con runas y con las credenciales que tengáis configuradas en los servicios “Forefront Identity Manager Service” y “Forefront Identity Manager Synchronization Service” (típicamente la cuenta de granja de SharePoint). Ejecuto el Manager pero: chasco. La propiedad está ahí, disponible, vivita y coleando. Camino cerrado.

Y de pronto… destello de lucidez. ¿Permisos? La cuenta de servicio de los servicios de FIM es mi cuenta de granja de SharePoint, y recuerdo que para provisionar el User Profile Service, dicha cuenta debe ser “ascendida” al grupo de administradores locales del servidor. Remember: http://sharejoint.blogspot.com/2011/10/user-profile-synchronization-service-de.html

Actúo resolutiva y firmemente: añado mi cuenta de granja de SharePoint a administradores locales del servidor y reinicio el “SharePoint 2010 Timer” (OWSTIMER). ¿Suficiente? Aún no. Reinicio el User Profile Synchronization Service en Services on server. ¿Suficiente? ¡Sí! ¡Ya puedo añadir mapeos!

Resumen de la solución:

  • Establecer cuenta de los servicios “Forefront Identity Manager Service” y “Forefront Identity Manager Synchronization Service” como administrador local
  • Reiniciar servicio “SharePoint 2010 Timer”
  • Reiniciar “User Profile Synchronization Service” desde Services on server

 

Una vez añadidos los mapeos, tened en cuenta que habría que revertir el cambio y volver a quitar esa cuenta de admnistradores locales.

Espero que toda esta odisea os sirva como guía de troubleshooting para fenómenos similares en vuestros entornos.

Instalar SharePoint 2010 de forma desatendida con AutoSPInstaller

27.10.11 / Comments (0) / by Enric Carrión

Brian Lalancette es el señor al que hay que hacer un monumento por haber materializado un sueño que muchos anhelábamos pero creíamos utópico: la instalación y configuración de una granja SharePoint mediante scripts.

El proyecto se llama AutoSPInstaller y para aquellos escépticos que duden si vale la pena invertir tiempo en ello os diré: habéis estado perdiendo el tiempo viviendo sin ello. Más vale tarde que nunca.

http://autospinstaller.codeplex.com/

http://blogs.technet.com/b/heyscriptingguy/archive/2010/03/23/hey-scripting-guy-march-23-2010.aspx

De forma resumida, todo el proceso de instalación de prerequisitos, binarios de SharePoint, wizard de SharePoint Technologies, wizard de configuración de granja, servicios, my site, aplicaciones web iniciales, indexación de PDF con iFilter y otros tweaks de configuración (disable loopback adapter, comprimir las carpetas de logs) queda automatizado en un PowerShell que podemos invocar y al que proporcionamos un fichero de configuración XML que contiene todos los parámetros necesarios: URLs, conexión a BD, nombres de BD, cuentas de servicio, servicios a provisionar… Este es el aspecto de SQL Server una vez configurado todo.

Esto sí que es tenerlo todo bien ordenadito, ¿eh? Y la guinda es que, al terminar todo el proceso, abrirá un navegador con tres pestañas tres, para que os maravilléis de cómo os deja funcionando el Central Administration, el My Site y el portal de inicio.

Este script requiere por nuestra parte de la confección de una carpeta con el slipstream de todos los instaladores y actualizaciones a ejecutar (incluyendo Service Packs, Cumulative Updates y Language Packs). También requiere temporalmente desactivar la UAC de Windows y deshabilitar las alertas sobre descarga de ficheros .EXE. Y por supuesto, de la creación de los usuarios de dominio para las cuentas de servicio con sus permisos iniciales

Estos requisitos quedan mucho mejor explicados en este post de Tobias Lekman. Seguidlo y comprobaréis qué facil es instalar una granja desde cero.

http://blog.lekman.com/2010/11/automated-sharepoint-2010-installations.html

Tips:

1) Recordad a ejecutar el script desde sesión de Windows iniciada con el usuario de instalación (típicamente spsetup)

2) Contad con espacio libre suficiente en disco antes de empezar la instalación (mínimo 2-3GB).

3) Usad una PassPhrase de granja compleja que contenga al menos tres de estos cuatro tipos de carácteres: mayúscula, minúscula, número, carácter no alfabético. Si no es así, el proceso fallará.