lunes, 13 de enero de 2014

Error: “value does not fall within the expected range” cuando intentamos subir un archivo a una biblioteca desde código en SharePoint 2013

Este error existe desde WSS 3.0 y puede deberse a muchas razones dependiendo del contexto del error. En esta caso es sobre una biblioteca de documentos que estamos intentando subir un archivo con código utilizando el Modelo de Objetos de Servidor de SharePoint.

El código de servidor para subir archivos a una biblioteca podemos encontrar en dos métodos mostrados a continuación:

SPFolder myLibrary = oWeb.Folders[documentLibraryName];
y 

SPFolder myLibrary = oWeb.GetList(URL OR NAME);
Pero al ejecutar la línea siguiente da el error:

SPFile spfile = libFolder.Files.Add(fileName, fileStream); 
Ambos son válidos y ambos pueden marcar el mismo error.   Desde la perspectiva de rendimiento utilizar GetList() es más eficiente que Folders[] por el simple echo que uno es un método que localiza el nombre de la biblioteca y el otro un arreglo de todas las bibliotecas del sitio y que debe de recorrer secuencialmente.
Bueno y donde esta el error, recordemos que el error indica que el valor no cae dentro del rango esperado.   Esto quiere decir que el Método Files.Add() no le parece el valor ingresado.  
Para saber donde esta el problema tenemos que revisar la sintaxis del método Add.  Que según la documentación de MSDN es la siguiente:
public SPFile Add(
string urlOfFile,
byte[] file
)
Donde el string espera una dirección URL relativa del archivo.  Que al final si ya estamos ubicados en el biblioteca no podemos volver a repetir la dirección URL relativa de toda la colección de sitios donde nos ubicarnos porque estaríamos duplicando la dirección y SharePoint valida que podemos subir un archivo si es una URL válida con lo cual no es.  Ya que SharePoint construye la ubicación basado en la ubicación de la biblioteca.  Entonces deducimos que la dirección URL relativa a la que se refiere la documentación es relativa a la biblioteca únicamente, y esto nos lleva a concluir que lo que espera el método SPFiles.Add() es únicamente el nombre del archivo.
La solución final es la siguiente:
using (SPSite oSiteCollection = new SPSite("http://localhost"))
{
using(SPWeb oWebsite = oSiteCollection.AllWebs["MyWebSite"])
{
SPWebCollection collWebsites = oWebsite.Webs;
SPFile oFile = oWebsite.GetFile("MyDocLib/MyFile");
foreach (SPWeb oWebsiteNext in collWebsites)
{
SPFolder oFolder = oWebsiteNext.GetFolder("Shared Documents");
SPFileCollection collFiles = oFolder.Files;

string strDestUrl = oFile.Name;
byte[] binFile = oFile.OpenBinary();
collFiles.Add(strDestUrl, binFile);

oWebsiteNext.Dispose();
}
}
}
NOTA: El código de arriba deberá de reemplazar los valores locales utilizados y la lógica de su código lo importante de notar en el código es el orden y el valor esperado por SPFiles.Add(), por lo que deberá variar su código del mostrado arriba.
SharePoint4Fun!,
Juan Manuel Herrera Ocheita

jueves, 9 de enero de 2014

Planificando la seguridad dentro de las colecciones de sitios en SharePoint

En este artículo vamos a ver nivel de colección de sitios la estrategia de seguridad ya que es el contenedor lógico de contenido limítrofe o fronterizo para definir los permisos del contenido.  Esto quiere decir que cada colección de sitios no comparte con otras colecciones de sitios sus grupos, usuarios, permisos y contenido.

Los grupos definidos dentro de la misma colección de sitios si es compartida entre todos los sub-sitios, bibliotecas, listas y elementos.

La seguridad de SharePoint a nivel de colección de sitios no ha cambiado desde la versión 2007 y sigue vigente hasta SharePoint Online.   El Heredar los permisos en los niveles inferiores y el “romper” el vínculo de esta herencia (de permisos) siguen vigente en todas las versiones arriba mencionadas.

