lunes, 29 de septiembre de 2014

Script para comparar contenido entre versiones de SharePoint

Para este articulo presentaré un procedimiento y scripts para leer el contenido de SharePoint Server 2007 a nivel de Transac-SQL ya que no contamos con PowerShell para esta versión de forma predeterminada (es posible instarlo, pero en ciertos ambientes por las restricciones dentro de la organización es una complicación).  Y para SharePoint Server 2013 utilizaremos PowerShell . 

La idea es generar un archivo CSV desde SQL Server desde el Management Studio para que basado en este archivo podamos de lado de SharePoint Server 2007 vía PowerShell leer el documento e ir validando por medio del modelo de objetos de SharePoint a nivel de PowerShell si existe dicho contenido y si el contenido es el más reciente.

Select
   Top W.FullUrl, W.Title, L.tp_Title as ListTitle, A.tp_DirName, A.tp_LeafName, A.tp_id , DS.Content , DS.Size, D.DocLibRowID, D.TimeCreated, D.Size, D.MetaInfoTimeLastModified, D.ExtensionForFile
From
   your_content_database.dbo.AllLists L With (NoLock) join
   your_content_database.dbo.AllUserData A With (NoLock)
      On L.tp_ID=tp_ListId join
   your_content_database.dbo.AllDocs D With (NoLock)
      On A.tp_ListID=D.ListID
      And A.tp_SiteID=D.SiteID
      And A.tp_DirName=D.DirName
      And A.tp_LeafName=D.LeafName join
   your_content_database.dbo.AllDocStreams DS With (NoLock)
      On DS.SiteID=A.tp_SiteID
      And DS.ParentID=D.ParentID
      And DS.ID=D.ID join
    your_content_database.dbo.Webs W With (NoLock)
      On W.ID=D.WebID
      And W.ID=L.Tp_WebID
      And W.SiteID=A.tp_SiteID
Where
   DS.DeleteTransactionID=0
   And D.DeleteTransactionID=0
   And D.IsCurrentVersion=1
   And A.tp_DeleteTransactionID=0
   And A.tp_IsCurrentVersion=1
   And D.HasStream=1
   And L.tp_DeleteTransactionId=0
   And ExtensionForFile not in ('webpart','dwp','aspx','xsn','master','rules','xoml')
   And D.MetaInfoTimeLastModified>DateAdd(d,-1,GetDate())
Order by DS.Size desc

Referencia donde lo saque:

http://stackoverflow.com/questions/213801/sharepoint-2007-sql-query-to-find-a-list-of-documents-in-site-collection

El formato a generar el archivo csv elegí que fuera el siguiente:

url,list,document,fullurl,created,modified

Entonces la versión original de arriba la modificamos de la siguiente forma:

 

Select
   Top W.FullUrl, L.tp_Title as ListTitle, A.tp_LeafName, A.tp_DirName, D.TimeCreated,D.MetaInfoTimeLastModified
From
   your_content_database.dbo.AllLists L With (NoLock) join
   your_content_database.dbo.AllUserData A With (NoLock)
      On L.tp_ID=tp_ListId join
   your_content_database.dbo.AllDocs D With (NoLock)
      On A.tp_ListID=D.ListID
      And A.tp_SiteID=D.SiteID
      And A.tp_DirName=D.DirName
      And A.tp_LeafName=D.LeafName join
   your_content_database.dbo.AllDocStreams DS With (NoLock)
      On DS.SiteID=A.tp_SiteID
      And DS.ParentID=D.ParentID
      And DS.ID=D.ID join
    your_content_database.dbo.Webs W With (NoLock)
      On W.ID=D.WebID
      And W.ID=L.Tp_WebID
      And W.SiteID=A.tp_SiteID
Where
   DS.DeleteTransactionID=0
   And D.DeleteTransactionID=0
   And D.IsCurrentVersion=1
   And A.tp_DeleteTransactionID=0
   And A.tp_IsCurrentVersion=1
   And D.HasStream=1
   And L.tp_DeleteTransactionId=0
   And ExtensionForFile not in ('webpart','dwp','aspx','xsn','master','rules','xoml')
   And D.MetaInfoTimeLastModified>DateAdd(d,-1,GetDate())
