El problema no es empezar, es continuar!!

Los blogs forman parte de lo que se llama la Web 2.0, los blogs están de moda, tener uno “mola”, cuentas tu vida, tus historias e incluso la cosas de otros. Los blogs tecnológicos se han convertido en una herramienta imprescindible en poco tiempo. Aportan la información y experiencia que no encontramos de los fabricantes y especificaciones. Los blogs están abriendo el conocimiento y la experiencia “seguro que hay alguien que ya le ha pasado antes o lo ha hecho antes”.

Microsoft por ejemplo se dio cuenta que las comunidades eran imprescindibles para conseguir el soporte que no eran capaces de prestar y otros ya habían conseguido hace tiempo “había que estar ahí”. Las comunidades relacionadas con tecnología Microsoft se han multiplicado, los MVP’s y los evangelistas están haciendo una tarea didáctica muy importante, y están teniendo éxito porque no se guardan información e intentan que todo el mundo participe.

Últimamente se están estilando los blogs corporativos, consisten en blogs promocionados por las empresas para publicitar a sus profesionales (y así misma). El problema viene cuando escribir se convierte en una obligación. Un blog es difícil de mantener, es necesario dedicarle mucho tiempo. Se necesita tiempo en escribirlo y prepararlo. Sobre todo cuando después de haberse pasado la euforia de la primera entrada dejamos de escribir o ya no encontramos tiempo ni ganas. Entonces el blog se convierte en una obligación más que en una idea o actitud.

Mi consejo es que os animéis a escribir un blog, es una actividad muy gratificante, nos sirve para clarificar las ideas y ampliar los conocimientos.

Si estáis empezando podéis visitar el post Check Point For Aspiring Blogger.

¿Sobre qué podemos escribir?

  • Post rápidos: podemos escribir acerca de una noticia u otra entrada muy completa. No es bueno escribir muchas de este tipo.
  • Post detallados: consiste en hablar acerca de un tema de forma muy detallada. ´Son útiles pero difíciles de preparar.
  • Step by step: consiste en un paso a paso. La gente lo agradece mucho
  • Post resolutivos: hablan de como resolver un problema que nos hemos encontrado.

Infopath Form Services y Office Forms Server

Continuando con el anterior post “Empezando con Infopath”, vamos a subir un poco más de nivel para ver en que versiones de sharepoint podremos utilizar Infopath Form services. En la siguiente imagen podemos ver las funcionalidades por versión de sharepoint:

clip_image002

 

Fijaros que Infopath Form services solo está disponible para la versión Enterprise de MOSS, con lo que si tenemos la versión Standard o wss3, ¿no podemos utilizar Infopath Form Services?. La respuesta, es que “sí podemos”, pero en función de que versión tengas de sharepoint habrá una solución distinta.

¿Cómo uso Infopath Form Services si tengo WSS3?

Lo que ha hecho Microsoft para este caso es sacar el componente de Infoptah Form services en un paquete que lo ha denominado “Microsoft Office Forms Server”. Form Server está basado en WSS3 por lo que no tendremos ningún problema a la hora de montarlo en nuestra granja de Wss3.

El instalador de Form server instala todos los binarios de Wss3 + los necesarios para infopath forms services.

 

Office Form server

Office Form server es el nombre que se ha dado a sacar Infopath Form services de MOSS y meterlo en un paquete aparte junto con Wss3.

Algo parecido se ha hecho por ejemplo con Search Server o Project Server.

image

La forma de licenciar Office Form server es la siguiente:

Office Forms Server

– Se licencia por servidor.

– Se necesita una CAL por cada cliente que que accede a Office Forms Server 2007

Office Forms Server for Internet Sites

– Se licencia por servidor.

– Únicamente para extranet e internet sites

– Incluye toda la funcionalidad de Microsoft Office Forms Server 2007.

 

De manera que tendremos que adquirir una licencia por servidor de la granja que tenga habilitadas las funcionalidades de Infopath. Si nuestra ganja wss3 está formada por dos frontales deberíamos adquirir dos licencias de servidor de Form server. Si solo tubiéramos una licencia de Form server también podríamos hacer que funcionara en uno de los nodos pero de forma muy limitada y perdiendo la alta disponibilidad.

¿Cómo uso Infopath Form Services si tengo MOSS 2007 Standard?

Este caso es distinto al de wss3 ya que la instalación de MOSS 2007 lleva todos los binarios y ficheros de la Enterprise y es a la hora de introducir la licencia cuando se habilitan o deshabilitan las funcionalidades, además que siempre podemos pasar a la Enterprise.