Abajo podemos ver un árbol de contenido de SharePoint que muestra desde la granja o conjunto de servidores, los servidores y sus roles, las aplicaciones Web, las bases de datos y dentro de cada base de datos por lo menos una o más colecciones de sitios.  Dentro de cada colección de sitios podemos encontrar sitios web o sub-sitios y dentro de ellos listas (o bibliotecas), dentro de cada lista, carpetas, dentro de cada carpeta elementos que pueden ser documentos, archivos, imágenes. Hasta a nivel de elemento puede definirse el permiso a un usuario o grupo de usuarios.

ContainerHierarchy

Una imagen habla mejor que mil palabras abajo un diagrama que muestra el plan de implementación de permisos dentro de una colección de sitios.  Los permisos deben de definirse de forma de un embudo o símbolo de filtro donde la parte más amplia es donde el contenido más público o de conocimiento general debe de ser expuesto y a medida que vamos definiendo los sub-sitios se va restringiendo el acceso a los usuarios.  La única forma para restringirlos los permisos ya que deforma predeterminada se heredan es rompiendo la herencia  en los niveles inferiores de ese modo nos garantizamos que un usuario puede navegar hasta el punto en el cual tiene acceso a colaborar o compartir información.

image

En el ejemplo de arriba podemos apreciar que el punto de entrada de una amplia cantidad de usuarios se ubica en la parte superior del portal es decir http://hostname y a medida que va descendiendo si es interrumpida la herencia hay posibilidad de disminuir la amplitud o el número de usuarios que tienen acceso a los recursos inferiores como sub-sitios.  Para explicar a detalle podemos decir que una amplia cantidad de usuarios tienen acceso a http://hostname y los sub-sitios subweb2 y subweb3 no así para el sub-sitio subweb1 que tiene interrumpida la herencia y que para el caso del sub-sitio subweb101 hereda la misma herencia del sitio superior subweb1 pero no así de la raíz http://hostname/ que es donde la mayoría de usuarios tienen acceso. El otro caso definido en la imagen de arriba es el sub-sitio subweb301 que se ha interrumpido la herencia de permisos y no contiene todos los permisos que su sitio superior hereda del sitio raíz.

La otra recomendación a tomar en cuenta al momento de definir los permisos en SharePoint es que a pesar que los permisos se pueden definir a nivel de usuarios no es una buena práctica sino por el contrario crear los grupos de SharePoint, adicionar los usuarios que pertenecen al grupo y luego asignar los grupos a los recursos de SharePoint.  Abajo una imagen donde se muestra los recursos a los cuales se le puede aplicar los permisos.

Y luego si la administración de la seguridad organizacionalmente se maneja a nivel de directorio activo se pueden definir grupos del AD y asignarlos a los grupos de SharePoint de tal forma que los usuarios se adicionen a nivel de AD y no de SharePoint, pero esto dependerá de las políticas de seguridad para el portal y la organización.  Abajo una imagen de ejemplifica esto.  Si decidimos administrar el Directorio Activo deberemos ir nos por la opción de crear los grupos en el AD y asociarlos a los grupos de SharePoint.  Si decidimos administrar directamente los usuarios desde SharePoint se aplicarán estos directamente a los grupos de SharePoint.

image

El procedimiento recomendado para asignar permisos en SharePoint es el siguiente:

1) Crea un Grupo en SharePoint desde People and Groups

image

2) Agregar los usuarios que pertenecen al grupo

image

3) Asignar el permisos algún recurso de SharePoint (Sitio, Lista/Biblioteca, Carpeta, Elemento) .  Para ello es necesario dejar de heredar los permisos y asignar el grupo creado. 

image

Selecciona la opción Conceder Permisos y aplicar el grupo creado

image

En resumen vimos la visión de como debemos de implementar la seguridad en una Colección de Sitios en SharePoint y la mejor practica para realizarlo.  Y a pesar que los imágenes de SharePoint pertenecen a la versión Online este aplica para 2013, 2010 y 2007.

Hasta la próxima,

Juan Manuel Herrera

martes, 31 de diciembre de 2013

Caso Práctico:Depurando las dependencias no migradas en SharePoint 2010

Una de las plantillas encontradas en SharePoint 2007 que no todas pueden ser migradas a 2010 y mucho menos a 2013 son las plantillas de los 40 fantásticos, sino sabe de lo que hablo posiblemente no tiene de que preocuparse.