Order by DS.Size desc

El Script de mi autoría para SharePoint 2013 es el siguiente:

$filename = "ModificadoApartirDel20Sep2014_RRHH"
$importedFile = "E:\migracion\Cambios\"+$filename+".csv"
$contents = Import-Csv -LiteralPath $importedFile    
$outfile = "e:\migracion\Cambios\"+$filename+"_log.csv"
$linea = "Estado,url,Creado Origen,Creado Destino,Modificado Origen,Modificado Destino"
add-content $outfile $linea

foreach ($row in $contents) {
    #write-host $row.url $row.list $row.document
    #write-host  $row.document $row.created $row.modified
    # Web URL
    $hostname = https://hostname/
    $urlWeb = $hostname + $row.url
        $web = Get-SPWeb -Identity $urlweb
    # SPList name
    $listname = $row.list
    $list = $web.Lists[$listname]
        $items = $list.Items
    $encontrado = $false
    #foreach($field in $list.fields)
    #{
    #    write-host "Field: " $field.Title
    #}
    $linea = ""   
    foreach($item in $items){
        if($item.Name -eq $row.document)
        {
            if($item["Created"] -gt $row.created -or $item["Modified"] -gt $row.modified){
            $encontrado = $true
            $linea = "Sin Actualizar," +$hostname +$row.fullurl+ "/" +$item.Name+","+$rowcreado+","+$itemcreado+","+$rowmodificado+","+$itemmodificado 
            add-content $outfile $linea   
           
            }else {
            $linea =  "Actualizado," +$hostname +$row.fullurl+ "/"+ $item.Name+","+$rowcreado+","+$itemcreado+","+$rowmodificado+","+$itemmodificado
            add-content $outfile $linea
            }
            break
        }
    }
    if ($encontrado){
        $linea = "No Encontrado,"+$hostname + $row.fullurl+ "/" +$row.document+","+$rowcreado+","+$itemcreado+","+$rowmodificado+","+$itemmodificado
        add-content $outfile $linea
    }
}

 

SharePoint4Fun!,

Juan Manuel Herrera Ocheita

miércoles, 24 de septiembre de 2014

Error al adicionar un servidor a la granja de SharePoint 2013

Cuando adicionamos un servidor a una granja de SharePoint Existente, necesitamos instalar SharePoint en la misma edición, lenguaje y versión que están los servidores de SharePoint.

Con un cliente nos paso que la versión de SharePoint era anterior a la media que nos dieron para instalar y al momento de conectar el nuevo servidor nos indicó que era una versión anterior la existente.  Por lo que decidimos descargar una media con la versión original y allí nos mostró el siguiente error:

image

Al revisar el visor de eventos encontramos un evento de erro con mayor detalle

Log Name:      Application
Source:        Microsoft-SharePoint Products-SharePoint Foundation
Date:          9/18/2014 12:04:39 PM
Event ID:      5617
Task Category: Topología
Level:         Error
Keywords:     
User:          DOMINIO\spadmin
Computer:      SHAREPONT.DOMINIO.COM
Description:
El objeto de SharePoint [SPConfigurationDatabase] está en un estado no admitido. El conjunto de servidores actual no ha podido usarlo.
Event Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="Microsoft-SharePoint Products-SharePoint Foundation" Guid="{6FB7E0CD-52E7-47DD-997A-241563931FC2}" />
    <EventID>5617</EventID>
    <Version>15</Version>
    <Level>2</Level>
    <Task>13</Task>
    <Opcode>0</Opcode>
    <Keywords>0x4000000000000000</Keywords>
    <TimeCreated SystemTime="2014-09-18T18:04:39.751087400Z" />
    <EventRecordID>6414</EventRecordID>
    <Correlation />
    <Execution ProcessID="4056" ThreadID="3664" />
    <Channel>Application</Channel>
    <Computer>SHAREPOINT.DOMINI.COM</Computer>
    <Security UserID="S-1-5-21-57989841-920026266-725345543-28202" />
  </System>
  <EventData>
    <Data Name="string0">El objeto de SharePoint [SPConfigurationDatabase] está en un estado no admitido. El conjunto de servidores actual no ha podido usarlo. </Data>
  </EventData>