Para este caso Microsoft recomienda que habilites las características Enterprise y adquieras una licencia CAL de Enterprise para aquellos usuarios que usen solo las funcionalidades Enterprise.

Por lo que tendremos que ser nosotros los que limitemos los usuarios para no tener que adquirir demasiadas CAL de Enterprise.

Server and client access licensing. For each server, or each server in a farm, a valid server license must be purchased. For each client accessing Office SharePoint Server 2007, a Standard CAL must be purchased. To enable the enterprise features of Office SharePoint Server 2007, an Enterprise CAL, in addition to the Standard CAL, must be purchased. Once the enterprise features are enabled on a server, clients accessing that server, or farm of servers, should have a valid Enterprise CAL in addition to their Standard CAL when accessing the enterprise functionality.

De modo que para que los usuarios puedan utilizar Infopath Form Services en MOSS tendremos que adquirir una CAL Standard + CAL de Enterprise por cada usuario que lo utilice.

Podéis encontrar más información de licenciamiento en:

Microsoft Office SharePoint Server 2007 and Related Technologies pricing

Microsoft Office SharePoint Server 2007 frequently asked questions

o consultando con vuestro soporte preventa o comercial de Microsoft.

¿Puedo montar Office Form Server sobre una granja MOSS Standard?

Técnicamente se puede, aunque no es la mejor solución técnica y económica, ya que el coste de licencias es muy similar y casi no sale rentable.

En caso que ya tengas adquirida las licencias de Form Server puedes agregar un nuevo nodo con Form Server a la granja pero con muchas limitaciones:

  • No pueden coexistir en un mismo equipo Office Form Server y MOSS 2007, por lo que tendremos que montarlo en nuevo nodo.
  • Como las licencias de Form Server van por servidor (y CAL de usuario) deberíamos limitar los accesos a la funcionalidad de Infopath services solo a aquellos nodos que tengan adquirida la licencia.
  • No podremos utilizar las funcionalidades de MOSS (publicación, colaboración etc.) en el nodo que tenga instalado Form Server, ya que éste solo tendrá los binarios de Wss3 y puede que no sea capaz de procesar las peticiones a determinados sitios con estas características. Tendremos que limitar los accesos a este servidor solo para los nuevos sitios que utilicen Infopath Forms Services y los usuarios que tengamos CAL de Form server adquirida.

 

Como resumen, si tenemos MOSS 2007 Standard es mejor pasar a la versión Enterprise de MOSS en lugar de adquirir Office Form Server.

 

Podéis encontrar más información técnica en:

Microsoft Office Forms Server TechNet TechCenter

Planning and architecture for Office Forms Server 2007

SPDisposeCheck con Visual Studio

En el post Using SPDisposeCheck in Visual Studio podemos encontrar un ejemplo de como integrar SPDisposeCheck con Visual Studio, de forma que una vez compilada nuestra librería podáis validarla sin tener que abrir una consola de comandos. Bastante cómodo para los que no nos gusta escribir sobre una pantalla negra.

 

Para hacerlo, abriremos VStudio > Herramientas > Herramientas externas …   sobre el diálogo que nos aparezca indicaremos los datos del exe de SPDisposeCheck y los argumentos de ejecución.

A continuación completaremos los siguientes valores como indica el post original:

Title:  SPDispose Check
Command: C:Program FilesMicrosoftSharePoint Dispose CheckSPDisposeCheck.exe  (Ruta completa del exe de SPDisposeCheck )
Arguements: $(TargetName)$(TargetExt)                     

Initial Directory: $(TargetDir)
Use Output Window: Lo marcamos

 

image

 

Una  vez completado, aplicamos y ya tendremos disponible en el menú de herramientas una nueva opción con el título “SPDispose Check”.

Al ejecutar la opción veremos como nos aparece en la venta Output el resultado de SPDisposeCheck.

 

image

 

Espero que os haya servido.

System.IO.IOException device is not ready

Al añadir un nuevo nodo a la granja se producía la excepción “System.IO.IOException: el dispositivo no está listo” o “System.IO.IOException: device is not ready” en el wizard de configuración:

 

Exception: System.IO.IOException: The device is not ready.

at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)

at System.IO.Directory.InternalCreateDirectory(String fullPath, String path, DirectorySecurity dirSecurity)

