lunes, 27 de febrero de 2012

Asociar flujo de trabajo a una lista de SharePoint con PowerShell

Consideren el siguiente escenario:

Han desarrollado un flujo de trabajo con Visual Studio. El flujo de trabajo será utilizado en múltiples sitios dentro de una estructura de sitios específica. Cada sitio de esta estructura contiene una lista a la cual el flujo debe quedar asociado.  Son más de trescientos sitios. Muy posiblemente la solución ideal hubiera sido crear un tipo de contenido, agregar el tipo de contenido a la lista y generar una plantilla para crear multiples instancias de ese template en cada uno de los sitios, después construir el workflow contra ese tipo de contenido (workflow reutilizable), desafortunadamente este no es el caso.

Una vez que planteamos el problema a resolver, tal vez lo primero que se les ocurra es invitar a algunos amigos para apoyarles a cambio de unas pizzas, pero créanme, esas reuniones siempre terminan en algún bar.

Una buena solución sería escribir un pequeño script de PowerShell con el que esto se pudiera llevar a cabo de manera automática, de tal manera que el flujo que desarrollaron se asocie con cada una de las listas que se desea, sin tener que hacerlo de forma manual.

A continuación les comparto el código de un script que hace exactamente eso. Recorre los sitios de la estructura y busca la lista a la cual se le asociará el flujo de trabajo. Como siempre recordándoles que el código es proporcionado *as is* y que ustedes deben modificarlo para utilizarlo en sus ambientes.

cls
#variables globales
Start-SPAssignment –Global
#Id del template del flujo de trabajo
$workflowTemplateId = new-object -TypeName System.Guid -ArgumentList "b55fa91f-2fdd-47b8-a80b-c58c32c1b2b6";
$site = Get-SPSite -Identity http://sp2010:123/sites/MiSitio

#Elimina cualquier asociación del mismo Workflow que pudiera existir en la lista
function DeleteAllWorkflowAssociations($list)
{    
    $oldAssociations = New-Object "System.Collections.Generic.List``1[System.Guid]"
    #buscamos las asociaciones viejas del flujo de trabajo, si existen
    foreach($workflowAssociationItem in $list.WorkflowAssociations)
    {
       if($workflowAssociationItem.BaseTemplate.Id.Equals($workflowTemplateId))
       {
   $oldAssociations.Add($workflowAssociationItem.Id)
       }
    }
    
    if($oldAssociations.Count -gt 0)
    {
        foreach($oldAssociationId in $oldAssociations)
        {
            Write-Host "Asociacion "  $oldAssociationId  " eliminada."
            $list.WorkflowAssociations.Remove($oldAssociationId)
        }
    }
}

#recorremos todos los sitios para buscar las listas en las que se asociará el workflow
foreach($web in $site.AllWebs)
{
 #En este caso mi sitio esta en español, por lo que las listas de "Tasks" y "Workflow History" se llaman asi "Tareas" e "Historial del flujo de trabajo" respectivamente
    $taskList = $web.Lists["Tareas"] #Lista de tareas que utilizara el workflow
    $historyList=$web.Lists["Historial del flujo de trabajo"] #Workflow History

    foreach($list in $web.Lists)
    {
  #En este caso yo busco las listas que tienen "Docs", esa es la forma de identificar las listas a las que se asociará el workflow, para mi caso en particular
        if($list.Title.Contains("Docs "))
        {
   #primero borramos cualquier posible asociacion anterior
            DeleteAllWorkflowAssociations($list)
            
            $workflowTemplate = $web.WorkflowTemplates[$workflowTemplateId]
            $associationName = "WF " + $list.Title + " - v2" #Este es el nombre que tendrá la instancia del workflow en la lista
            $listAssociation = [Microsoft.SharePoint.Workflow.SPWorkflowAssociation]::CreateListAssociation($workflowTemplate, $associationName, $taskList, $historyList)
            $listAssociation.AllowManual=$true #Le permite al usuario iniciar el flujo
            $listAssociation = $list.WorkflowAssociations.Add($listAssociation)
            Write-Host "Se creo satisfactoriamente la asociacion "  $associationName 
            Write-Host
        }
    }
}

Stop-SPAssignment –Global


Happy scripting!

Etiquetas

SharePoint 2010 (38) Microsoft (32) Desarrollo SharePoint (31) Gerardo Reyes Ortiz (27) SharePoint (20) SharePoint 2013 (18) Errores SharePoint (12) México (10) PowerShell (9) Silverlight (8) Visio Services (7) Features (6) MVP (6) Silverlight 3 (6) WebCast (6) Workflows (6) Configuracion SharePoint 2010 (5) D.F. (5) API REST (4) Configuracion SharePoint 2010; (4) Troubleshooting (4) Visual Studio 2010 (4) Visual studio (4) WSS (4) Web parts (4) Apps (3) Comunidad SharePoint (3) Configuración SharePoint 2013 (3) ODATA (3) SharePoint Server (3) SharePoint; Instalación SharePoint; Troubleshooting; Search Service (3) Silverlight 3.0 (3) Silverlight Toolkit (3) WebParts (3) javascript (3) jquery (3) Eventos SharePoint (2) Office 2010 (2) PeoplePicker (2) REST (2) SQL Server (2) Scripting (2) Search Service Application (2) SharePoint Designer (2) UPA (2) UPS (2) Workflows SharePoint (2) host header (2) Apps Development (1) Big Bang (1) CAS (1) CSOM (1) Codeplex (1) CompartiMOSS (1) Configuracion SharePoint 2010; Errores SharePoint (1) Configuracion SharePoint 2010; SharePoint 2010 (1) Custom Actions (1) Custom Editor Parts (1) Delegate Controls (1) Deployment (1) DisableLoopbackCheck (1) Document Library (1) Entrevista (1) Examenes de Certificación (1) Extract WSP (1) FBA (1) FS4SP (1) Fakes (1) Fast Search Server 2010 For SharePoint (1) Fiddler (1) HTTP.SYS (1) HTTPS (1) JSON (1) Language Pack's (1) Latam (1) MAXDOP (1) MCSM (1) MSExpertos (1) MVC (1) Microsoft México (1) Microsoft; Codeplex; Screencast; (1) My Sites (1) SQL Server 2012 (1) SQL Server Reporting Services (1) Screencast (1) Screencast; (1) Service Applications (1) Service Pack (1) SharePoint 2007 (1) SharePoint 2010 SP 1 (1) SharePoint API (1) SharePoint Conference (1) SharePoint Emulators (1) SharePoint Farm (1) SharePoint Health Analyzer (1) SharePoint Magazine (1) SharePoint Online (1) SharePoint Search (1) SharePoint Test (1) SharePoint; Desarrollo SharePoint (1) Shims (1) Simposio (1) Simposio Latinoamericano (1) SkyDrive Pro (1) Soporte Microsoft (1) Templates (1) Tip (1) VSeWSS (1) Virtual Machine (1) Visual Studio 2012 (1) WCF (1) WSS; IIS 7 (1) Web API (1) Web Content Management (1) Web Services (1) Windows 8 (1) Windows Live ID (1) Xml (1) appcmd (1) iOS (1) jqGrid (1) onload function (1)