Workflow was cancelled by system account / Workflow Failed on Start

Tenía bastante tiempo de no realizar soporte de SharePoint 2010, pero hace unos pocos días se dañaron unos flujos que hice en SharePoint Designer 2010 sin causa aparente.

Cuando traté de publicarlos de nuevo, aunque no les había realizado ningún cambio, recibí el error:

Type System.CodeDom.CodeBinaryOperatorExpression is not marked as authorized in the application configuration file.

 

Después de investigar los síntomas, encontré que era un problema causado por los últimos parches de .NET Security instalados en el servidor.

Por suerte la solución es rápida y sencilla, solo se debe modificar el archivo de configuración web.config y agregar nuevos tipos.

Los detalles de la solución están en https://blogs.msdn.microsoft.com/rodneyviana/2018/09/13/after-installing-net-security-patches-to-address-cve-2018-8421-sharepoint-workflows-stop-working/

Symptom

After applying .NET Security Only patch to resolve CVE-2018-8421 (Remote Code Execution Vulnerability), all SharePoint out of the box Workflows fail to execute.

Error instalando .NET Framework 3.5 en Windows Server

Este es el tipo de artículo que escribo sobre todo para mí.

Al tratar de instalar .NET Framework en un servidor de Windows 2012 o 2016, me topé con un error que indica que no encuentra el instalador.

A continuación el orden de los pasos que realicé para resolverlo.

En mi caso el servidor de Windows estaba conectado a WSUS, por lo que abrí el editor de políticas (gpedit.msc)

Haga clic en Computer Configuration, Administrative Templates, System.

Busque la opción Specify settings for optional component installation and component repair setting.

Verifique que la política esté activada (enabled) y marque la opción para contactar Windows Update directamente, como se muestra en la imagen de abajo.

Abrí una línea de comando en modo administrador y ejecuté el comando gpupdate /force

Después de esto, pude instalar el .NET Framework sin problemas.

Insertar una tarea de SharePoint desde InfoPath usando CAML

Hace poco tuve el requerimiento de crear una minuta en InfoPath que creara tareas en una lista de SharePoint, hubiera esperado que fuera una tarea sencilla, dado lo integrado que están ambas tecnologías, pero no fue así. Por lo tanto les dejo un paso a paso de cómo insertar tareas en una lista de SharePoint usando InfoPath 2010 y nuestro viejo amigo CAML.

Vamos a trabajar en la lista de tareas que se crea en forma predeterminada en un subsitio de equipo:

image

Un paso fundamental para que este ejercicio funcione es identificar el nombre interno de las columnas de la lista, especialmente si usamos un sitio en un idioma diferente al inglés.

En la siguiente imagen pueden ver los nombre de las columnas que se muestran en la pantalla de Configuración de la lista.

image

A continuación haga clic en la columna Asignado a, lo cual los lleva a la página de Cambiar columna. Ahora quiero que naveguen al final del URL que muestra el explorador, y verán la etiqueta Field=AssignedTo, “AssignedTo” es el nombre interno de la columna y es el nombre que debemos usar en la creación de nuestra plantilla de CAML.

image

En la siguiente tabla pueden ver el nombre en español de los campos que vamos a modificar y su correspondiente nombre interno. La lista de tareas tiene más campos, pero este es el subgrupo que seleccioné para este ejemplo.

Nombre en español Nombre interno
Título Title
Descripción Body
Asignado a AssignedTo
Fecha de inicio StartDate
Fecha de vencimiento DueDate
% completado PercentComplete
Estado Status
ID ID

Ahora vamos a crear el código CAML que nos permitirá actualizar la lista.

1. Abran Notepad o su editor de texto favorito.

2. Copien el siguiente fragmento de XML:

<?xml version="1.0" encoding="UTF-8"?>
<Batch OnError="Continue">
    <Method ID="1" Cmd="New">
        <Field Name="Title"></Field>
        <Field Name="Body"></Field>
        <Field Name="AssignedTo"></Field>
        <Field Name="StartDate"></Field>
        <Field Name="DueDate"></Field>
        <Field Name='PercentComplete'></Field>
        <Field Name='Status'></Field>
        <Field Name='ID'></Field>
    </Method>
</Batch>

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, «Courier New», courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

 