at System.IO.DirectoryInfo.Create(DirectorySecurity directorySecurity)

at Microsoft.SharePoint.Administration.SPProvisioningAssistant.CreateDirectory(DirectoryInfo di, Boolean secureAdminAccess)

at Microsoft.SharePoint.Administration.SPServer.CreateDirectory(String path, Boolean secureAdminAccess)

at Microsoft.SharePoint.Administration.SPServer.CreateDirectory(String path)

at Microsoft.SharePoint.Administration.SPUsageSettings.EnsureLogFileDirectories(SPFarm farm)

at Microsoft.SharePoint.Administration.SPWebApplication.Provision()

at Microsoft.SharePoint.Administration.SPWebServiceInstance.Provision()

at Microsoft.SharePoint.Administration.SPFarm.Join()

at Microsoft.SharePoint.PostSetupConfiguration.ConfigurationDatabaseTask.CreateOrConnectConfigDb()

at Microsoft.SharePoint.PostSetupConfiguration.ConfigurationDatabaseTask.Run()

at Microsoft.SharePoint.PostSetupConfiguration.TaskThread.ExecuteTask

 

El problema consiste en que al agregar el nuevo nodo a la granja, sharepoint intenta configurar el nuevo nodo con los paths de logs y análisis de uso configurados en la consola de administración. De manera que si especificamos en la administración central una unidad de disco que no existe en el nuevo nodo lanzará una excepción al no poder crear el directorio.

La solución consiste en especificar un path en los logs y y análisis de uso que dispongan todos los nodos de la granja. En mi caso, tenía configurado que los logs se almacenaran en la unidad “D:” y el nuevo nodo solo tenía la unidad “C:”, bastó con indicar la ruta estándar y volver a configurar.

Antes de volver a configurar tuve que desacoplarlo de la granja ya que se queda a medias, y eliminar a mano los sitios web en el iis creados al extender los web applications.

 

La solución original la podéis encontrar en System.IO.IOException Error in the Configuration Wizard.

Espero que os sirva.

Error fatal CManagedResources.GetScopeId

Sharepoint nunca te deja de sorprender, cada día me pregunto “¿qué me pasará hoy?”.

Hoy lo hizo con un bonito pantallazo:

clip_image002

El error es nítido!!, resulta que estaba haciendo una aplicación de consola que validaba que estuvieran construidos correctamente una serie de elementos, y para ello utilizaba FullTextSqlQuery para algunas búsquedas. Que sorpresa la mía que al indicar el scope en la consulta me apareció este mensajito.

El problema era que estaba utilizando la dll Microsoft.Sharepoint.Search sobre un MOSS, simplemente cambiando la referencia por la de Microsoft.Office.Server.Search todo se solucionó. En mi código solo tuve que cambiar el using y la llamada al constructor del FullTextSqlQuery.

Espero que os sirva.

[Sharepoint] HRESULT: 0x80040D1B

Este error me ocurría al intentar acceder a la configuración de búsquedas del SSP en MOSS.  Al crear un dominio en mi máquina virtual pasaron todos los usuarios locales a ser usuarios del dominio, por lo que los servicios estaban configurados con la referencia antigua. Aún cambiando las identidades de todos los pool de aplicaciones y los servicios windows me seguía dando el error.

La solución consistió en entrar en la administración central > Operaciones > Servicios del servidor, seleccionar “Office Sharepoint Server Search” y cambiar las credenciales del servicio con un usuario del dominio y un iisreset.

Espero que os sirva.

 

Los errores que me daban eran:

Event Type:    Error
Event Source:    Office SharePoint Server
Event Category:    Servicios compartidos de Office Server
Event ID:    6481
Date:        18/02/2009
Time:        11:27:21
User:        N/A
Computer:    W2K3R2
Description:
No se pudo ejecutar el trabajo del servidor de aplicaciones para la instancia de servicio Microsoft.Office.Server.Search.Administration.SearchServiceInstance (b4b27e04-22fb-4be0-86f3-2dbb418adbc1).

Motivo: Exception from HRESULT: 0x80040D1B

Detalles de soporte técnico:
System.Runtime.InteropServices.COMException (0x80040D1B): Exception from HRESULT: 0x80040D1B
   at Microsoft.Office.Server.Search.Administration.SearchServiceInstance.SynchronizeDefaultContentSource(IDictionary applications)
   at Microsoft.Office.Server.Search.Administration.SearchServiceInstance.Synchronize()
   at Microsoft.Office.Server.Administration.ApplicationServerJob.ProvisionLocalSharedServiceInstances(Boolean isAdministrationServiceJob)

For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.

 

 

Event Type:    Error
Event Source:    Office SharePoint Server
Event Category:    Servicios compartidos de Office Server
Event ID:    6482
Date:        18/02/2009
Time:        11:27:36
User:        N/A
Computer:    W2K3R2
Description:
No se pudo ejecutar el trabajo de administración del servidor de aplicaciones para la instancia de servicio Microsoft.Office.Server.Search.Administration.SearchAdminSharedWebServiceInstance (75449392-d46b-4c1a-9604-8997018cdb3d).

Motivo: El nombre de cuenta especificado no es válido.
Parameter name: account

Detalles de soporte técnico:
System.ArgumentException: El nombre de cuenta especificado no es válido.
Parameter name: account —> System.Security.Principal.IdentityNotMappedException: Some or all identity references could not be translated.
   at System.Security.Principal.NTAccount.Translate(IdentityReferenceCollection sourceAccounts, Type targetType, Boolean forceSuccess)
   at System.Security.Principal.NTAccount.Translate(Type targetType)
   at Microsoft.Office.Server.Utilities.WindowsSecurity.ValidateAccount(NTAccount account, Boolean throwIfInvalid)
   — End of inner exception stack trace —
   at Microsoft.Office.Server.Utilities.WindowsSecurity.ValidateAccount(NTAccount account, Boolean throwIfInvalid)
   at Microsoft.Office.Server.Administration.SharedAccessRule.Validate()
   at Microsoft.Office.Server.Administration.SharedComponentSecurity.SetAccessRule(SharedAccessRule accessRule)
   at Microsoft.Office.Server.Administration.SharedResourceProvider.GetApplicationSecurity()
   at Microsoft.Office.Server.Administration.SharedWebServiceInstance.ProvisionSharedResourceProviderWebConfigSettings(SharedResourceProvider srp)
   at Microsoft.Office.Server.Administration.SharedWebServiceInstance.Synchronize()
   at Microsoft.Office.Server.Administration.ApplicationServerJob.ProvisionLocalSharedServiceInstances(Boolean isAdministrationServiceJob)

For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.

[Sharepoint] Introducción al desarrollo

Los últimos meses nos hemos centrado en preparar una serie de post para ayudar a los desarrolladores iniciados en Sahrepoint para darles un empujón y una guía básica.

Os resumo los post más relevantes:

 

¿Por donde empezar?

Quick reference Sharepoint

Referencia con enlaces imprescindibles para empezar a desarrollar en un entorno Sharepoint.

Best Practice en el desarrollo con Sharepoint

Referencias a post con best practices para el desarrollo con WSS3 y MOSS2007.

 

Herramientas

Herramientas para el desarrollo en Sharepoint

Lista con referencias a varias de las herramientas más utilizadas y recomendables para trabajar con Sharepoint.

Introducción a las Visual extension for Sharepoint

Introducción sobre como hacer un proyecto con VSeWSS.

Habilitar intellisense para Xml de definición de Sharepoint

 

Personalización y WebParts

Modificar la apariencia de nuestro sitio

Edición rápida desde Sharepoint Designer

Cómo realizar cambios en las páginas de sharepoint sin desarrollo.

WebPart de contenido con formato

Cómo definir nuestro propio WebPart de contenido con un formato diferente

Page Templates con ayuda del Sharepoint Designer

Más allá del Hola Mundo

Ejemplo de WebPart sin utilizar el Render.write.

Ajax sobre Sharepoint

Cómo montar ajax sobre una aplicación sharepoint.

Implementación de Contentypes

Cómo implementar contentypes en una solución

Capturando eventos en Sharepoint

Opciones del QuickLaunch de Wss3 mediante SPNavitaionProvider

Cómo modificar el Quicklaunch.

Definir Lookup Site Columns desde una Feature

 

Seguridad

Cambiar las credenciales de usuario en Sharepoint

Asignación CAS de Sharepoint por contexto de usuario

 

Administración

Operaciones con Stsadm

Listado con las opciones de stsadm.

Ejecutar de manera inmediata de un job con stsadm

Añadir y desplegar una solución en Sharepoint

Security Provider con ADAM en MOSS y WSS3

MOSS and Hyper-V

Post de Enrique blanco sobre las ventajas de montar MOSS sobre Hyper-V

PowerShell & SharePoint I

