in

SharePoint Blogs

The Best Place for SharePoint-related Blogs

Sharepoint desde cero

Mi aprendizaje en Sharepoint
  • Más vale tarde que nunca, Ajax a la palestra

    Aunque la tecnología Ajax ya lleva mucho tiempo activa en el mundo web, yo personalmente no me había pegado mucho con ella para sacarle algo de jugo. Hasta ahora me la habían presentado y poco más, mi relación con ella no había sido mucho más allá que alguna prueba práctica. Tampoco quiere decir que ahora ya esté en la pomada de Ajax, pero he hecho mis primeros pinitos de los que estoy orgulloso. Y es lo que tienes Ajax (y todas las librerías/frameworks creadas alrededor de la misma, véase Asp.net Ajax, Prototype, Scriptacolous), que con mi poco esfuerzo consigues cosas muy aparentes.

    No voy a parar a explicar lo que es AJAX (Asynchronous JavaScript And XML). Como ya he dicho, llego un poco tarde al tema y en el mundo web ya está más que explicado. En cualquier caso, para la teoría siempre podéis echar mano de la Wikipedia.

    Intentaré enseñar algún ejemplo muy sencillo en próximos posts usando el framework ASP.NET AJAX y su maravilloso Control Toolkit, que nos proporciona muchísimos controles preparados para arrastrar y funcionar. También voy a obviar el "Get Started" en Asp.net Ajax y su Control Toolkit más que nada porque en su web ya tenemos 2  vídeos muy aclaratorio en el que se muestra como instalar y agregar los controles a nuestro Visual Studio, además de mostrar 2 sencillos ejemplos:
    Get Started with the ASP.NET AJAX
    Get Started with the ASP.NET AJAX Control Toolkit

    Ah, por cierto, si aún usáis Visual Studio 2005, las descargas del ASP.NET AJAX 1.0 las han puesto un poco más escondidas, así que os dejo el enlace que me ha costado un poco encontrarlo. Los chicos de Microsoft ya empiezan a priorizar a los usuarios de VS 2008.

    En este post introductorio no voy a mostrar ningún ejemplo concreto, simplemente voy a comentar 2 problemillas que me he encontrado al empezar con Ajax por si corréis la misma suerte que yo. Como muchas veces en este mundo, ni vamos a crear algo que no se ha hecho antes ni vamos a ser los primeros que nos enfrentemos a un problema.

    Si veis los vídeos "Get Started" os daréis cuenta que es muy fácil y sencillo crear una web nueva desde cero que soporte ASP.NET Ajax y el Control Toolkit y que nos permita agregar los controles Ajax. Muy sencillo gracias a las plantillas que se nos agregan al VS2005; nos crea un proyecto web con un web.config con todos los objetos registrados y demás parámetros necesitados.

    El 1er problema viene cuando ya tenemos un proyecto web desarrollado que se creo sin usar las plantillas de Ajax y queremos agregarle algún detalle con Asp.net Ajax. Si somos demasiado optimista y a nuestro "antiguo" proyecto agregamos y configuramos cualquier control Asp.net Ajax directamente, veremos que no funciona y que además obtenemos un error de BLOCKED SCRIPT

    "'Sys' no está definido"

    El error se produce porque nos faltan varias instrucciones en el web.config que cuando creamos un proyecto nuevo usando la plantilla correspondiente (Ajax Enabled Web site) el Visual Studio ya nos añade automáticamente.

    Estas instrucciones son las siguientes:

    <?xml version="1.0"?>
    <configuration>
      <configSections>
        <sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
          <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
            <section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/>
            <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
              <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="Everywhere"/>
              <section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/>
              <section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/>
            </sectionGroup>
          </sectionGroup>
        </sectionGroup>
      </configSections>
      <system.web>
        <pages>
          <controls>
            <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
          </controls>
        </pages>
        <compilation debug="true">
          <assemblies>
            <add assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
          </assemblies>
        </compilation>
        <httpHandlers>
          <remove verb="*" path="*.asmx"/>
          <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
          <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
          <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
        </httpHandlers>
        <httpModules>
          <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
        </httpModules>
      </system.web>
      <system.web.extensions>
        <scripting>
          <webServices>
          </webServices>
        </scripting>
      </system.web.extensions>
      <system.webServer>
        <validation validateIntegratedModeConfiguration="false"/>
        <modules>
          <add name="ScriptModule" preCondition="integratedMode" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
        </modules>
        <handlers>
          <remove name="WebServiceHandlerFactory-Integrated"/>
          <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
          <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
          <add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
        </handlers>
      </system.webServer>
    </configuration>

     

    Agregando estas instrucciones veremos que ya no tenemos ningún error Javascript y además obtenemos el comportamiento Ajax deseado.

    El 2º problema me ha surgido recientemente en un proyecto que me venía heredado, algo que intento evitar siempre que puedo pero que no conseguí esta vez. Concretamente era una aplicación web ASP.NET 1.1 y con el code-behind en Visual Basic. Yo tengo bastante más agilidad con C# y por supuesto evito ya a toda costa desarrollar algo para ASP.NET 1.1 y Visual Studio 2003. Así que lo primero en este proyecto fue migrarlo a ASP.NET 2.0 con el asistente de VS 2005. El asistente completó la migración sin problemas. El problema vino a la hora de usar el Control Toolkit.

    Cuando intentaba usar algún objeto del Control Toolkit me daba problemas. Lo que me extrañaba es que el mismo ejemplo de código me funcionaba correctamente en un proyecto nuevo, pero en el proyecto comentado todo lo contrario, a pesar que ya había hecho los cambios pertinentes en el web.config. Así, que tras googlear un poco me encontré con la solución en el blog del gran Scott Guthrie. Si creamos un sitio web con Visual Studio 2003 en el web.config nos agrega la siguiente propiedad:

    <configuration>
        <system.web>
            <xhtmlConformance mode="Legacy" />
        </system.web>
    </configuration> 

    Cuando migamos el proyecto a Visual Studio 2005, esta propiedad se mantiene en el archivo de configuración. Para solucionar los errores con el Control Toolkit, basta con eliminar esta propiedad o darle el valor de "Transitional" o "Strict" a la propiedad xhtmlConformance. Una vez hecho, a seguir jugando con Ajax.

    Como comentaba, ni voy a hacer algo que no se ha hecho antes ni soy el primero a enfrentarme al mismo problema. Jorge Serrano nos indicaba como preparar un sitio web para que acepte el Asp.net Ajax y Scott Guthrie nos solucionaba los problemas con el Control Toolkit si venimos de un proyecto ASP.NET 1.1.

  • Fragmentos de código: Obtener usuarios con permiso sobre un elemento

    Gracias a la propiedad RoleAssignments de un ítem de cualquier lista, por ejemplo un documento en una librería de documentos, podemos obtener que usuarios tienen permisos.

    Esta propiedad nos devolverá una colección de usuarios y/o grupos de usuarios. En el caso de devolvernos un grupo de usuario, recorremos este para obtener los usuarios que pertenezcan al grupo.

    En el código de ejemplo, mandamos un email a todos los usuarios que tienen permiso sobre un elemento:

    SPWeb web = properties.OpenWeb();
    SPListItem item = properties.ListItem;
    SPRoleAssignmentCollection AsignacionesRol = item.RoleAssignments;
    for (int i = 0; i < AsignacionesRol.Count ; i++)
    {
        SPPrincipal principal = AsignacionesRolIdea.Member;
        if (principal.GetType().ToString() == "Microsoft.SharePoint.SPUser")
        {
            SPUser usuario = web.AllUsers[principal.ToString()];
            SPUtility.SendEmail(web, true, true, usuario.Email, "asunto: ", "cuerpo");
        }
        else
            if ( principal.GetType().ToString() == "Microsoft.SharePoint.SPGroup")
            {
                SPGroup grupo = web.Groups[principal.ToString()];
                foreach (SPUser usuario in grupo.Users)
                {
                    SPUtility.SendEmail(web, true, true, usuario.Email, "BLABLABLA: ", "blablabla");
                }
            }
    } 

    En el código de ejemplo faltaría controlar cuando un usuario pertenece a 2 o más grupos para no repetir la acción más de una vez (como mandar el mail de ejemplo repetidas veces).

  • Mi primera certificación: MCTS SharePoint Server 2007, Configuring

    El pasado 14 de diciembre realicé mi primer examen de certificación. Decidí debutar, tras más de un año de experiencia con Sharepoint, con el examen 70-630 Microsoft Office SharePoint Server 2007, Configuring.

    El examen constó de 51 preguntas. Muchas de ellas fueron sobre el servicio de búsquedas de MOSS, pero también hubieron varias sobre BDC, Excel Services, permisos, Forms Services de Infopath, etc.

    Tal y como comenté en mi post de hace unos meses sobre las certificaciones de SharePoint, aprobando este examen he obtenido la certificación: Microsoft Certified Technology Specialist: SharePoint Server 2007, Configuring.

    MCTS_SharePoint_Server

    Posted Dec 21 2007, 01:18 AM by Serval with 6 comment(s)
    Filed under:
  • Webcast: Creación y Configuración de Shared Services en MOSS 2007

    El próximo 21 de diciembre tendremos un webcast sobre la configuración de los Shared Services de MOSS 2007 realizada por el orador Juan Andrés Valenzuela

    Ficha del Webcast

    Idiomas: Español.

    Productos: Otros.

    Audiencia(s): Profesional de TI.

    Duración: 90 Minutos

    Fecha de Inicio: viernes, 21 de diciembre de 2007 02:00 p.m. Buenos Aires

    Información general del Evento:

    Los Proveedores de Servicios Compartidos (SSP) son un conjunto de servicios que pueden ser compartidos en diferentes portales y sitios. Estos servicios son el Catálogo de datos profesionales, los servicios de Excel, las búsquedas, los perfiles de usuarios, las audiencias, y los sitios personales.´

    Página de Registro

  • Desinstalar Windows Internal Database de WSS 3.0

    Cuando se instala WSS 3.0 con las opciones por defecto se nos instalará una instancia de SQL Server Embedded Edition, también conocida como Windows Internal Database, y se usará esta instancia para crear las bases de datos de Windows Sharepoint Services 3.0

    Si llegado el momento desinstalamos WSS 3.0 de nuestro servidor, Windows Internal Database seguirá instalada. Tampoco aparecerá en "Agregar o quitar programas" del "Panel de Control".

    Para desinstalar Windows Internal Database debemos ejecutar el siguiente comando si estamos trabajando en un Windows 2003 Server basado en x86:

    msiexec CALLERID=ocsetup.exe {CEB5780F-1A70-44A9-850F-DE6C4F6AA8FB} /x

    En cambio, si trabajamos con Windows 2003 Server basado en x64:

    msiexec CALLERID=ocsetup.exe {BDD79957-5801-4A2D-B09E-852E7FA64D01} /x

    Una vez confirmemos nuestro deseo de desinstalar en la advertencia y finalice el proceso, debemos reiniciar el servidor. Tras estos pasos, en nuestro equipo aún tendremos los archivos (mdf/ldf) de la base de datos. Estos podremos encontrarlos en la carpeta %windir%\SYSMSI\SSEE y eliminarlos manualmente.

     

  • Esta es mi oficina

  • Curso de Desarrollo con Sharepoint 2007

    A través de la lista de correo de Eventos de Microsoft, he descubierto que se acaba de publicar en DesarrollaConMDSN.com un curso de Desarrollo con Sharepoint 2007 del gran Gustavo Vélez. No he tenido tiempo de verlo con detalle, pero a primera vista parece muy completo y hay que destacar que tiene muchos videos para descargar de ejemplos comentados. Creo que puedo asegurar que no hay ningún recurso parecido en español en la red que aglutine tanta información de desarrollo con Sharepoint. También tenemos que recordar que Gustavo Vélez es el autor del libro Programación con Sharepoint y que podéis adquirir a través de Dotnetmanía. Por supuesto, también os lo recomiendo.

    Volviendo al curso, la descripción del mismo: "SharePoint es no solamente la herramienta de colaboración de Microsoft, sino toda una plataforma de desarrollo, debido a su flexible arquitectura y poderoso Modelo de Objetos. Este curso demuestra las posibilidades de desarrollo de componentes para Windows SharePoint Services (WSS) 2007 y Microsoft Office SharePoint Server (MOSS), tales como WebParts, Tipos de Contenido y Características, así como la forma de interactuar programáticamente con servicios avanzados del sistema, como son sus Flujos de Trabajo y Catalogo de Datos Profesionales."

    El temario del curso es el siguiente:
    1. Introducción
    1.1 Introducción a WSS y MOSS
    1.2 Instalación de MOSS
    1.3 Construcción de un sitio web basico
    2. Desarrollo
    2.1 Integracion con ASP.NET 2.0
    2.2 Modelo de Objetos
    2.3 Paginas Maestras
    2.4 WebParts
    3. Tipos de Contenido y Columnas de Sitio
    3.1 Que son Tipos de Contenido de Sitios
    3.2 Desarrollo de Tipos de Contenido
    3.3 Que son Columnas de Sitio
    4. Caracteristicas
    4.1 Introduccion a Caracteristicas
    4.2 Uso de Caracteristicas
    4.3 Estructura XML
    4.4 Desarrollo de Caracteristicas
    5. Flujos de Trabajo
    5.1 Introduccion a Flujos de Trabajo
    5.2 Uso de Flujos de Trabajo
    5.3 Creacion de Flujos de Trabajo
    5.4 Flujos de Trabajo con SharePoint Designer
    6. Catalogo de Datos Profesionales
    6.1 Introduccion al Catalogo de Datos Profesionales
    6.2 Uso y Creacion del Catalogo de Datos Profesionales
    6.3 Programacion del Catalogo de Datos Profesionales
    7. Servicios de Excel
    7.1 Introduccion al Servicio de Excel
    7.2 Uso del Servicio de Excel
    7.3 Programacion con el Servicio de Excel

    Enlace al curso

    UPDATE:

    Vía un post del blog de Fran Díaz (blog muy interesante con muchos artículos sobre Reporting Services), veo que no sólo se ha liberado el curso de Sharepoint. Habrá que revisarlos (a ver si se empieza a proponer ya los días de 28 horas Sleepy). A continuación tenéis la lista completa:

    Curso Desarrollo Web
    Curso de Introducción a .NET con Visual Basic 2005
    Curso de Introducción a .NET con C#
    Curso de Visual Basic 2005 para desarrolladores VB6
    Curso de SQL Server 2005
    Curso de desarrollo con dispositivos móviles
    Curso de desarrollo con Windows Presentation Foundation
    Curso de desarrollo con Sharepoint 2007

  • 2 webcasts en directo de Flujos de Trabajo y Sharepoint Designer

    Tenemos 2 webcast en los próximos días presentados por Haaron González (MVP Asp.net). El primero de ellos sobre Flujos de Trabajo en Sharepoint 2007 y el segundo centrado en el desarrollo con Sharepoint Designer:

    Creando Flujos de Trabajo en Sitio de SharePoint 2007 - lunes, 06 de agosto de 2007, 21 h. (horario español) 
    En esta sesión conoceremos la visión de Microsoft para construir flujos de trabajo sobre la plataforma SharePoint 2007 y qué herramientas tenemos disponibles para crear flujos de trabajo personalizados que nos permitan extender la funcionalidad para adecuarse a nuestros procesos y abarcar escenarios adicionales que antes era complicado contemplar.

    Soluciones SharePoint sin código con SharePoint Designer - lunes, 13 de agosto de 2007, 21 h. (horario español) 
    Conoce qué es SharePoint Designer y cómo puedes utilizarlo para construir y personalizar aplicaciones SharePoint con un alto nivel de productividad y eficiencia. Qué opciones tenemos disponibles y cómo este nuevo producto nos permite ofrecer poderosos resultados rápidamente.

    Vía blog de Haaron González

  • Un poquito de humor: Vídeo "The Sharepoint 2007 song"

    Vía correo me llega este video que sin duda ha sido montado por un desarrollador en Sharepoint no muy contento. Sólo hay que ver la descripción del vídeo en Youtube: "dedicated to all frustrated sharepoint users and developers: the sharepoint 2007 song! long live this buggy tool!":

    http://www.youtube.com/watch?v=8P9QlojtrWs

    Posted Jul 31 2007, 06:04 PM by Serval with 1 comment(s)
    Filed under:
  • Cosas interesantes 31-07-2007

    Actualizaciones de Vista para mejorar el rendimiento, la estabilidad y la compatibilidad de aplicaciones Microsoft tiene en fase beta y a punto de lanzar dos actualizaciones. Entre otras cosas solucionan un problema que me alegra en gran medida y que más de uno habrá sufrido: Tal y cómo comenta Dani Matey: "los ficheros se copian más lento en Vista que en XP".

    Habilitar auto-completar en controles de Windows Forms Ejemplo sencillo y rápido en el que podemos ver como se puede habilitar el autocompletado en controles de Windows Forms con nuestras sugerencias de texto.

    Desaparece la marca Linksys Lo que hasta ahora es la "marca doméstica" de Cisco, desaparecerá próximamente para unificarse toda en la rediseñada marca Cisco. Esperemos que a pesar de unificarlo en la misma marca, siga teniendo bien diferencia los productos para el hogar más económicos y los productos para la empresa.

    Eco One, un coche hecho de vegetales que corre a más de 200 Km/h Han fabricado un "coche de carreras" a partir de vegetales y el cuál es biodegrable al 95%. Me llama la atención su combustible elaborado con fermento de trigo y remolacha azucarera. Chow time! uhm!

    Virtual Labs sobre SharePoint 2007 en Technet Medinav nos avisa de la publicación de una lista de los Virtual Labs publicados por Microsoft Technet sobre Sharepoint. Aquí podéis ver la lista en la página de Technet y aquí el rss de los Virtual Labs sobre Sharepoint para no perderos nuevos laboratorios.

    Un escritorio a medio camino entre lo virtual y lo real Vía Alt1040 vemos un vídeo gracioso de lo que podría ser un escritorio real "basado" en el escritorio de un ordenador:


    Reality Desktop - video powered by Metacafe

  • Fragmentos de código: Crear sitios a partir de plantillas

    Crear un sitio a partir de una plantilla programáticamente es bastante sencillo:

       1: public static void CrearSitio(string urlWebPadre,string NombrePlantilla,string urlRelativaNuevoSitio, string Titulo, string Descripcion, bool EliminarSiExiste)
       2: {
       3:     SPSite siteTop = new SPSite(urlWebPadre);
       4:     SPWeb siteRoot = siteTop.OpenWeb();
       5:     SPWebCollection myWebs = siteRoot.Webs;
       6:     //Obtenemos colección de plantillas
       7:     SPWebTemplateCollection webTemplateCollection = siteTop.GetCustomWebTemplates(3082);
       8:     //Obtenemos plantilla deseada
       9:     SPWebTemplate webTemplate = webTemplateCollection[NombrePlantilla];
      10:     //Eliminamos si existe
      11:     if (EliminarSiExiste && myWebs[urlRelativaNuevoSitio].Exists)
      12:     {
      13:         myWebs.Delete(urlRelativaNuevoSitio);
      14:     }
      15:     //Creamos sitio:            
      16:     myWebs.Add(urlRelativaNuevoSitio, Titulo, Descripcion, 3082, webTemplate, true, false);
      17: }

    Lo único que debemos fijarnos un poco más será en el "número del idioma" de la plantilla. En el caso del español usaremos el 3082 en el método para obtener la colección de plantillas y en la llamada Webs.Add() (líneas 7 y 16). Si vamos a usar una plantilla en inglés, sustituiremos este número por 1033.

    El nombre de la plantilla lo deberemos pasar sin la extensión .stp

  • Activar / Desactivar "Mi Sitio"

    Mi Sitio es una web personal que proporciona Sharepoint y nos permite almacenar nuestros documentos, contactos, etc., en general, información personal. Es un sitio web para que el resto de compañeros de la empresa puedan encontrar información personal. Por defecto, al realizar una búsqueda de cualquier portal MOSS, al encontrar personas enlazará con la web "Mi Sitio" de la persona encontrada.

    Tras la instalación de MOSS 2007, "Mi Sitio" de los usuarios no se genera automáticamente. En este momento podemos optar por 2 opciones diferentes. La primera es generar por código todos "Mis Sitios". Vía el blog de Gustavo Vélez tenemos la rutina que nos puede ayudar a ello:

    Creación Programática de MiSitio:

      static bool CrearMiSitio(string UrlServidor, string CuentaUsuario)
      {
          bool blnReturn = false;
           try
          {
              using (SPSite miSitio = new SPSite(UrlServidor))
              {
                  ServerContext miContexto = ServerContext.GetContext(miSitio);
                  UserProfileManager miManejadorPerfiles = new UserProfileManager(miContexto);
                  UserProfile miUsuario = miManejadorPerfiles.GetUserProfile(CuentaUsuario);
                  miUsuario.CreatePersonalSite();
              }
              blnReturn = true;    
          }
          catch (Exception ex)
          {
              Debug.WriteLine(ex.ToString());
          }
          return blnReturn;
      }
    

    Una llamada de ejemplo a la rutina podría ser:

    if (CrearMiSitio("http://mosses", "mosses\\usera") == true)
        Console.Write("Creado");
    else
        Console.Write("Imposible de crear");

    La otra opción para la generación de "Mis Sitios" sería que cada usuario se genera su sitio automáticamente al entrar por primera vez en "Mi Sitio". Para ello, debemos permitir la administracion de "Mi Sitio" de forma autónoma por parte de los usuarios. Por defecto, esta opción viene desactivada tras la instalación de MOSS. Para activarlo debemos seguir los siguientes pasos:

    1. En la Administración Central, en Administración de Aplicaciones, dentro del bloque Seguridad de Aplicaciones, hacemos click sobre la opción Administración de sitios sin intervención del Administrador.
       Administración de Aplicaciones
    2.  En la siguiente página, lo primero será seleccionar la aplicación web en la que tenemos alojadas "Mi sitio" de los usuarios dándole a Cambiar Aplicación Web:
      Cambiar Aplicación Web
      Seleccionar Aplicación Web
    3. Una vez seleccionada la aplicación web correcta, marcaremos "Activada" y haremos click sobre Aceptar.
      Activada

    En cualquier caso, os podéis encontrar con la posiblidad de que la empresa no le guste la idea de que sus empleados tengan sus sitios personales y os pidan que desactivéis esta opción. Dada mi experiencia, es lo más habitual. Lo primero sería asegurarnos de que no se puedan generar los sitios de forma automáticamente por parte de los usuarios. Para ello, seguiriamos los pasos anteriores, marcando en el último paso "Desactivada". A continuación deberiamos desactivar "Mi Sitios" lo que además supondrá que desaparezca el link "Mi Sitio" en la cabecera del portal:

    1. Deberemos ir a la página del Proveedor de Servicios Compartidos. Podemos llegar desde la Administración Central, en el menú de la izquieda y haciendo click sobre el nombre del Proveedor de Servicios compartidos, que por defecto es SharedServices1. En esta página, dentro del bloque Perfiles de Usuario y Mi Sitio, pincharemos sobre Permisos de servicios de personalización.
      6
    2. Haremos clic sobre los usuarios a los que queremos desactivar su sitio personal. Para todos los usuarios: NT AUTHORITY/Usuarios autentificados.
      7 
    3. Finalmente, en la página de Modificar permisos, desmarcariamos la opción "Crear un sitio personal". Si además queremos desactivar el menú superior "Mis vínculos" de cada usuario, también desmarcariamos la opción "Utilizar características personales".
      Modificar permisos
  • Fragmentos de código: Usar el servidor SMTP configurado en el Sharepoint

    Si necesitas mandar un correo en una aplicación desarrollada para Sharepoint, puedes definir el servidor smtp que quieras como en cualquier aplicación .net, pero lo más lógico, en este caso, es usar el servidor smtp configurado en la administración central del Sharepoint:

    ///
    /// Returns SharePoint smtp server
    ///
    private string GetSmtpServer()
    {
    SPWebApplicationCollection spWebApplicationCollection = SPWebService.ContentService.WebApplications;
    SPOutboundMailServiceInstance smtpServer = new SPOutboundMailServiceInstance();
    
    if (spWebApplicationCollection != null)
    {
    foreach (SPWebApplication spWebApplication in spWebApplicationCollection) {
    smtpServer = spWebApplication.OutboundMailServiceInstance;
    return smtpServer.Server.Address;
    }
    }
    return string.Empty;
    }

    Vía Covelle Corner: WSS v3 email smtp server

  • Fragmentos de código: Subir un documento con metadatos

    En esta nueva sección iré publicando pequeños fragmentos de código de ejemplo para realizar tareas en Sharepoint.

    En nuestro 1er ejemplo de código vemos como se realizaría la carga de un documento con metadatos.

    //Using required, especially System.IO;
    using System.Collections.Generic;
    using System.Collections;
    using System.Text;
    using Microsoft.SharePoint;
    using System.IO;
    
    namespace DocImport
    {
    public class DocManagement {
    //Some variables
    private string _DestUrlPath = string.Empty;
    private string _DestFolder = string.Empty;
    
    private SPSite _site = null;
    private SPWeb _web = null;
    
    public DocManagment(string DestUrl, string DestFolder) {
    _DestUrlPath = DestUrl;
    _DestFolder = DestFolder;
    _site = new SPSite(_DestUrlPath);
    _web = _site.OpenWeb();
    }
    
    private bool _uploadDocument(string pdfFile, string txtFile) {
    try {
    //This is mandatory for avoiding an error
    _web.AllowUnsafeUpdates = true;
    //Use the list as a folder
    SPFolder folder = _web.GetFolder(_DestFolder);
    SPFileCollection files = folder.Files;
    //Get the file
    FileStream fStream = File.OpenRead(pdfFile);
    HashTable MetaDataTable = new HashTable();
    MetaDataTable.Add("nom de colonne", "valeur");
    
    //Set the destination url for SharePoint
    str