3. Guarden el archivo con el nombre PlantillaTareas.xml

Ahora procedemos a trabar el formulario de InfoPath, en este caso cree un formulario en blanco con InfoPath 2010.

Comenzamos agregando como un Data Source la conexión a nuestro XML.

1. En el menú de Data expandimos la opción From Other Sources y seleccionamos From XML File.

image

2. Buscamos el archivo de XML que habíamos creado y presionamos el botón Next.

image

3. Se deja marcada la opción de incluir los datos como archivo de recurso, y presionamos el botón Next.

image

4. Se deja marcada la opción obtener automáticamente los datos y presionamos el botón Finish.

image

Ahora vamos a crear la conexión de datos a la lista de tareas de SharePoint.

1. En el menú de Data seleccionamos From SharePoint List.

image

2. Escribimos la dirección del sitio donde esta la lista de tareas que vamos a consultar y presionamos el botón Next.

image

3. Seleccionamos la lista de Tareas y presionamos el botón Next.

image

4. Seleccionamos los campos que incluimos en nuestro CAML y presionamos el botón Next.

image

image

5. En este caso no voy a guardar una copia de los datos en el formulario así que presionamos el botón Next.

image

6. Se deja marcada la opción obtener automáticamente los datos y presionamos el botón Finish.

image

En la primera sección del formulario vamos a agregar la consulta a las tareas existentes.

1. En la ventana de Campos seleccionen la fuente de datos Tareas.

image

2. Expanda la sección de dataFields y haga clic derecho sobre el campo d:SharePointListItem_RW e inserte una Tabla repetitiva.

image

3. La tabla se insertó con los campos sin títulos, procedemos darle el formato que deseamos, en mi caso, sólo voy a mostrar algunos campos.

image

4. Así se ve el formulario hasta ahora, cambie el campo de vencimiento por un campo de texto y marque todos los campos como Read Only. En el campo Asignado a inserte una sección repetitiva con controles y sólo deje el campo que muestra el Display Name. También agregué una columna a la derecha para poner un botón posteriormente.

image

Ahora regresamos al datasource principal y creamos los siguientes campos de InfoPath, para facilitar el código elegí no usar tildes ni espacios en blanco:

Nombre Tipo
lista string
id string
titulo string
descripcion string
asignadoa People/Group picker
estado string
porcentaje decimal
inicio date
fin date

Nuestro campos se ven asi:

image

Ahora procedemos a agregar esos nuevos campos, excepto el campo lista,  en el formulario y le damos un formato bonito.

image

El campo ID lo marque como read only.

El campo descripción lo hice multi línea.

El campo estado lo hice de tipo DropDown y le escribí las mismas opciones que tiene la lista en SharePoint.

image

Para el formato de los campos de fecha seleccioné usar aaaa-mm-dd, de nuevo para facilitar la escritura del código, de forma que usa el mismo formato de SharePoint, pero si desea que se vea diferente, nada más debe recordar transformarlo antes de actualizar los datos.

image

Como vamos a asignar la persona responsable de la tarea, necesitamos conocer el UserID de ese usuario, es decir, el número que SharePoint le asigna al usuario la primera vez que que lo agregamos a un sitio, este dato no se obtiene del people picker, si no que consultamos el servicio Web UserGroup.asmx.

1. En la cejilla de Data seleccionan From Web Service y después From SOAP Web Service.

image

2. La dirección del servicio Web es la dirección del sitio o subsitio donde esta la lista de tareas más /_vti_bin/UserGroup.asmx y presionamos el botón Next.

image

3. Seleccionan el método GetUserInfo y presionamos el botón Next.

image

4. En la siguiente página, escriba un valor predeterminado para el login, por ejemplo su dominio y usuario, y presionamos el botón Next.

Normalmente el formato del usuario es dominio\usuario, por ejemplo contoso\vkrojas, pero si usa Office 365 debe  usar el formato de cuenta interno, por ejemplo: i:0#.f|membership|vkrojas@contoso.com

image

5. No vamos a guardar una copia de los datos en el formulario así que presionamos el botón Next.

image

6. Se deja marcada la opción obtener automáticamente los datos y presionamos el botón Finish.

image

Ahora para poder actualizar la lista de SharePoint vamos a utilizar el servicio Web UpdateListItems, que también provee SharePoint.