Post de Álvaro Arias acerca de como utiliza powershell con Sharepoint.

 

 

Hasta aquí la temática sobre la “Introducción al desarrollo con Sharepoint”, ahora nos centraremos en temas un poco más avanzados como: Search Server, Infopath, Excel services, etc..

Best Practice en el desarrollo con Sharepoint

Hay una cosa que tenemos que tener clara y es que Sharepoint no deja de ser un producto más o menos cerrado sobre el que podemos hacer nuestras adaptaciones y personalizaciones. Y como cualquier producto debemos conocer tanto sus funcionalidades como sus entrañas para poder hacer soluciones lo más estables posibles. Programar con el modelo de objetos de Sharepoint no es cómo programar una aplicación de asp.net corriente, tiene sus “cositas” que hacen que te tires horas delante de tu máquina virtual para hacer algo que para el usuario es una tontería.

Después de este rollo, lo que quiero dejaros hoy es una serie de enlaces sobre “mejores prácticas de programación” sobre Sharepoint, os aconsejo que le dediquéis en algún momento media hora a revisar este tipo de cosas.

 

Recursos

Best Practices Resource Center for SharePoint Server 2007

Centro de recursos de Microsoft para las B&P sobre Sharepoint.

Microsoft Best Practices Analyzer for WSS3 and MOSS2007

Herramienta que analiza nuestro granaja y compone una serie de informes acerca de como mejorar el rendimiento respecto a la estructura y configuración.

General

Best Practices: Common Coding Issues When Using the SharePoint Object Model

Documento con algunas recomendaciones en el desarrollo.

Best practices

Contiene varios enlaces a artículos en technet acerca de funcionalidades de MOSS.

Best practices for developing accessible Web sites (white paper)

B&P sobre accesibilidad en MOSS.

InfoPath Forms Services best practices

Algunas recomendaciones o comentarios acerca de Infopath.

ForeFront en Sharepoint

¿Pero alguien lo ha instalado?

Liberación de recursos

Best Practices: Using Disposable Windows SharePoint Services Objects

B&P sobre como liberar correctamente los objetos de Sharepoint.

SharePoint 2007 and WSS 3.0 Dispose Patterns by Example

Post con ejemplos acerca de la liberación. Tiene ejemplos que incluso no hablan en la referencia de MSDN.

SPDisposeCheck

Posta de Álvaro Arias acerca de la herramienta SPDisposeCheck para detectar posibles errores de liberación.

Libros

Microsoft Office SharePoint Server 2007 Best Practices

Cambiar las credenciales de usuario en Sharepoint

En ocasiones puede plantearse el caso en el que necesitemos manejar los objetos de Sharepoint pero con una identidad distinta a la del usuario logado o el del administrador.

Dentro del contexto de Sharepoint disponemos de varios métodos para cambiar las credenciales:

RunWithElevatedPrivileges

Requiere de Impersonate=true

SPSecurity.RunWithElevatedPrivileges( delegate() {

….

} );

 

WindowsImpersonationContext

Nos permite ejecutar nuestro código con las credenciales de otro usuario. En este ejemplo con el usuario configurado en el pool de aplicaciones:

using (WindowsImpersonationContext wic = WindowsIdentity.Impersonate(IntPtr.Zero))

{

………….

}

 

SHAREPOINT\system

Consiste en capturar el Token del usuario “system” para conectar de nuevo con ese token.

El usuario “SHAREPOINT\system” es un usuario especial, utilizaremos este caso cuando nos encontremos en un EventReceiver ya que no podremos utilizar RunWithElevatedPrivileges.

using (SPWeb webOrigUser = properties.OpenWeb())
{
    SPUserToken token = webOrigUser.AllUsers[«SHAREPOINT\system»].UserToken;
    using (SPSite site = new SPSite(properties.SiteId, token))
    {
        using (SPWeb currentWeb = site.OpenWeb(properties.RelativeWebUrl))
        {
            try
            {
                DisableEventFiring();

                SPList sourceList = currentWeb.Lists[properties.ListId];
                SPListItem itemAdded = sourceList.GetItemById(properties.ListItem.ID);
                ……

            }
            catch (Exception ex1)
            {
                properties.ErrorMessage = ex1.Message;
                properties.Status = SPEventReceiverStatus.CancelWithError;
            }
            finally
            {
                EnableEventFiring();
            }

        }
    }
}

 

Fuera del contexto de Sharepoint

