February 2012 - Artículos
Si habéis guardado algún sitio de Office 365 como plantilla, y desplegáis la solución en otro site o colección de sitios, es posible que os encontréis un error al intentar desactivar la solución.
Seguramente os ocurrirá si habéis estado creando y eliminando sitios basados en esa plantilla.
Para poder desactivar la solución sin que os falle, primero, obviamente, tendremos que asegurarnos de que no hay ningún site existente basado en esa plantilla.
Además, y esto ya no es tan evidente, es que te asegures que no tienes nada relacionado con esa plantilla, en la papelera de reciclaje:

Y lo último, y nada evidente, es que compruebes esto mismo, en la “otra” papelera de reciclaje (sí, es la misma papelera, pero tiene 2 vistas diferentes, y desde el link anterior, sólo vemos una de ellas):

Y dentro de esta, revisa las 2 vistas disponibles:

Que por cierto, las 2 vistas tienen el mismo nombre, pero creo que es por una mala traducción del Inglés, ya que en inglés se llaman:
- End user recicle bin items
- Deleted from end user recicle bin items
Después de eliminar todo lo relacionado con esa plantilla (sitios eliminados que estaban basados en esa plantilla), ya deberías poder desactivar la solución sin problemas.
Nada más, agradecer a mi compañero Juan Moreno, que se dio unos cuantos cabezazos hasta encontrar esa “papelera escondida” 
Saludos!!
Hace un tiempo os hablé de la SharePoint Software Factory. Pues bien, hace unos días que se ha liberado una nueva versión, la 3.2
Os copio la lista de novedades, y os pongo algún pantallazo de mis favoritas 
- Menu "List And Doc": Linq to SharePoint (imports the schema of several lists to LINQ classes)
- Menu "BCS": Simple BCS Model
- Menu "BCS": Import BCS Model from Database
- Menu "BCS": Model BCS Model with classes
- Menu "BCS": Quick Deploy BCS Model (undeploys/deploys BCS model via powershell)
- Menu "Security": Minimal CAS, Medium CAS, recipes for single CAS Policy Items etc.
- Menu "ASP.NET": WCF Webservice
- code snippets added, partly from http://spcodesnippets.codeplex.com Thx to Ayman El-Hattab (http://aymanelhattab.com)
- Added custom FxCopDictionary to allow project specific exclusions for abbreviations, keyword, acronyns etc. Dictionary will be automatically used in Realase build configuration.
Fijaros que maravilla para generar un data context de LINQ to SharePoint:

Tras el asistente, nos genera, por un lado, un fichero XML de configuración del SPMetal, por si queremos repetir la generación, y por otro lado, 2 ficheros con una clase parcial para el contexto.
1: <?xml version="1.0" encoding="utf-8"?>
2: <!--
3: Use this file to re-import the lists for LINQ to SharePoint
4: Imported from URL: http://team.heroes.lab/
5: Call to SPMetal: "C:\Program Files\Common Files\Microsoft Shared\web server extensions\14\BIN\spmetal.exe" /web:"http://team.heroes.lab/" /parameters:"E:\ORIGEN\Alejandria\Lab\SPSF.v32.ApplicationSample\Components\LinqToSharePoint1\LinqToSharePoint1Context.xml" /language:csharp /namespace:SPSF.v32.ApplicationSample.Components /code:"E:\ORIGEN\Alejandria\Lab\SPSF.v32.ApplicationSample\Components\LINQToSharePointDefinitions\LinqToSharePoint1\LinqToSharePoint1Context.designer.cs"
6: -->
7: <!-- Code initially generated with SharePoint Software Factory 2010, Version 3.2 , spsf.codeplex.com -->
8: <Web
9: AccessModifier="Public"
10: Class="LinqToSharePoint1Context" xmlns="http://schemas.microsoft.com/SharePoint/2009/spmetal">
11: <List
12: Name="Announcements">
13: <ContentType
14: Name="Anuncio">
15: <Column
16: Name="ContentType" />
17: <Column
18: Name="Title" />
19: <Column
20: Name="Body" />
21: <Column
22: Name="Expires" />
23: <ExcludeOtherColumns />
24: </ContentType>
25: <ContentType
26: Name="Carpeta">
27: <Column
28: Name="ContentType" />
29: <Column
30: Name="Title" />
31: <Column
32: Name="FileLeafRef" />
33: <Column
34: Name="ItemChildCount" />
35: <Column
36: Name="FolderChildCount" />
37: <ExcludeOtherColumns />
38: </ContentType>
39: </List>
40: <ExcludeOtherLists />
41: <ExcludeOtherContentTypes />
42: </Web>
También podemos añadir servicios de WCF, donde la plantilla ya prepara el package para su despliegue en el servidor de SharePoint:


Otra novedad es que se han añadido numerosos code-snippets. Aquí tenemos las categorías:

Destacar también que dispone de un asistente para migrar a esta última versión, proyectos realizados en la versión anterior.
Un saludo!!
Cuando se realiza una búsqueda en SharePoint, se aplica un filtrado de los resultados, según el usuario que lanza la query. Es decir, si un usuario no tiene permisos sobre una lista concreta, obviamente, los resultados que hagan referencia a esa lista, no le aparecerán al usuario.
Ahora bien, hoy me he encontrado con un caso que no cumplía esta premisa, y que puede ser bastante frecuente durante la fase de desarrollo del proyecto. Resulta que estaba lanzando una búsqueda con un usuario que era Colaborador del site, por lo que tiene permisos para ver y editar todas las listas, y sin embargo, en las búsquedas, no me devolvía ningún resultado. Sin embargo, me iba a una lista cualquiera, y podía ver y editar un item que cumplía con la query de búsqueda.
De hecho, si hacía la misma búsqueda con otro usuario colaborador, sí me salían resultados válidos. ¿¿??
Pues bien, aquí van los motivos:
- No tenía programado ningún crawling, ni completo ni incremental. Al ser un entorno de desarrollo, lo que hago es forzar el crawl según necesito.
- El usuario que no devolvía resultados de la búsqueda, lo había añadido al sitio, después de haber hecho el último crawl.
- Al forzar un nuevo crawling, y probar de nuevo con el usuario que no devolvía nada, ahora, sí me devolvía los resultados de búsqueda esperados.
La conclusión es que el índice de búsquedas que monta SharePoint, copia mucha información del contenido, incluyendo, los permisos de los usuarios.
Para comprobarlo, he repetido el proceso:
- He quitado del site a otro usuario que era colaborador
- He forzado un nuevo crawling
- He vuelto a añadir al usuario como colaborador
- He realizado una búsqueda con dicho usuario, y efectivamente, no he obtenido ningún resultado de búsqueda.
- He forzado un segundo crawling
- Al volver a buscar con el mismo usuario, ya aparecían los resultados de la búsqueda esperados.
Moraleja:
Lleva esto en mente, y programa el crawling incremental y completo, según las necesidades de que dichos resultados estén “actualizados”. Ten en cuenta que a parte de esos permisos, también copia gran parte del contenido, por lo que es muy sencillo que elementos que hayan sido eliminados, o actualizado algún metadato, sigan apareciendo en los resultados de búsquedas con una versión incorrecta.
Saludos!!
Cuando creamos un nuevo sitio de SharePoint, debemos elegir una plantilla de sitio, en la que queremos basar nuestro nuevo sitio. Si lo hacemos desde la interfaz web, lo tenemos muy fácil, y tan sólo tenemos que elegirla, tal y como vemos en la imagen:

Si queremos hacerlo desde power-shell, podemos usar el comando New-SPSite donde con el parámetro Template, le daremos la plantilla a utilizar. Ese parámetro, nos pide un código de plantilla. Podemos ver los códigos instalados, con otro comando de power shell:
Que nos dará un listado como el siguiente (repetido para cada idioma instalado):
1:
2: Name Title LocaleId Custom
3: ---- ----- -------- ------
4: GLOBAL#0 Global template 1033 False
5: STS#0 Team Site 1033 False
6: STS#1 Blank Site 1033 False
7: STS#2 Document Workspace 1033 False
8: MPS#0 Basic Meeting Workspace 1033 False
9: MPS#1 Blank Meeting Workspace 1033 False
10: MPS#2 Decision Meeting Workspace 1033 False
11: MPS#3 Social Meeting Workspace 1033 False
12: MPS#4 Multipage Meeting Workspace 1033 False
13: CENTRALADMIN#0 Central Admin Site 1033 False
14: WIKI#0 Wiki Site 1033 False
15: BLOG#0 Blog 1033 False
16: SGS#0 Group Work Site 1033 False
17: TENANTADMIN#0 Tenant Admin Site 1033 False
18: ACCSRV#0 Access Services Site 1033 False
19: ACCSRV#1 Assets Web Database 1033 False
20: ACCSRV#3 Charitable Contributions Web Database 1033 False
21: ACCSRV#4 Contacts Web Database 1033 False
22: ACCSRV#6 Issues Web Database 1033 False
23: ACCSRV#5 Projects Web Database 1033 False
24: BDR#0 Document Center 1033 False
25: OFFILE#0 (obsolete) Records Center 1033 False
26: OFFILE#1 Records Center 1033 False
27: OSRV#0 Shared Services Administration Site 1033 False
28: PowerPointBroadca... PowerPoint Broadcast Site 1033 False
29: PPSMASite#0 PerformancePoint 1033 False
30: BICenterSite#0 Business Intelligence Center 1033 False
31: SPS#0 SharePoint Portal Server Site 1033 False
32: SPSPERS#0 SharePoint Portal Server Personal Space 1033 False
33: SPSMSITE#0 Personalization Site 1033 False
34: SPSTOC#0 Contents area Template 1033 False
35: SPSTOPIC#0 Topic area template 1033 False
36: SPSNEWS#0 News Site 1033 False
37: CMSPUBLISHING#0 Publishing Site 1033 False
38: BLANKINTERNET#0 Publishing Site 1033 False
39: BLANKINTERNET#1 Press Releases Site 1033 False
40: BLANKINTERNET#2 Publishing Site with Workflow 1033 False
41: SPSNHOME#0 News Site 1033 False
42: SPSSITES#0 Site Directory 1033 False
43: SPSCOMMU#0 Community area template 1033 False
44: SPSREPORTCENTER#0 Report Center 1033 False
45: SPSPORTAL#0 Collaboration Portal 1033 False
46: SRCHCEN#0 Enterprise Search Center 1033 False
47: PROFILES#0 Profiles 1033 False
48: BLANKINTERNETCONT... Publishing Portal 1033 False
49: SPSMSITEHOST#0 My Site Host 1033 False
50: ENTERWIKI#0 Enterprise Wiki 1033 False
51: SRCHCENTERLITE#0 Basic Search Center 1033 False
52: SRCHCENTERLITE#1 Basic Search Center 1033 False
53: SRCHCENTERFAST#0 FAST Search Center 1033 False
54: visprus#0 Visio Process Repository 1033 False
Es el Name de ese listado, el que debemos utilizar para el parámetro Template. Ejm:
1: New-SPSite http://www.contoso.com
2: -OwnerAlias "DOMAIN\jdoe"
3: -HostHeaderWebApplication $w
4: -Name "Contoso"
5: -Template "STS#0"
Pero ¿qué significan esos códigos?
Pues bien, los Site Definition de SharePoint, se componen, entre otras cosas, de 2 ficheros .XML:
- webTemp.xml: Existe uno por cada lenguaje instalado, y contiene las entradas de las plantillas de sitio, que luego se listan en las primeras imágenes del post.
- ONET.xml: Contiene las configuraciones de cada plantilla, como pueden ser las listas, módulos, features a nivel site y web, etc.
Si abrimos el fichero webTemp.xml, que se almacena en \14\Template\Locale\XML\ veremos varias entradas de este tipo:
1: <Template Name="STS" ID="1">
2: <Configuration ID="0" Title="Team Site" Hidden="FALSE" ImageUrl="/_layouts/images/stts.png" Description="A site for teams to quickly organize, author, and share information. It provides a document library, and lists for managing announcements, calendar items, tasks, and discussions." DisplayCategory="Collaboration" > </Configuration>
3: <Configuration ID="1" Title="Blank Site" Hidden="FALSE" ImageUrl="/_layouts/images/stbs.png" Description="A blank site for you to customize based on your requirements." DisplayCategory="Collaboration" AllowGlobalFeatureAssociations="False" > </Configuration>
4: <Configuration ID="2" Title="Document Workspace" Hidden="FALSE" ImageUrl="/_layouts/images/stdw.png" Description="A site for colleagues to work together on a document. It provides a document library for storing the primary document and supporting files, a tasks list for assigning to-do items, and a links list for resources related to the document." DisplayCategory="Collaboration" > </Configuration>
5: </Template>
Pues bien, si volvéis a fijaros en los códigos de las Template, veréis que se forman como:
1: Name + # + ID configuración
¿Y cómo se relaciona con el fichero ONET.xml (que es el que contiene la chicha de la definición del Site)?
Pues bien, lo primero es que dentro del directorio \14\Tempate\SiteTemplates, tendremos una carpeta con el nombre del atributo Name del nodo Template. Es en esa carpeta, dentro de la subcarpeta \XML, donde encontraremos el ONET.xml. Si vemos ese fichero, veremos que hay una parte de Configurations, donde coinciden los IDs de cada nodo Configuration del webTeml.xml
1: <Configurations>
2: <Configuration ID="-1" Name="NewWeb" MasterUrl="_catalogs/masterpage/v4.master" />
3: <Configuration ID="0" Name="Default" MasterUrl="_catalogs/masterpage/v4.master">
4: <Lists>
5: <List FeatureId="00BFEA71-E717-4E80-AA17-D0C71B360101" Type="101" Title="$Resources:core,shareddocuments_Title;" Url="$Resources:core,shareddocuments_Folder;" QuickLaunchUrl="$Resources:core,shareddocuments_Folder;/Forms/AllItems.aspx" />
6: ...
7: </Lists>
8: <Modules>
9: <Module Name="Default" />
10: </Modules>
11: <SiteFeatures>
12: <!-- BasicWebParts Feature -->
13: <Feature ID="00BFEA71-1C5E-4A24-B310-BA51C3EB7A57" />
14: </SiteFeatures>
15: <WebFeatures>
16: <!-- TeamCollab Feature -->
17: </WebFeatures>
18: </Configuration>
19: <Configuration ID="1" Name="Blank" MasterUrl="_catalogs/masterpage/v4.master">
20: ...
Saludos!!
Si queremos añadir una referencia a una hoja de estilos CSS desde la Master Page de nuestro sitio de SharePoint Online, podemos hacerla relativa a la colección de sitios de la siguiente forma:
1: <SharePoint:CssRegistration
2: name="<% $SPUrl:~SiteCollection/Style Library/~language/MyBranding/my.css%>"
3: After="corev4.css"
4: runat="server"/>
Podemos usar los siguientes comodines en la ruta:
- $SPUrl:~SiteCollection : Para partir de la raíz de la colección de sitios
- $SPUrl:~Site : Para partir de la raíz del sitio actual
- ~language : Se sutituirá por el código del idioma (en-us, es-es …)
Para recursos compartidos por toda la colección de sitios, se recomienda usar la Style Library, creando un directorio específico para el idioma, y dentro, otro específico de “mi branding”
Idem para el site, pero utilizando la biblioteca de SiteAssets.
¿Y si dentro de mi CSS necesito referenciar URLs para backgrounds, etc?
Pues en ese caso, asumiremos que el path que debemos poner, es relativo a la ubicación de la CSS. Es decir, si tenemos la CSS en la Style Library, y dentro de esta tenemos una carpeta “images”, pues el estilo lo definiremos como:
1: h1 {
2: background:url('images/bg1.png') no-repeat;
3: }
Saludos!!
En este post vamos a ver cómo podemos eliminar propiedades rastreadas del buscador de SharePoint, lo que os puede ser muy útil si estás trasteando con crear propiedades rastreadas y administradas desde código.
Si estamos haciendo una aplicación de búsquedas, seguramente conoceremos lo que son las propiedades rastreadas (Crawled properties), y las propiedades administradas (Managed properties). Si no es el caso, en futuros posts hablaremos de estas propiedades y su importancia en las búsquedas.
El caso es que borrar una propiedad administrada, es muy sencillo, y se puede hacer desde la propia administración central:

Sin embargo, eliminar una propiedad rastreada, ya no lo es tanto, y no tenemos posibilidad de hacerlo, ni desde la administración central, ni desde el modelo de objetos (no he mirado muy a fondo desde power-shell, pero tampoco he encontrado nada a primera vista).
Ahora bien, tenemos una alternativa para poder eliminar estas propiedades. El precio a pagar, es que podemos eliminar otras propiedades rastreadas que no estén mapeadas a propiedades administradas /yo no le he visto mucha utilidad a una propiedad rastreada, que no está mapeada a ninguna propiedad administrada).
La forma de eliminarlas sería:
Primero, eliminar la propiedad administrada a la que está mapeada la propiedad rastreada. Partimos de que tenemos una propiedad rastreada llamada: ows_content que está mapeada con la propiedad administrada: QuestionContent

Una vez eliminada, editamos la propiedad rastreada, y nos aseguramos de desmarcar “Include values for this property in the search index”

Tras esto, habremos conseguido que la propiedad rastreada, sea “susceptible” de ser eliminada. Para eliminarla totalmente, tendremos que ir a la pantalla de configuración de la categoría a la que pertenece la propiedad rastreada.

Seleccionamos “Edit category” (sobre el desplegable que nos aparecerá al pasar por encima) de la categoría a la que pertenece la propiedad rastreada (podemos ver la categoría en la anterior pantalla de edición de propiedad rastreada):

Marcamos la opción “Delete all unmapped crawled properties”
Pinchamos sobre OK, y listo!!
Recordad que esto eliminará todas las propiedades rastreadas que no estén marcadas como “incluir en índice”, y no tengan ninguna propiedad mapeada. Yo de momento no he encontrado ningún daño colateral de hacerlo así.
Saludos!!
Cuando empiezas a trabajar con Office 365, seguramente te encontrarás con un problema a la hora de intentar abrir un documento Office, que te has descargado desde el Exchange Online, o el sitio de grupo. El error tiene esta pinta:

La solución es muy sencilla, basta con editar las propiedades del fichero descargado, y pinchar sobre “Desbloquear”:

Saludos!
Tal y como nos avanzaba Juan Carlos en este post. Siguen llegando novedades alrededor de Office 15. En este caso se trata del SDK. No, no nos hagamos ilusiones. En realidad es una parte pequeña de ese SDK. Tal y como lo describe Microsoft:
- SharePoint 15 Technical Preview Managed Object Model SDK: This compiled help (.chm) file contains reference topics focusing only on types and members that are called by other Microsoft applications. This reference does not document the full SharePoint 15 managed object model. That documentation will accompany a later release of SharePoint 15.
Lo podéis descargar en este enlace:
http://www.microsoft.com/download/en/details.aspx?id=28768
Le he echado un ojo a los NameSpaces. Os paso pantallazo:

Me ha llamado mucho la atención el namespace:
Microsoft.SharePoint.IdentityModel.OAuth2
Como sabréis, OAuth es un protocolo estándar de autenticación que utilizan sistemas como Facebook, Yammer, Google API, y un largo etcétera.
¿Podremos logarnos en SharePoint con nuestra cuenta de Facebook? …
Saludos!