1. En la cejilla de Data, en la sección de Submit Form seleccionan To Other Locations y después To Web Service.

image

2. La dirección del servicio Web es la dirección del sitio o subsitio donde esta la lista de tareas más /_vti_bin/lists.asmx y presionamos el botón Next.

image

3. Seleccionan el método UpdateListItems y presionamos el botón Next.

image

4. En la siguiente página para el parámetro listName seleccionamos el campo lista de nuestro formulario y marcamos la opción de Submit data as a string.

image

5. Para el parámetro updates seleccionamos el Data Source secundario PlantillaTareas, que es el archivo XML que hicimos en Notepad.

image

6. En el campo Include seleccionamos XML subtree, including selected element. Marcamos la opción de Submit data as a string. Presionamos el botón Next para continuar.

image

7. Desmarcamos la opción Set as the default submit connection y presionamos el botón Finish.

image

Ya tenemos el escenario preparado para comenzar a trabajar en el código. Iniciemos agregando un botón para leer las tareas que están publicadas en la lista de SharePoint. Le puse a la etiqueta del botón Refrescar. A ese botón le ponemos una regla que consulte la lista de tareas.

image

Si prueban el formulario ya deben poder leer la lista de tareas de SharePoint cada vez que presionan el botón Refrescar.

image

 

 

 

Más información:

Nintex Form 2010: Botón para cancelar estado de la solicitud

En algunas ocasiones es necesario cancelar una solicitud después de que esta fue enviada y para esto es muy útil tener un botón que cambie el estado de la solicitud diferente a Guardar y Cerrar.

Nintex tiene una funcionalidad muy práctica para esto con el control tipo Botón y les enseñaré a conectar ese botón.

Los campos que debemos configurar son los siguientes:

  • Button action: Save and Submit para que guarde los cambios y cierre el formulario.
  • Button label: el nombre del nuevo botón.
  • Connected to: se conecta al campo que queremos actualizar. En mi caso era un campo tipo elección (choice).
  • Value returned: el valor con el que deseamos actualizar ese campo.
  • Confirmation message: útil si queremos desplegar una ventana de diálogo al usuario.

Y es así de sencillo, tenemos un botón que actualiza un campo en nuestro formulario

Algo fundamental es el orden de los campos, en la imagen de abajo el campo que estoy modificando esta después del botón que lo cambia, por lo que cuando se guarda el formulario el botón cambia el valor pero como el control que muestra el estado esta después del botón también está conectado al mismo campo de SharePoint, este último sobre escribe el valor que puso el botón.

Lo mejor es asegurarse que si estamos mostrando el valor que se desea modificar, este campo este ubicado antes del botón o no este del todo en el formulario.

Resumen de blog con CQWP

En este artículo les enseñaré como crear un resumen de contenido web para un blog de SharePoint.

Este artículo se basa en un sitio de tipo Blog de SharePoint 2013.

 

Parte I. Modificar la lista de Entradas De Blog.

 

Primero agregamos dos nuevas columnas a la lista de Entradas de Blog, para poner el resumen y la imagen que mostraremos.

Haga clic en la lista EntradasDeBlog.

 

En el menú de Lista, busquen Configuración de la lista.

 

En la sección de columnas, haga clic en Agregar desde columnas de sitio existentes.

 

Busque la columna Icono de la página y presione el botón Agregar.

 

Busque la columna Descripción y haga clic en Agregar.

 

La página para crear nuevas entradas para el blog va a tener dos campos nuevos, de Icono y Descripción. Recomiendo hacerlos de tipo requerido, para obligar a los usuarios a llenarlos.

 

Parte II. Mostrar el resumen en una página.

 

En el sitio donde queremos mostrar el resumen, agregamos una nueva página.

 

Inserte el elemento Web Consulta de contenido, que se encuentra en la sección Resumen del contenido.

 

En la sección de Campos para mostrar agregue el nombre de la columna Icono y Descripción.

 

Guarde los cambios del elemento Web y de la página.

Sitios de reuniones en SharePoint – Parte 4 (final)

En un nuevo sitio de SharePoint Online se ocupaba un sitio de reuniones sencillo, como los de SharePoint 2007.