Las plantillas de los 40 fantásticos es una historia triste, ya que Microsoft no las adopto para las versiones posteriores de SharePoint y aunque algunas se adaptaron para 2010 estas no están disponibles para 2013.  Estas plantillas en el proceso generan muchos errores.   Si desea saber mas de las plantillas puede consultar los siguientes enlaces:

http://technet.microsoft.com/en-us/sharepoint/bb407286.aspx

http://blogs.technet.com/b/tothesharepoint/archive/2010/08/18/sharepoint-2010-products-upgrade-and-the-fabulous-40-application-templates.aspx

Para este caso vamos asumir que ya sea que sean plantillas de los 40 fantásticos o bien otras dependencias que no se lograron migrar de 2007 a 2010.  Si la migración reporto errores pero terminó y deseamos depurar las dependencias faltantes. Entonces ya hemos migrado de 2007 a 2010 una base de datos de contenido con varios errores de dependencias que no tenemos instaladas en la granja 2010 pero deseamos depurar los errores. Dependiendo de cada error se toman diferentes caminos (para más información puede ver el siguiente enlace:http://kancharla-sharepoint.blogspot.com/2013/08/resolving-missing-references-when.html) pero para este caso vamos a sumir que los sub-sitios que dieron error porque no están las plantillas instaladas eliminaremos dichos sub-sitios, para luego crear una nueva base de datos y allí migrar el contenido sin errores.  El procedimiento es el siguiente:

1. Crear una nueva aplicación Web (para operar cómodamente el contenido depurado)

New-SPWebApplication -ApplicationPool <String> -Name <String> [-DatabaseName <String>] [-DatabaseServer <String>] [-HostHeader <String>] [-Path <String>] [-Port <UInt32>] [-ServiceApplicationProxyGroup <SPServiceApplicationProxyGroupPipeBind>]

http://technet.microsoft.com/en-us/library/ff607931.aspx

Ejemplo: New-SPWebApplication –ApplicationPool “Nueva App Pool” –Name “SharePonit Web App temporal” –DatabaseName “wss_content_NuevoContenido” –HostHeader “” –Path “c:\temporal\Web4444” -Port 4444

2. Exportar el contenido al sistema de archivos

Export-SPWeb [-Identity] <SPWebPipeBind> -Path <String> [-IncludeUserSecurity <SwitchParameter>] [-IncludeVersions <LastMajor | CurrentVersion | LastMajorAndMinor | All>] [-NoFileCompression <SwitchParameter>]

http://technet.microsoft.com/en-us/library/ff607895.aspx

Ejemplo: Export-SPWeb –Idendity http://miwebmigrada –path “c:\temp\contenidodepurado” –IncludeUserSecurity – IncludeVerions All – NoFileCompression

3. Importar el contenido en la nueva aplicación Web

Import-SPWeb [-Identity] <SPWebPipeBind> -Path <String> [-IncludeUserSecurity <SwitchParameter>] [-NoFileCompression <SwitchParameter>] [-UpdateVersions <Append | Overwrite | Ignore>]

http://technet.microsoft.com/es-es/library/ff607613.aspx

Ejemplo: Import-SPweb –Identity “http://hostname:4444” –Path “c:\temp\contenidodepurado” –NoFileCompression –UpdateVerions Overwrite

4. Desmontar la base de datos de contenido de la aplicación Web nueva creada y de la migrada

Dismount-SPContentDatabase [-Identity] <SPContentDatabasePipeBind>

http://technet.microsoft.com/en-us/library/ff607764.aspx

Ejemplo: Dismount-SPContentDatabase –Identity “wss_content_NuevoContenido”

5. Montar la base de datos depurada en la aplicación web deseada

Mount-SPContentDatabase [-Name] <String> [-WebApplication] <SPWebApplicationPipeBind>

http://technet.microsoft.com/en-us/library/ff607581.aspx

Ejemplo: Mount-SPContentDatabase –Name wss_content_NuevoContenido –WebApplication “http://miwebmigrada

SharePoint4Fun!,

Juan Manuel Herrera Ocheita

sábado, 28 de diciembre de 2013

Tips para el proceso de migración de SharePoint 2007 a 2013

Primero lo primero no se puede pasar de SharePoint 2007 a 2013 de un solo con el procedimiento de base de datos acoplada o Attach data base, con herramientas de terceros es posible pero es un proceso lento y no esta libre de errores.  En 2007 hay dos procesos soportados In Place y Attached data base.  Pero el último es el adoptado y único para versiones posteriores, por lo que mantendremos esta tendencia desde 2007.

Para realizar la migración debemos de contar por lo menos con dos granjas una de SharePoint 2010 y otra de SharePoint 2013.

No es recomendado realizar un downgrade es decir una reducción de versión en el proceso de migración.  por ejemplo:  Tenemos una granja SharePoint 2007 Edición Enterprise y deseamos convertirla a SharePoint 2013 Edición Standard o a SharePoint Foundation. 

Lo contrario si es válido y posible, es decir hacer un upgrade o mejora de versión.  Por ejemplo de WSS 3.0 a SharePoint 2013 Enterprise o Standard.

A continuación una tabla de la ruta de migración posible del 2007 al 2013 en sus diferentes ediciones:

image

A continuación una tabla de la ruta de migración recomendada (en color amarillo):

image 

La recomendación se basa en que se utilice la misma edición de 2007 y hasta el final se utilice la edición deseada.  Abajo una tabla de las rutas no soportadas en las cuales se suponen escenarios de color rojo donde erróneamente se escoge una ruta de upgrade en el intermedio (en la versión 2010) y luego se decide equivocadamente hacer un downgrade, esto acarreará muchos errores en la etapa de migración de 2010 a 2013 que puede incluso impedir la migración.

image

Debemos de recordar el idioma en que esta instalado el SharePoint debe de ser el mismo a migrar o bien contar con el paquete de idioma instalado en las granjas de SharePoint a migrar que en este artículo hablamos de 2010 y 2013.

La configuración de las granjas es algo que no debe de tomarse a la ligera ya que esto puede desembocar en un proceso rápido y efectivo o lento y frustrante.

La configuración de Hardware debe de analizarse desde el misma granja de SharePoint 2007, ya que podemos contar con imprevistos como el que no se haya instalado 2007 en una base de datos de SQL Server sino a través de la versión incrustada o embedded y esto hará el proceso de extracción de la base de datos más doloroso y complicado.  Esto sucede cuando instalamos el SharePoint de forma solitaria o Stand Alone, instalación solamente diseñada para demostración y nunca recomendada para un ambiente de producción.  La sorprendente es encontrar empresas que tienen así instalado su SharePoint en modo stand-alone.

La otra configuración importante es la de SharePoint 2010 que a pesar que sea una granja “puente” ya que solo se instalará para migrar el contenido de 2007 a 2010 y de 2010 a 2013.  Debemos de asignar recursos adecuados para que el proceso de migración para que sea exitoso y eficiente.  Esta granja posiblemente no cuente con muchos recursos pero debemos prestar atención a la RAM y espacio en disco y en los servicios y contenido que estamos migrando.

A continuación la configuración mínima y recomendada por Microsoft para SharePoint 2007 Front End en sus diferentes ediciones

image

image

A continuación mi recomendación práctica para una migración para la versión SharePoint 2007

image

image

Para el servidor Puente o sea el servidor SharePoint 2010 las recomendaciones son las siguientes:

image

En la medida de disponer de mayor cantidad de RAM se garantiza un proceso más rápido de migración.  Y el espacio en disco se basa en el requerimiento de SharePoint de 5 veces el tamaño de la memoria RAM partiendo del mínimo recomendado de 80 GB + 5 Veces la RAM.  Se asume por ser un servidor puente que solo será un servidor, pero esto dependerá de la granja de SharePoint 2007 de origen cuantos servidores tienen ya que no solo se migrará contenido sino servicios también.

A continuación la recomendación mínima de una granja de SharePoint 2013 y un servidor de SQL Server 2012 en sus diferentes ediciones:

image

Comandos útiles para la migración de base de datos de contenido adjunta:

image

image

Bueno eso es todo por este artículo espero lo encuentren útil.

Hasta la próxima, SharePoint4Fun!,

Juan Manuel Herrera Ocheita

domingo, 17 de noviembre de 2013

Cómo resolver el problema de importar un sitio con diferente plantilla utilizando import-spweb

Este caso pueda ser poco usual pero pasa, a continuación explico el caso:

Se ha migrado el contenido de SharePoint 2010 a 2013 y luego se desea migrar un sitio hacia otra colección de sitios, pero el sitio que se desea migrar esta utilizando una plantilla que ya no es soportada en la versión 2013 de SharePoint, entonces cómo resolver este problema?.

Primero debes decir que para migrar un sitio de una colección de sitios a otra utilizamos la línea de comando export-SPWeb.  Para ello ejecutamos image SharePoint Management Shell  y ejecutamos una línea de comando parecida a esta:

PS c:\> export-SPWeb –Identity http://hostname/susitio –path “c:\temp\subsitio.cmp” –IncludeUserSecurity -IncludeVersions All

Luego intentamos crear un sub-sitio donde deseamos importar el contenido exportado, pero como no existe la plantilla podemos intentar crear un sitio con la plantilla de equipo por ejemplo.

Finalmente intentamos importar el contenido con una línea de comando similiar a la siguiente:

PS C:\> import-spweb –identity “http://nuevoservidor/sitios/nuevaCollecion/NuevoSubsitio" -path "c:\temp\subsitio.cmp" -IncludeUserSecurity -ActivateSolutions

Al ejecutar este comando nos muestra el siguiente mensaje de error:

import-spweb : Cannot import site. The exported site is based on the template
STS#2 but the destination site is based on the template STS#0. You can import
sites only into sites that are based on same template as the exported site.

La Solución

Eliminar el sitio creado y ahora vamos a crear un sitio desde línea de comando de la siguiente formar:

PS C:\> new-SPWeb -url http://nuevoservidor/sitios/nuevaCollecion/NuevoSubsitio -name "Nuevo Sitio" -template
STS#02 -UseParentTopNav -UniquePermissions

Al ejecutar la línea de comando nos mostrará el siguiente mensaje:

WARNING: Template is not found and is not applied.

Url
---
http://nuevoservidor/sitios/nuevaCollecion/NuevoSubsitio

No se preocupe este error nos ayudará ya que no aplicará ninguna plantilla y esto permitirá que utilice la plantilla del contenido importado.  O bien no incluir el parámetro –template y esto tendrá el mismo efecto.

Especifica la plantilla web para el nuevo sitio. La plantilla ya debe existir. Si no se especifica ninguna plantilla, no se aplica ninguna plantilla y se puede seleccionar más adelante.

Ahora ejecutamos de nuevo la línea de comando import-SPWeb.

PS C:\> import-spweb –identity “http://nuevoservidor/sitios/nuevaCollecion/NuevoSubsitio" -path r"c:\atemp\subsitio.cmp" -IncludeUserSecurity -ActivateSolutions

Log file generated:
        c:\temp\subsitio.cmp.import.log

Listo ya pudo importar el contenido de una plantilla no soportada en SharePoint 2013.

SharePoint4Fun!,

Juan Manuel Herrera Ocheita

martes, 5 de noviembre de 2013

Error Reporte RDL en SharePoint 2010 no despliega información o Type Sys.UI._Timer has already been registered

Este error no se manifiesta tan evidente ya que el navegador de IE 9, 10 no hará nada y por ende no mostrará la generación del reporte y es más funcionará para algunos usuarios y para otros no.

Si utilizamos las herramientas de desarrollador de IE presionando F12 desde IE en la pestaña de scripts podremos ver el siguiente detalle de error:

SCRIPT5022: Sys.InvalidOperationException: Type Sys.UI._Timer has already been registered. The type may be defined multiple times or the script file that defines it may have already been loaded. A possible cause is a change of settings during a partial update.
ScriptResource.axd?d=kPNVqg5Xk2xEHmG9iUkh6gb4nTjKg44qXODEnWnCK3WXpZEBMHocVoBFio19AkZm6XU5yigeZoGe2mg4Dmaq7JxvAk32sogRfD7ud5cTh5dVgp3pyap8Pqc2L3Eym8bxal5ATKCkLJDjXVUmA4sIWOvkUKp9Hs0UVf8fZ2TfizcKCAGb0&t=33137d1a

Gracias a Natalia Tsymbalenko por su solución con la pudimos resolver el problema:

http://sharing-the-experience.blogspot.com/2012/04/rsviewerpageaspx-type-sysuitimer-has.html

Lo único que quisiera agregar especialmente para usuarios no familiarizados con la estructura de SharePoint es que el web.config a modificar es de la Applicación Web donde esta el reporte instalado.  Una instalación de SharePoint puede contar con varias aplicaciones Web y no solo con una así que debe de validarse cual es la que debemos de modificar. 

Para ello puede ir al Servidor de SharePoint al IIS Manager y podrá ubicar la ruta de la aplicación Web de reportes:

image

Por ejemplo de forma predeterminada cuando creamos una aplicación web desde SharePoint esta la crea en la ubicación predeterminada del IIS que normalmente es c:\inetpub\wwwrooot\wss\VirtualDirectories y dentro de este directorio un directorio por cada aplicación Web por lo menos encontrará dos una del Central Administration y otra de la aplicación Web del portal. 

Y finalmente dentro de ese directorio encontrará el archivo de configuración web.config.  En la sección compilation batch verificar que el debug=”false” si esta activado debug=”true” cambielo a false y listo el así como vino desaparece.

<globalization fileEncoding="utf-8" />
<compilation batch="false" debug="false">
     <assemblies>
       <add assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
       <add assembly="System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
       <add assembly="Microsoft.Web.CommandUI, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
       <add assembly="Microsoft.SharePoint.Search, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
       <add assembly="Microsoft.Office.Access.Server.UI, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
       <add assembly="Microsoft.Office.Access.Services.UI, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
       <add assembly="Microsoft.SharePoint.Publishing, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
       <add assembly="Microsoft.Office.Server.Search, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
     </assemblies>
  …

</compilation>
 
Y ahora puede ejecutar los reportes desde IE 9 o 10 si este problema.

SharePoint4Fun,

Juan Manuel Herrera Ocheita

sábado, 2 de noviembre de 2013

Error al intentar consultar historial de versiones en SharePoint 2010

Este es uno de los errores que ha acompañado a SharePoint desde 2007 y en 2010 no ha sido la excepción.   Si el problema es general en las bibliotecas puede intentar instalar la actualización de Abril del 2013 que registra el problema y su corrección.

Pero si no le funciona puede validar si esta solución que abajo describo puede resolver su problema.

Primero el error que muestra es el siguiente:

image

Si verificamos el error en los logs de SharePoint encontraremos el siguiente detalle:

Unexpected      System.NullReferenceException: Object reference not set to an instance of an object.    at ASP._layouts_versions_aspx.__Render__control14(HtmlTextWriter __w, Control parameterContainer)     at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)     at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)     at System.Web.UI.HtmlControls.HtmlContainerControl.Render(HtmlTextWriter writer)     at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)     at System.Web.UI.HtmlControls.HtmlForm.RenderChildren(HtmlTextWriter writer)     at System.Web.UI.HtmlControls.HtmlForm.Render(HtmlTextWriter output)     at System.Web.UI.HtmlControls.HtmlForm.RenderControl(HtmlTextWriter writer)     ...  1ee23f45-af8f-4521-a190-3b795d3fdda4