</Event>

Este error me dio una luz del problema entonces, para confirmar lo evidente revise la versión del archivo Microsoft.SharePoint.Portal.DLL ubicado en C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI del nuevo servidor para validar la versión y me indico que era una versión RTM 15.0.4420.1017 y al revisar la versión de la granja existente me mostró la versión actual de la granja.

image

La versión 15.0.4481.1005 equivale a la actualización de Marzo 2013, por lo que es anterior al SP1 pero posterior a la versión RTM.  Entonces deberemos descargar la actualización de Marzo 2013 para empatar la granja con el nuevo servidor.

Un buen enlace de las versiones y donde descargarlas a continuación:

http://blogs.msdn.com/b/erica/archive/2013/05/30/sharepoint-server-2013-version-reference.aspx

Descripción de la actualización de Marzo 2013 para SharePoint Server 2013

http://support.microsoft.com/kb/2767999

Descripción de la actualización de Marzo 2013 para SharePoint Foundation 2013

http://support.microsoft.com/kb/2768000/es

En este caso hay dos idiomas instalados; Español e inglés.  Deberemos ser “muy cuidadosos” en solo actualizar lo que se nos pide de otro modo no será exitosa la adición del servidor a la granja de SharePoint.

image

Luego de instalado el Language Pack requerido (Inglés en nuestro caso) ya pasa a la siguiente paso, el cual es ingresar las credenciales de la granja de SharePoint.

image

Si olvido la frase de granja en el servidor donde esta el Central Administration puede ejecutar las siguientes líneas:

Abra el SharePoint 2010 Management Shell y en la ventana de comando ejecute las siguientes líneas:

         $passphrase = ConvertTo-SecureString -asPlainText -Force
         Set-SPPassPhrase -PassPhrase $passphrase -Confirm

Luego le mostrará la siguiente ventana de finalización del asistente para iniciar le proceso de configuración

image

Cuando Termine deberá mostrarle la siguiente ventana:

image

Listo el servidor esta pegado a la granja y ahora podemos utilizar el Central Administration y PowerShell para configurar el servidor o distribuir los servicios.  Dependiendo del servicio que deseemos habilitar así sera las opciones que debemos de elegir algunas a nivel del Central Administration otras configurandolas por medio de Power Shell.

SharePoint4Fun,

Juan Manuel Herrera Ocheita

martes, 23 de septiembre de 2014

Tip del día: Script para colocar las bases de datos de SharePoint read only

Esto es útil cuando se esta migrando para garantizar que el ultimo cambio permitido esta en el respaldo de la base de datos antes de migrarlo.

Esto se hace a nivel de comando T-SQL de SQL Server y lo que hace SharePoint es que deshabilita las opciones en los menús para editar documentos e inclusive para ingresar a los “Settings” de SharePoint.   Aunque se le puede entrar a nivel de URL de la siguiente forma: http://hostname/_layouts/settings.aspx.

ALTER DATABASE [WSS_CONTENT_????] SET READ_WRITE WITH ROLLBACK IMMEDIATE

Donde [WSS_CONTENT_????] es el nombre de la base de datos de contenido a colocar de modo solo lectura.

WITH ROLLBACK IMMEDIATE bota todas las conexiones hacia la base de datos y ejecuta la modificación a la base de datos a modo lectura, que es lo que deseamos que suceda.

Para devolver la base de datos de contenido de SharePoint a su estado normal es el siguiente comando:

ALTER DATABASE [WSS_CONTENT_????] SET READ_WRITE WITH NO_WAIT

Y eso es todo gracias a PINAL DAVE por su contribución en la nube. Ref: http://blog.sqlauthority.com/2011/04/16/sql-server-making-database-to-read-only-changing-database-to-readwrite/

Así que amigos cuando necesitemos asegurarnos que nadie pero nadie puede modificar el contenido de la base de datos en modo de solo lectura.

SharePoint4Fun,

Juan Manuel Herrera Ocheita