Use la idea de Frank Op ‘t Landt
http://sharepoint-community.net/profiles/blogs/the-alternative-for-meeting-workspaces-in-sharepoint-2013 para desarrollar este sitio.


 

Primero se deben crear las listas que tiene un sitio de reuniones:


 

En esta parte vamos a configurar las páginas que usaremos en el sitio.

Primero vamos a trabajar en la página principal.

Editamos la página y seleccionamos una plantilla con dos columnas.


 

Agregué la lista de Calendario en la columna izquierda, los elementos agenda y biblioteca de documentos e la columna derecha. Pueden cambiar esta configuración como lo deseen.  


Luego vamos a conectar el elemento de Agenda con el Calendario, para que sólo se muestre la agenda del día seleccionado.

En el modo de edición de la página de SharePoint, selecciona la Agenda y hacen clic en Editar Elemento
Web, para habilitar el menú de conexiones.

 

Nuevamente en el modo de edición de la página de SharePoint, selecciona la Agenda y hacen clic en conexiones.


 

Conecte la columna Hora de inicio de la lista Calendario, con la columna Fecha de reunión de la lista Agenda.

 

Y se debe repetir esa conexión para la lista de Documentos.


 

Además vamos a agregar una página para ver las reuniones pasadas, llamada Eventos pasados.



En las páginas quité la barra de herramientas de todos los elementos Web, para que se viera parecido a la vieja plantilla de reuniones de SharePoint.



En la página principal y en la página de reuniones pasadas, agregué un link para navegar entre ambas páginas.


 

 

Para manejo de las minutas personalicé una plantilla de OneNote, esta parte no se integra con las columnas de las listas, pero se ve bonita. Esta parte es opcional.


 

 


 

Aunque la lista de calendario permite crear reuniones recurrentes, los elementos conectados no funcionan con las reuniones recurrentes, para filtrar las vistas que estamos mostrando.

Por esta razón, para lograr la habilidad de crear reuniones recurrentes, vamos a crear un flujo de trabajo de Sitio y en la página principal vamos a agregar un link a esta nueva lista.

 

En SharePoint Designer, abren el nuevo sitio de sesiones y hacen clic en nuevo flujo de sitio.


 

Como nombre, escriba Crear eventos recurrentes.


 

La primera acción es Establecer una variable de flujo de trabajo.


 

El nombre de la variable es Contador y el tipo es Número.


Establezca el valor inicial en cero.

Luego haga clic en las variables de inicio.


Agregue una variable Título de tipo una línea de texto.


 

No agregue un valor predeterminado y presione el botón Finalizar.


 

Agregue una variable Fecha y hora de inicio de tipo Fecha y hora.


Desmarque la opción para permitir valores en blanco y predetermine el valor en la fecha de hoy. Presione el botón Finalizar.


Agregue otra variable Fecha y hora de fin de tipo Fecha y hora. Desmarque la opción para permitir valores en blanco y predetermine el valor en la fecha de hoy. Presione el botón Finalizar.

 

Agregue una variable Cantidad de tipo Número.


 

Predetermine el valor inicial en cero.


Estos son los parámetros que el usuario debe ingresar para iniciar el flujo de trabajo.


Agregue en el flujo un ciclo con condición.

La condición es que la variable Contador sea menor que la variable Cantidad. Vamos a incrementar el contador cada vez que se ingresa en el ciclo.


A continuación agregue una acción que es Crear un elemento de una lista, para crear un evento en el calendario.


El flujo se debe ver similar a este. Dentro de cada iteración se suman 7 días a la fecha, para crearla semanalmente.


Marque la opción de permitir el inicio manual de este flujo y publíquelo.


Cuando se inicia el flujo de trabajo, el usuario encontrará esta ventana:

 

La página final se ve como esta. Debajo del calendario pueden ver la opción para crear sesiones recurrentes.


 

 

Sitios de reuniones en SharePoint – Parte 3

En un nuevo sitio de SharePoint Online se ocupaba un sitio de reuniones sencillo, como los de SharePoint 2007.

Use la idea de Frank Op ‘t Landt
http://sharepoint-community.net/profiles/blogs/the-alternative-for-meeting-workspaces-in-sharepoint-2013 para desarrollar este sitio.

Primero se deben crear las listas que tiene un sitio de reuniones:

 

En esta parte vamos a configurar la Biblioteca de documentos.