El error en detalle describe que el error se debe a que esta esperando un objeto en memoria al cual no esta instanciado.  Es decir hace referencia de un objeto que esta ausente en ese momento.

Para esta solución utilizaremos SharePoint Designer 2010 para resolverlo.  Abrimos el sitio donde están las bibliotecas con el error y luego en la pestaña de navegación seleccionamos la opción “Todos los archivos”

image

Luego seleccionamos en la biblioteca con el error

image

Luego seleccionamos la carpeta Forms

image

Luego seleccionamos la página DispForm.aspx, presionamos el botón derecho para que levante el menú contextual y seleccione la opción Eliminar (para que luego podamos crearla de nuevo)

image

Ahora seleccionamos la opción Listas y bibliotecas de la sección Navegación.   

image

Luego seleccionamos nuevamente la biblioteca con error

image

Luego en la sección formularios presionamos el botón Nuevo

image

En el nombre del archivo escriba DispForm y luego presiona el botón Aceptar

image

Como resultado deberíamos observar que ya esta la página dentro de la sección Formularios.

image

Ahora si consultamos el historial de versiones nos debería mostrar una ventana similar a esta.

image

Eso es todo amigos nos vemos hasta la próxima.

SharePoint4Fun!,

Juan Manuel Herrera Ocheita