Para poder ejecutar el modelo de objetos de Sharepoint fuera del contexto de sharepoint, es decir en un proceso distinto, ya sea un servicio web en otro workerprocess o una aplicación de consola.

En este caso nuestro código se ejecutará con las credenciales del usuario que maneje el proceso.

Este caso lo utilizaremos cuando tengamos que hacer integraciones con sistemas que no pueden migrarse o aplicaciones para migrar contenido.

Para utilizar este método el usuario con el que hagamos logon además de tener acceso al site debe tener el privilegio “Actuar como parte del sistema operativo”, en mi caso le he dado permisos de administrador de la máquina directamente. Si no lo hacemos nos permitirá conectar pero nos dará una excepción al acceder a los elementos de las listas.

Podéis consultar más ejemplos: http://support.microsoft.com/kb/306158/es

En mi caso he creado una aplicación de consola que muestra el contenidos de una lista:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Security.Principal;
using Microsoft.SharePoint;

namespace ConsoleApplication1
{
    class Program
    {

        const int LOGON32_PROVIDER_DEFAULT = 0;
        const int LOGON32_LOGON_NETWORK = 3;

        [DllImport(«advapi32.dll», SetLastError = true)]
        private static extern bool LogonUser(String lpszUsername, String
        lpszDomain, String lpszPassword,
        int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

        [DllImport(«kernel32.dll», CharSet = CharSet.Auto)]
        private extern static bool CloseHandle(IntPtr handle);

        [DllImport(«advapi32.dll», CharSet = CharSet.Auto, SetLastError = true)]
        public static extern int DuplicateToken(IntPtr hToken,
            int impersonationLevel,
            ref IntPtr hNewToken);

        [DllImport(«advapi32.dll», CharSet = CharSet.Auto, SetLastError = true)]
        public static extern bool RevertToSelf();

 

        static void Main(string[] args)
        {
            WindowsImpersonationContext context = impersonateValidUser(«miusuario», «midominio», «password»);
            try
            {
                using (SPSite site = new SPSite(«http://localhost/))
                {
                    using (SPWeb web = site.OpenWeb())
                    {
                        Console.WriteLine(web.Lists[«milista»].Title);
                        foreach (SPListItem item in web.Lists[«milista»].Items)
                            Console.WriteLine(item.Title);
                    }
                }
            }
            finally
            {
                context.Undo();
            }

            Console.ReadLine();
        }

        private static WindowsImpersonationContext impersonateValidUser(String userName, String domain, String password)
        {
            WindowsIdentity tempWindowsIdentity;
            WindowsImpersonationContext impersonationContext;
            IntPtr token = IntPtr.Zero;
            IntPtr tokenDuplicate = IntPtr.Zero;

            if (RevertToSelf())
            {
                if (LogonUser(userName, domain, password, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, ref token))
                {
                    if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
                    {
                        tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
                        impersonationContext = tempWindowsIdentity.Impersonate();
                        if (impersonationContext != null)
                        {
                            CloseHandle(token);
                            CloseHandle(tokenDuplicate);
                            return impersonationContext;;
                        }
                    }
                }
            }
            if (token != IntPtr.Zero)
                CloseHandle(token);
            if (tokenDuplicate != IntPtr.Zero)
                CloseHandle(tokenDuplicate);
            return null;
        }

    }
}

Qué pasa con los foros de Sharepoint en MSDN y TechNet?

Recientemente Microsoft ha actualizado la plataforma de sus foros de MSDN y Technet a la versión 3 “http://social.technet.microsoft.com/Forums/en-US/categories/

Los contenidos de todos los foros de la antigua plataforma ya se han migrado a la nueva, el problema viene con el foro de sharepoint en español. Resulta que si intentas acceder al foro de sharepoint en español para crear un nuevo mensaje o ver la lista de hilos nos lleva a una página de error no encontrada “404”. La ruta raiz del foro debería ser “http://social.technet.microsoft.com/Forums/es-ES/mosses/threads/”, de echo los hilos ya creados aparecen como “http://social.technet.microsoft.com/forums/es-ES/mosses/thread/{GUID}/”.

Si queremos agregar un nuevo hilo en español podremos hacerlo, pero tendrá que ser en foros en inglés, lo cual no creo que resulte muy útil.

Me da la sensación que todavía no han terminado con la migración así que tocará esperar un tiempo. Al menos podremos seguir consultando el contenido antiguo desde la opción de búsqueda del foro o google.