Si no existe una biblioteca de documentos, cree una nueva.

Navegue a la configuración avanzada de la biblioteca de documentos y en la sección de Columnas, seleccione la opción Agregar desde columnas de sitio existente.

Busque la columna Fecha de inicio y agréguela. Esto nos va a conectar con la fecha de inicio de la reunión.


 

Renombre esta columna a Fecha de reunión y cámbiela para que no sea requerida.



 

Estas serían las columnas de la biblioteca de documentos:



Sitios de reuniones en SharePoint – Parte 2

En un nuevo sitio de SharePoint Online se ocupaba un sitio de reuniones sencillo, como los de SharePoint 2007.

Use la idea de Frank Op ‘t Landt
http://sharepoint-community.net/profiles/blogs/the-alternative-for-meeting-workspaces-in-sharepoint-2013 para desarrollar este sitio.

Primero se deben crear las listas que tiene un sitio de reuniones:

 


En esta parte vamos a configurar la lista de Agenda.

Cree una nueva lista personalizada llamada Agenda.

Renombre la columna predeterminada Título con el nombre Tema.

Agregue las siguientes columnas:

  • Hora – una línea de texto
  • Comentarios – varias líneas de texto
  • Responsable – Persona o grupo


En la misma lista de agenda, seleccione la opción Agregar desde columnas de sitio existente.

Busque la columna Fecha de inicio y agréguela. Esto nos va a conectar con la fecha de inicio de la reunión.


 

Renombre esta columna a Fecha de reunión y cámbiela para que no sea requerida.

  


 

Las columnas de la lista de Agenda se ven así:


Sitios de reuniones en SharePoint Online – Parte 1

En un nuevo sitio de SharePoint Online se ocupaba un sitio de reuniones sencillo, como los de SharePoint 2007.

Usé la idea de Frank Op ‘t Landt
http://sharepoint-community.net/profiles/blogs/the-alternative-for-meeting-workspaces-in-sharepoint-2013 para desarrollar este sitio.

El resultado final es el siguiente:
meetingsite

Primero se deben crear las listas que tiene un sitio de reuniones:

En esta parte vamos a configurar la lista de Calendario.

 


 

En la lista de Calendario se crea una nueva vista llamada Próximas reuniones. Desmarque las columnas Periodicidad y Área de trabajo.


 

En la misma vista, cree un filtro que muestre los elementos sólo cuando la Hora de inicio es mayor o igual a Hoy.

 

Guarde esa vista.

 

Cree otra vista en el Calendario llamada EventosPasados. Desmarque las columnas Periodicidad y Área de trabajo.


 

Ordene la vista por la Hora de inicio en forma descendente.


 

Cree un filtro donde la Hora de inicio es menor o igual a Hoy.


 

Error: el flujo no pudo actualizar el elemento.

Durante una migración de SharePoint Server 2010 a SharePoint Server 2013 encontré un error muy peculiar y tuve que abrir un caso de soporte con Microsoft para resolverlo.

Resulta que en varias colecciones de sitios, los flujos de aprobación de SharePoint 2010 dejaron de funcionar. Estaba usando la plantilla predeterminada, sin ninguna personalización, y esos mismos flujos en 2010 funcionaban perfectamente. El error dice:

«The workflow could not update the item, possibly because one or more columns for the item require a different type of information.»

Resulta que durante la migración, la plantilla global de flujos de aprobación se «daño», por lo que a solución es crear una copia de la plantilla y volver a publicarla, como lo menciona el artículo: http://support.microsoft.com/kb/2891286/en-us

El primer paso es abrir SharePoint Designer y buscar la plantilla global de flujos de aprobación. Luego se hace doble clic para editarla.

 

Haga clic en Yes en la ventana de advertencia.

 

 
 

 En la página de opciones del flujo, en la cinta, haga clic en el botón Publicar.


 
 

Si aparece una ventana de advertencia diciendo que el componente de Visio no está instalado, no se preocupe, puede ignorar ese error y publicar el flujo. Lo que va a suceder es que no se pueden ver los dibujos que muestran el estado donde está el flujo, pero todo va a funcionar correctamente.


 

Se debe repetir esta publicación en todas las colecciones de sitios que presenten el mismo problema.

Anteriores Entradas antiguas