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

No hay comentarios.: