viernes, 31 de julio de 2009

Tip del día: Lista de prerrequisitos para una Instalación Típica de SharePoint y/o Project Server

Esta recomendación se base en una instalación típica sobre Windows Server 2003 y SQL Server 2005.

Cuales son los prerrequisitos para instalar cualquiera de estos dos productos:

  1. Windows Server 2003 con Service pack 2
  2. IIS Instalado con los servicios mínimos (sin ftp,smtp).
  3. .Net Framework 2.0 y 3.0 (Requerido para los Workflows de SharePoint). Opcional el .net Framework 3.5 que si lo instalas te incluye ambos Frameworks con sus Service Pack 1.0 respectivos.
  4. SQL-Server 2005 con Service Pack 2.0 instalado. Ojo mejor si las bases de datos de SQL-Server esta en el disco que tenga mayor disponibilidad de espacio y no en el del sistema operativo. O cambiar el directorio predeterminado donde crea las base de datos y Logs y reiniciar los servidores. Los servicios mínimos a instalar en SQL-Server 2005 son: Database Engina, Integration Services, Client Tools y Server Agent. Si vamos incluir Reportería incluyamos Reporting Services, si vamos incluir Cubos para el caso de Project Server incluyamos Analisys Services.

Con ello deberíamos poder instalar los Productos de Office Server como SharePoint o Project Server.

Hasta la próxima,

Manolo Herrera

Tip del día: Preparando tu servidor Demo de SQL-Server Analisys Services para probar los elementos Web de SharePoint

Aunque esta información esta publicada en Internet, encontré que una parte esta en un lado y la otra en otro, para no volver a buscar decidí dejar registro donde la encontré para futuras oportunidades.

Donde obtener las bases de datos de demostración?

En el sitio de Codeplex en: http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=MSFTDBProdSamples&ReleaseId=4004

Cómo instalar las bases de datos y conectarlas al Analisys Services de SQL-Server?

http://msdn.microsoft.com/en-us/library/ms143804(SQL.90).aspx

Básicamente luego de instalar los msi, debes de abrir el IDE de Visual Studio para Analisys Services en el Servidor y abrir el proyecto que descarga al instalar los msi files de Codeplex. Típicamente están ubicados en:

<drive>:\Program Files\Microsoft SQL Server\90\Tools\Samples\AdventureWorks Analisys Services Project

Debes de tener un servidor de base de datos SQL-Server 2005 con Analisys Service Instalado, Integration Services, y por supuesto Database Engine.

Hasta la próxima!

Manolo Herrera

Como cambiar el servidor de SQL-Server o la instancia de SQL-Server de una instalación de SharePoint existente

Es una pregunta de interés común que por ello he decidido escribir este artículo.  

Prerrequisitos:

Conocimientos mínimos de administración de SQL-Server.

Conocimientos mínimos de administración de SharePoint y de manejo de archivos.

 

En resumen lo que debemos hacer es:

  1. Abrir una ventana de mantenimiento (Avise a lo usuarios que estará en mantenimiento el servidor de SharePoint durante una hora, dependerá del tamaño de sus bases de datos).
  2. Utilice la opción de Quesce Farm del Central Administración para desconectar a los usuarios que estén conectados y que permita nuevas conexiones.
  3. Ejecute el Asistente de configuración de Productos y Tecnologías de SharePoint.
  4. Seleccione la opción de desconectarse de la granja de servidores actual.
  5. Haga un Detach de las bases de datos de SharePoint del servidor actual de SQL-Server donde estaba conectado.
  6. Haga un Attach de las bases de datos de SharePoint en el nuevo servidor o en la nueva instancia.
  7. Ejecute el Asistente de configuración de Productos y Tecnologías de SharePoint y seleccione la opción, Si deseo conectarme a una granja existente y escriba el nombre del servidor de SQL-Server donde realizó el Attach de las bases de datos de SharePoint en el nuevo Servidor o Instancia de SQL-Server.
  8. Reactive la granja de Servidores si aún permanece en modo de inactividad en el mismo lugar donde la inactivo.

En detalle haga lo siguiente:

1. Conéctese al servidor donde esta instalado SharePoint.

2. Ejecute la Administración Central de SharePoint 3.0.

3. Bajo Operaciones ubique del lado derecho superior la opción Quesce Farm o en español “Poner el conjunto de Servidores de Modo de Inactividad”.

image

Seleccione la cantidad minutos que dará tiempo para que el usuario que aún este conectado lo desconecte. Y presione el botón de iniciar modo de inactividad.

En la práctica este modo de inactividad tanto para los usuarios conectados y para las nuevas conexiones no iniciará bloqueándolas hasta que finalice el tiempo de gracia que usted indico en esta opción.

4. Luego del tiempo de espera haga clic sobre el botón [Refresh] del navegador a la página para asegurarse que ya esta en modo de inactividad.  Como lo muestra la imagen de abajo.

image

5. Paso siguiente cierre el navegador y seleccione en el menú de Windows, All programs, Microsoft Office Server, Asistente de configuración de Productos y Tecnologías de SharePoint.

6. Presione el botón  [Siguiente], luego le dará un aviso indicándole que pueda que necesite reiniciar los servicios de IIS y los Servicios de Administración y Temporización de SharePoint. Presione el botón de Yes o Sí, para continuar.

7. Seleccione la opción de desconectar de este conjunto de Servidores.

image

8. Le da un mensaje de advertencia, para continuar presione el botón de [Yes] o [Si].  Luego iniciará el proceso que consta de 4 pasos.  Tenga paciencia y espere que finalice dicho proceso.

9. Si todo se ejecuto correctamente le mostrará una ventana de configuración realizada correctamente para finalizar presione el botón de [Finalizar].

image

10. Ahora vamos a ejecutar el Management Studio de SQL-Server para realizar la operación.  Si es una instalación típica de SharePoint Server no debería ser muy similar a la imagen de abajo.

image 

11. Apunte las base de datos que necesita hacer la operación de “Detach” y proceda haciéndolo. Clic derecho sobre el nombre de la base de datos, Tasks, Detach, y finalice confirmándolo con el botón Ok. Haga este procedimiento con cada base de datos.

image

12. Finalizado este proceso manual, copie los archivos físicos de las bases de datos a la nueva ubicación.  La ubicación típica de los archivos físicos de la base de datos se encuentra en: “C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data”.  No se preocupe por copiarlas cuando estemos seguros que todo funcionó exitosamente las podremos borrar del origen.   En mi experiencia si solo movemos las base de datos puede sucedernos un caída de error o un error y luego ni en el origen o destino se encuentra la base de datos que se estaba copiando en el momento.  Mejor duplicamos el espacio momentáneamente mientras nos aseguramos que todo quedo bien.

13. Diríjase al nuevo servidor o instancia de SQL-Server y ejecute el SQL-Server Manage Studio.

14. Haga clic derecho sobre la capeta Databases y seleccione la opción Attach.. Presione el botón Add.  Ubique las bases de datos seleccione una, presione el botón Ok.  Y repita el procedimiento hasta que finalice con todas las bases de datos que copio.

image

15. Revise que la cuenta de dominio con que instaló SharePoint se autenticada la cuenta en SQL Server y tenga permiso de “owner” sobre las bases de datos “Atachadas”. En Security haga clic sobre el nombre o agregue la cuenta y revise los permisos de cada base de datos.

image

16.  Regrese al servidor donde esta instalado SharePoint y ejecute el Asistente de configuración de Productos y Tecnologías de SharePoint.  Presione el botón [Siguiente], le aparecerá el aviso sobre los servicio del IIS y SharePoint presione el botón [Yes] para continuar.

17.  Escriba el nombre el nuevo Servidor donde realizó la operación de Attach.. y presione el botón de “Recuperar nombres de base de datos” y en el nombre de usuario debe de colocar la misma cuenta con que instaló originalmente la granja de servidor (Esperando que sea una cuenta de dominio y no de acceso local, de lo contrario no podrá hacer la reconexión con éxito y aunque termine el proceso luego le indicará que la cuenta no se puede autenticar en el servidor de SQL-Server), escriba la clave y presione el botón [Siguiente] para continuar.

image

18. Le mostrará una venta para especificar el puerto y el modo de autenticación, deje los valores predeterminados o a su conveniencia. Y Presione el botón [Siguiente].

image

19. A continuación le mostrará una ventana de resumen de lo definido antes de iniciar el proceso.  Presione el botón [Siguiente] para continuar.

image

20.  Luego iniciará el proceso de 9 pasos, vaya a tomar un café y tenga paciencia y esperemos finalice con éxito.

21.  Si todo se realizó con éxito (y eso le deseo) le mostrará la siguiente imagen:

image

Presione el botón de [Finalizar]. 

22. Revise todas y cada una de las aplicaciones Web de SharePoint y cuando este seguro que todo esta funcionando correctamente, elimine las bases de datos del origen que copio al destino. Y relájese que ha terminado de migrar las bases de datos al nuevo servidor de SQL-Server o instancia. Vaya a la opción de Quesce Farm del Central Administración para desconectar a los usuarios que estén conectados y revise si sigue en modo de inactividad. Haga clic sobre el botón para activar la granja de servidores.

Hasta la próxima,

Manolo Herrera

martes, 28 de julio de 2009

Tip del día: Cuando delegamos la administración de un sitio en SharePoint no debemos olvidar asignar al usuario delegado como propietario del grupo

Una de las recomendaciones de Microsoft sobre la asignación de permisos efectivos en un sitio es evitar asignar un usuario directamente al sitio.  En vez de ello asignar el permiso a un grupo de SharePoint o del Directorio Activo. 

Mi recomendación es siempre hágalo sobre un grupo de SharePoint y luego al grupo de SharePoint si lo desea puede aplicarlo a un grupo del Directorio Activo, ya que se depende menos del departamento de Infraestructura o seguridad para aplicar los permisos en el portal.

Cada vez que creamos un grupo de SharePoint de forma predeterminada asigna al propietario del grupo con la cuenta que se creo el mismo.  Pero esto tiene sus implicaciones cuando estamos delegando la administración de determinado sitio a otras personas, ya que de forma predeterminada esta configurado que solo el propietario del grupo puede asignar usuarios y solo los miembros pueden consultar los miembros del grupo.  Como lo muestra la figura de abajo:

image

Que sucede entonces si definimos un grupo de Administradores con permisos de Control Total sobre el sitio image y agregamos al usuario como miembro de dicho grupo y no lo agregamos como propietario del grupo, si no que dejamos el usuario con el que creamos el grupo y tampoco modificamos las opciones de Quién puede ver la participación del grupo, y tampoco modificamos la opción predeterminada de Quién puede modificar la participación del grupo.  Dicho usuario aunque pertenezca a un grupo que tiene permisos en el sitio de Control total, no podrá agregar mas usuarios al grupo de administradores, y tampoco puede consultar quienes son sus miembros.

Cuál es la recomendación entonces?

Cada vez que cree un grupo dentro de SharePoint asegúrese de agregar al usuario propietario del grupo a la persona que se delegará la responsabilidad de administrar los permisos dentro de ese sitio. Como se muestra abajo:

image ´

Espero esto les sirva para aclarar como funciona el propietario del grupo y el cuidado que debe de tenerse con ello para evitar futuras complicaciones en la administración de los sitios y su delegación efectiva.

Hasta la próxima,

Manolo Herrera

Tip del día: Aplique permisos a los elementos que despliega una página maestra en SharePoint

Esta es una requerimiento común que encontrado en los administradores de portales. Necesitan que no muestra ciertos elementos a usuarios visitantes o de lectura como por ejemplo los Sitios de Mapa, la opción de Ver todo el contenido del sitio, etc. La pregunta es cómo hacerlo?.

La buena notica es que dentro de el modelo de objetos de SharePoint hay una clase que nos permite hacer esto llamada SPSecurityTrimmedControl. Esta clase condiciona el contenido que mostrará en el navegador basado en el permiso mínimo definido y comparado contra los permisos del usuario actual .

La sintaxis de esta clase es la siguiente:

<SharePoint:SPSecurityTrimmedControl PermissionsString="AddAndCustomizePages, ManageLists" runat="server">
<%--content %>
</SharePoint:SPSecurityTrimmedControl>

Los posibles valores de PermissionsString puede encontrarlos en el Windows SharePoint Services 3.0 SDK en SPBasePermissions Enumeration . pero para los que quieren ahorrar tiempo abajo les imprimo toda la tabla.

Donde podemos aplicarla? En cualquier lugar de la página maestra siempre y cuando respetemos las etiquetas que estamos encerrando. Ese es le cuidado que debemos de tener.

Ejemplos donde podemos aplicarlo:

Este segmento de código solo muestra la barra horizontal que aparece hasta arriba en SharePoint que muestra el mapa del sitio solo para los usuarios que tiene el permiso Administrar un Web Site.

<!-- Top Site Map -->
<asp:ContentPlaceHolder ID="PlaceHolderGlobalNavigationSiteMap" runat="server">
<sharepoint:spsecuritytrimmedcontrol runat="server" permissionsstring="ManageWeb">

<asp:SiteMapPath SiteMapProvider="SPSiteMapProvider" id="GlobalNavigationSiteMap" RenderCurrentNodeAsLink="true" SkipLinkText="" NodeStyle-CssClass="ms-sitemapdirectional" runat="server"/>
</sharepoint:spsecuritytrimmedcontrol>
</asp:ContentPlaceHolder>

Otra lugar útil donde podemos aplicar este control es en un sitio publico en el internet de limitado acceso no deseamos que el usuario visitante tenga la barra de búsqueda y el logo del encabezado que se encuentra en la página maestra. Tendríamos que aplicarla de esta forma:

<!-- Encabezado logo y search -->
<sharepoint:spsecuritytrimmedcontrol runat="server" permissionsstring="ManageWeb">
<tr>
<td class="ms-globalTitleArea">
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr>
<td id="GlobalTitleAreaImage" class="ms-titleimagearea">
<sharepoint:sitelogoimage id="onetidHeadbnnr0" logoimageurl="/_layouts/images/titlegraphic.gif"
runat="server" />
</td>
<td class="ms-sitetitle" width="100%">
<asp:ContentPlaceHolder ID="PlaceHolderSiteName" runat="server">
<h1 class="ms-sitetitle">
<sharepoint:splinkbutton runat="server" navigateurl="~site/" id="onetidProjectPropertyTitle">
<SharePoint:ProjectProperty Property="Title" runat="server" />
</sharepoint:splinkbutton>
</h1>
</asp:ContentPlaceHolder>
</td>
<td style="padding-top: 8px;" valign="top">
<asp:ContentPlaceHolder ID="PlaceHolderSearchArea" runat="server">
<sharepoint:delegatecontrol runat="server" controlid="SmallSearchInputBox" />
</asp:ContentPlaceHolder>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td id="onetIdTopNavBarContainer" width="100%" class="ms-bannerContainer">
<asp:ContentPlaceHolder ID="PlaceHolderTopNavBar" runat="server">
<table class="ms-bannerframe" border="0" cellspacing="0" cellpadding="0" width="100%">
<tr>
<td nowrap valign="middle">
</td>
<td class="ms-banner" width="99%" nowrap id="HBN100">
<asp:ContentPlaceHolder ID="PlaceHolderHorizontalNav" runat="server">
<sharepoint:aspmenu id="TopNavigationMenu" runat="server" datasourceid="topSiteMap"
enableviewstate="false" accesskey="<%$Resources:wss,navigation_accesskey%>" orientation="Horizontal"
staticdisplaylevels="2" maximumdynamicdisplaylevels="1" dynamichorizontaloffset="0"
staticpopoutimageurl="/_layouts/images/menudark.gif" staticpopoutimagetextformatstring=""
dynamichoverstyle-backcolor="#CBE3F0" skiplinktext="" staticsubmenuindent="0"
cssclass="ms-topNavContainer">
<StaticMenuStyle/>
<StaticMenuItemStyle CssClass="ms-topnav" ItemSpacing="0px"/>
<StaticSelectedStyle CssClass="ms-topnavselected" />
<StaticHoverStyle CssClass="ms-topNavHover" />
<DynamicMenuStyle BackColor="#F2F3F4" BorderColor="#A7B4CE" BorderWidth="1px"/>
<DynamicMenuItemStyle CssClass="ms-topNavFlyOuts"/>
<DynamicHoverStyle CssClass="ms-topNavFlyOutsHover"/>
<DynamicSelectedStyle CssClass="ms-topNavFlyOutsSelected"/>
</sharepoint:aspmenu>
<sharepoint:delegatecontrol runat="server" controlid="TopNavigationDataSource">
<Template_Controls>
<asp:SiteMapDataSource
ShowStartingNode="False"
SiteMapProvider="SPNavigationProvider"
id="topSiteMap"
runat="server"
StartingNodeUrl="sid:1002"/>
</Template_Controls>
</sharepoint:delegatecontrol>
</asp:ContentPlaceHolder>
</td>
<td class="ms-banner">
&nbsp;&nbsp;
</td>
<td valign="bottom" align="right" style="position: relative; bottom: 0; left: 0;">
<table cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<table height="100%" class="ms-siteaction" cellpadding="0" cellspacing="0">
<tr>
<td class="ms-siteactionsmenu" id="siteactiontd">
<sharepoint:siteactions runat="server" accesskey="<%$Resources:wss,tb_SiteActions_AK%>"
id="SiteActionsMenuMain" prefixhtml="&lt;div&gt;&lt;div&gt;" suffixhtml="&lt;/div&gt;&lt;/div&gt;"
menunotvisiblehtml="&amp;nbsp;">
<CustomTemplate>
<SharePoint:FeatureMenuTemplate runat="server"
FeatureScope="Site"
Location="Microsoft.SharePoint.StandardMenu"
GroupId="SiteActions"
UseShortId="true"
>
<SharePoint:MenuItemTemplate runat="server" id="MenuItem_Create"
Text="<%$Resources:wss,viewlsts_pagetitle_create%>"
Description="<%$Resources:wss,siteactions_createdescription%>"
ImageUrl="/_layouts/images/Actionscreate.gif"
MenuGroupId="100"
Sequence="100"
UseShortId="true"
ClientOnClickNavigateUrl="~site/_layouts/create.aspx"
PermissionsString="ManageLists, ManageSubwebs"
PermissionMode="Any" />
<SharePoint:MenuItemTemplate runat="server" id="MenuItem_EditPage"
Text="<%$Resources:wss,siteactions_editpage%>"
Description="<%$Resources:wss,siteactions_editpagedescription%>"
ImageUrl="/_layouts/images/ActionsEditPage.gif"
MenuGroupId="100"
Sequence="200"
ClientOnClickNavigateUrl="javascript:MSOLayout_ChangeLayoutMode(false);"
/>
<SharePoint:MenuItemTemplate runat="server"
id="MenuItem_Settings"
Text="<%$Resources:wss,settings_pagetitle%>"
Description="<%$Resources:wss,siteactions_sitesettingsdescription%>"
ImageUrl="/_layouts/images/ActionsSettings.gif"
MenuGroupId="100"
Sequence="300"
UseShortId="true"
ClientOnClickNavigateUrl="~site/_layouts/settings.aspx"
PermissionsString="EnumeratePermissions,ManageWeb,ManageSubwebs,AddAndCustomizePages,ApplyThemeAndBorder,ManageAlerts,ManageLists,ViewUsageData"
PermissionMode="Any" />
</SharePoint:FeatureMenuTemplate>
</CustomTemplate>
</sharepoint:siteactions>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</asp:ContentPlaceHolder>
</td>
</tr>
</sharepoint:spsecuritytrimmedcontrol>
<!-- Fin de Encabezado logo y search –>

Otro caso en el Mapa del sitio de la posición actual nos da la posibilidad de navegar hacia atrás de los sitios, algo no deseable cuando deseamos restringir la navegación al usuario con permisos bajos de autorización.

<!-- SiteMap de en medio de la página-->
<sharepoint:spsecuritytrimmedcontrol runat="server" permissionsstring="ManageWeb">
<tr>
<td valign="top" class="ms-titlearea">
<asp:ContentPlaceHolder ID="PlaceHolderTitleBreadcrumb" runat="server">
<asp:SiteMapPath SiteMapProvider="SPContentMapProvider" ID="ContentMap" SkipLinkText=""
NodeStyle-CssClass="ms-sitemapdirectional" runat="server" />
&nbsp;
</asp:ContentPlaceHolder>
</td>
</tr>
</sharepoint:spsecuritytrimmedcontrol>
<!-- End SiteMap de en medio de la página—>

Y finalmente lo que la mayoría de administradores de sitios les parece que no debería estar permitido que usuarios tengan acceso a la opción de Ver todo el contenido del sitio. Aquí abajo los dejo con el segmento de código:

<!-- View All Site Content -->
<sharepoint:spsecuritytrimmedcontrol runat="server" permissionsstring="ManageWeb">
<div class="ms-quicklaunchheader">

<SharePoint:SPLinkButton id="idNavLinkViewAll" runat="server" NavigateUrl="~site/_layouts/viewlsts.aspx" Text="<%$Resources:wss,quiklnch_allcontent%>" AccessKey="<%$Resources:wss,quiklnch_allcontent_AK%>"/>

</div>
</sharepoint:spsecuritytrimmedcontrol>

En estos ejemplos son de casos reales y puede aplicarse diferentes niveles de permisos o combinados. Todo lo que agregues en permissionsstrings el usuario debe de cumplirlo.

Los dejo con la tabla de permisos, hasta la próxima,

Manolo Herrera

SPBasePermissions Enumeration Table

Member name

Description
AddAndCustomizePagesAdd, change, or delete HTML pages or Web Part Pages, and edit the Web site using a Windows SharePoint Services–compatible editor.
AddDelPrivateWebPartsAdd or remove personal Web Parts on a Web Part Page.
AddListItemsAdd items to lists, add documents to document libraries, and add Web discussion comments.
ApplyStyleSheetsApply a style sheet (.css file) to the Web site.
ApplyThemeAndBorderApply a theme or borders to the entire Web site.
ApproveItemsApprove a minor version of a list item or document.
BrowseDirectoriesEnumerate files and folders in a Web site using Microsoft Office SharePoint Designer 2007 and WebDAV interfaces.
BrowseUserInfoView information about users of the Web site.
CancelCheckoutDiscard or check in a document which is checked out to another user.
CreateAlertsCreate e-mail alerts.
CreateGroupsCreate a group of users that can be used anywhere within the site collection.
CreateSSCSiteCreate a Web site using Self-Service Site Creation.
DeleteListItemsDelete items from a list, documents from a document library, and Web discussion comments in documents.
DeleteVersionsDelete past versions of a list item or document.
EditListItemsEdit items in lists, edit documents in document libraries, edit Web discussion comments in documents, and customize Web Part Pages in document libraries.
EditMyUserInfoAllows a user to change his or her user information, such as adding a picture.
EmptyMaskHas no permissions on the Web site. Not available through the user interface.
EnumeratePermissionsEnumerate permissions on the Web site, list, folder, document, or list item.
FullMaskHas all permissions on the Web site. Not available through the user interface.
ManageAlertsManage alerts for all users of the Web site.
ManageListsCreate and delete lists, add or remove columns in a list, and add or remove public views of a list.
ManagePermissionsCreate and change permission levels on the Web site and assign permissions to users and groups.
ManagePersonalViewsCreate, change, and delete personal views of lists.
ManageSubwebsCreate subsites such as team sites, Meeting Workspace sites, and Document Workspace sites.
ManageWebGrant the ability to perform all administration tasks for the Web site as well as manage content. Activate, deactivate, or edit properties of Web site scoped Features through the object model or through the user interface (UI). When granted on the root Web site of a site collection, activate, deactivate, or edit properties of site collection scoped Features through the object model. To browse to the Site Collection Features page and activate or deactivate site collection scoped Features through the UI, you must be a site collection administrator.
OpenAllow users to open a Web site, list, or folder to access items inside that container.
OpenItemsView the source of documents with server-side file handlers.
UpdatePersonalWebPartsUpdate Web Parts to display personalized information.
UseClientIntegrationUse features that launch client applications; otherwise, users must work on documents locally and upload changes.
UseRemoteAPIsUse SOAP, WebDAV, or Microsoft Office SharePoint Designer 2007 interfaces to access the Web site.
ViewFormPagesView forms, views, and application pages, and enumerate lists.
ViewListItemsView items in lists, documents in document libraries, and view Web discussion comments.
ViewPagesView pages in a Web site.
ViewUsageDataView reports on Web site usage.
ViewVersionsView past versions of a list item or document.

jueves, 23 de julio de 2009

Tip del día: Agrega al administrador del Sitio como tu primer contacto en SharePoint

En un ambiente de colaboración como lo es un portal de SharePoint, uno de los hitos importantes es la administración del contenido del portal y una forma de acercarnos a las necesidades de los usuarios del portal es proveyendo el contacto del administrador del sitio. Que en un portal típico no es una sola persona sino que dependiendo de la forma que se organizó tendrán un administrador por departamento por área funcional por estrategia corporativa, y esto representa dentro de la taxonomía de SharePoint un sitio que tendrá sus propios elementos, librerías, listas ,etc.  A las cuales el administrador utilizará para proveer información de interés a la comunidad de usuarios a la que sirve.

Para este ejemplo incorporaremos una función de java script dentro de los archivos js que contiene SharePoint para mostrar la presencia del usuario al sitio.  La función es IMNRC(“correo electrónico”) que al parecer invoca un control Activex llamado name.DLL (algo que no pude corroborar, pero le paso la info) en la máquina del cliente(Esta es la ruta donde encontré dicho archivo c:\Program Files\Microsoft Office\Office12\NAME.DLL), este viene a partir de Office 2003.  Para los curiosos esta función esta dentro de el archivo ows.js que esta ubicada en el directorio 12 hive SharePoint /_layouts/1033 o /_layouts/3082 dependiendo de la versión del lenguaje con que instaló SharePoint.

Para este ejemplo puedes utilizar un elemento Web de SharePoint llamado Editor de Contenido Web o Content Editor Web Part.

Ahora veamos un ejemplo y luego lo comentamos:

   1:  <span>


   2:      <a href=”mailto:micorreo@demo.com” id="owneremail"      


   3:           title=micorreo@demo.com>Manolo Herrera    


   4:     </a>


   5:      &nbsp;


   6:      <img border="0" width="12" height="12"        


   7:         src="/_layouts/images/imnhdr.gif" alt=""        


   8:         onload="IMNRC('micorreo@demo.com')"        


   9:         name="imnmark"        


  10:         ShowOfflinePawn="1"        


  11:         id="5f30ebad_1592_4118_a3c7_e1b6a6990640,type=sip" />


  12:  </span> 




La función IMNRC debe de estar entre una etiqueta <span/> y para este ejemplo agregamos un vínculo para invocar el correo en la máquina del cliente para que lo envié al administrador y una etiqueta <img/> de html para desplegar la imagen de offline del usuario entre tanto de activa al conectarse que funciona en conjunto con la opción ShowOffLinePawn que es opcional. 



Algo importante es el id= este debe de ser único y no puede repetirse.  Puedes utilizar el generador de GUID de Visual Studio GUIDGen.exe o el que viene en el SDK del cualquier versión del .Net Framework.



Podríamos reemplazar la etiqueta <a href=”mailto:” ></a> por el link del sitio personal del usuario. Como por ejemplo: <a href=”http://myserver:2020/Personal/dominio_manolo_herrera”>Manolo Herrera </a>



Otra funcionalidad oculta de esta función es el comportamiento de arrastrar el ratón enfrente de la imagen nos mostrará un menú de contexto para enviar correo, y otras opciones mas que puedes descubrirlas al utilizarlo.



Referencias:



http://www.codeplex.com/features (Nombre del usuario basado en un lista)



http://graegert.com/?p=748 (Solución un elemento web personalizado que incorporar esta funcionalidad basado en el profile del usuario.)



En resumen:



No olvide la etiqueta <span>, el <id> y la cuenta del correo del usuario para que pueda identificar al usuario.  Y lo mas importante incorpore funcionalidades que aumente la colaboración y productividad de sus usuarios.



Hasta la próxima,



Manolo Herrera

martes, 21 de julio de 2009

Tip del día: Modo de edición en un elemento Web Personalizado de SharePoint

Muy conocidos por todos, utilizado por pocos.  Programáticamente podemos controlar como se comporta un elemento Web Personalizado.

En donde mas te parezca puedes validar en que modo esta tu elemento Web pero un lugar efectivo de utilizar es en el evento CreateChildControls()

   1:  if (WebPartManager.DisplayMode == WebPartManager.BrowseDisplayMode) {


   2:   


   3:  //tu codigo..


   4:   


   5:  }




Arriba en el ejemplo valido que haga todo lo que debe de hacer si ya no esta en modo de Edición, bueno en ningún modo mas que en el BrowseDisplayMode. 



Según el SDK de WSS los posibles valores son:



BrowseDisplayMode 
CatalogDisplayMode


ConnectDisplayMode


DesignDisplayMode


EditDisplayMode



Por sus nombres puedes asumir su funcionamiento o sino puede encontrar la información en: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.webparts.webpartmanager_fields.aspx



Hasta la próxima,



Manolo Herrera

jueves, 2 de julio de 2009

Bitácora de Recuperación de un Servidor de SharePoint Server 2007 por error en los servicios de Búsqueda

Nivel: Avanzado.  Ya haya realizado recuperaciones de Servidor SharePoint 2007.

Antecedentes:

Todo empezó con el siguiente error de los servicios de búsqueda de SharePoint en el servidor.  El error era el siguiente:

Event Type:    Error
Event Source:    Office SharePoint Server
Event Category:    Servicios compartidos de Office Server
Event ID:    6482
Date:        6/26/2009
Time:        3:44:41 PM
User:        N/A
Computer:    SERVER NAME
Description:
No se pudo ejecutar el trabajo de administración del servidor de aplicaciones para la instancia de servicio Microsoft.Office.Server.Search.Administration.SearchServiceInstance (88adad9f-110e-4b6b-b166-a4ca60c522b5).

Motivo: La cadena de conexión de base de datos no está disponible. 

Detalles de soporte técnico:
System.Runtime.InteropServices.COMException (0xC0041228): La cadena de conexión de base de datos no está disponible. 
   at Microsoft.Office.Server.Search.Administration.SearchApi.RunOnServer[T](CodeToRun`1 remoteCode, CodeToRun`1 localCode, Boolean useCurrentSecurityContext, Int32 versionIn)
   at Microsoft.Office.Server.Search.Administration.SearchApi.AddApp(Role role)
   at Microsoft.Office.Server.Search.Administration.SearchServiceInstance.InstallGathererApplicationIf()
   at Microsoft.Office.Server.Search.Administration.SearchServiceInstance.Synchronize()
   at Microsoft.Office.Server.Administration.ApplicationServerJob.ProvisionLocalSharedServiceInstances(Boolean isAdministrationServiceJob)

For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.

A pesar de instalar el HotFix 946517 que les reportó a mis amigos lectores no corrigió el problema.

Luego revisando mas a detalle el visor de evento encontré el siguiente error:

Event Type:    Error
Event Source:    MSSQLSERVER
Event Category:    (2)
Event ID:    17310
Date:        6/26/2009
Time:        3:51:59 PM
User:        N/A
Computer:    SERVER NAME
Description:
A user request from the session with SPID 63 generated a fatal exception. SQL Server is terminating this session. Contact Product Support Services with the dump produced in the log directory.

For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.
Data:
0000: 9e 43 00 00 14 00 00 00   ?C......
0008: 0c 00 00 00 56 00 53 00   ....
0010: 52 00 2d 00 4e 00 50 00  
0018: 4f 00 52 00 54 00 41 00  
0020: 4c 00 00 00 00 00 00 00   .......

Este error reportan los foros que se corrige con el Service Pack 2.0 de SQL Server 2005 el problema es que en mi caso ya lo tenía instalado.  Y por si fuera poco este error crea unos Dump Files de 2Mb cada uno que en poco tiempo nos que damos sin espacio en disco en el servidor.  La única forma de aplacar este consumidor de espacio fue apagando los servicios de Search SharePoint Services desde la consola de Services.

A pesar que intente de todo e inclusive crear un nuevo Proveedor de Servicios Compartidos de SharePoint no dio resultado.

Cuando intentaba configurar la búsqueda de SharePoint me mostraba el siguiente error:

image

No habiendo otra opción decidí realizar la recuperación de la instalación de SharePoint.  Pero antes de empezar debemos de hacer una lista que verificaremos para tener todo listo.  A continuación la lista:

Que necesitamos tener para la instalación de un producto como SharePoint Server 2007.

Si asumimos que lo que no vamos a reinstalar es el servidor de Windows que por el momento la mayoría de instalaciones de mis clientes es Windows Server 2003 (STD,ENT,R2).

El software que necesitamos tener a la mano es:

Copia del directorio I386 (Por si requerimos re-instalar el IIS) de Windows Server 2003.

.Net Framework Redistributable V 2.0 y 3.0 Requerido por SharePoint y 3.5 Si utiliza soluciones personalizados que utilicen dicho Framework.

La media de SQL Server 2005 y su SP2.

La media de SharePoint Server 2007 y su SP1.

La data que necesitamos respaldar es:

  • Dado que no recuperaremos las bases de datos del Search, ni Mi Sitio o My Sites.  Solo realizaremos el respaldo de la base de datos de Contenido .
  • Copia de hojas de estilo, imágenes, animaciones en Flash guardadas en el directorio 12 hive SharePoint.
  • El Web.Config del portal normalmente tiene configuración personalizada que será bueno tener una copia.  Aunque no recomiendo el remplazo total del archivo, identifique lo que esta personalizado y vaya cambiando y revisando que no afecte su configuración.

 

El Procedimiento fue:

  1. Se desinstalo la granja de servidores con el asistente, se desinstalo el Software de SharePoint.
  2. Se desinstalo SQL-Server 2005.
  3. Desinstalación de Framework y Service Pack 2.0, 3.0 y 3.5
  4. Se Reinstaló el Framework 2.0 y 3.0.  Al instalar el 3.5 instaló el Service pack 1 de los Framework anteriores y requirió el reinicio del servidor (para que lo tome en cuenta).
  5. Se Instaló de nuevo incluyendo los servicios de Integración de SQL Server 2005 además del Motor de SQL y las herramientas Cliente. Ya que algunas opciones de SharePoint Server los requiere.
  6. Instalación y verificación del SP2 de SQL server 2005 se instaló exitosamente.
  7. Instalación del bits del SharePoint (Si tuvo algún error favor de revisar el siguiente artículo).
  8. Se instaló una nueva granja de Servidores.
  9. Se configuraron los servicios (monitoreando los eventos en el visor y no reportó ningún error).
  10. Se configuro el correo saliente (el ip del servidor de correo de salida, funcionalidad básica en SharePoint para enviar correos).
  11. Se creo la aplicación web puerto 80, para reservar dicho puerto para iniciar restaurando el contenido del portal.
  12. Se desconecto la base de datos de contenido.
  13. Se reinicio el IIS (Con línea de comando: IISreset )
  14. Se restauro la copia de la base de datos de contenido.
  15. Se conecto de nuevo a la aplicación del puerto 80 por medio de la línea de comando en el directorio 12 hive SharePoint. La línea de comando fue: ststadm.exe -o addcontentdb -url http://servername -databasename wss_content.
  16. Se modificó la línea que afecta los permisos de ejecución de los elementos Web a Full  de la siguiente forma: <trust level="Full" originUrl="" />
  17. Se agregaron las líneas personalizadas en el Web.Config en la sección <appSettings/>
  18. Se copiaron los assemblies en el directorio bin de la aplicación Web puerto 80. Generalmente esta ubicada en c:\inetpub\wwwroot\virtual directories\wss\80\bin.   
  19. Se realizó el deployment de la solución (fuera del alcance de este articulo).
  20. Puede verificar y encontrar que todo esta en donde debe en el portal.
  21. Se creo el Proveedor de Servicios Compartidos de SharePoint, colocando el mismo puerto para los sitios personales o My Sites. Advertencia no intente realizar el procedimiento para recuperara la base de contenido del portal para My Sites, no funciona, ya que los servicios compartidos en la aplicación de administración hacen referencia a la aplicación de My Sites y algunas cosas las configuran desde la administración de SSP a diferencia de la creencia que todo esta en My Sites.  Se ahorrará un error de la licencia de SharePoint a caducado y solo desconectando la granja actual y creándola de nuevo logrará eliminar dicho error. Así que no lo haga.
  22. Se agregaron los atributos personalizados para los perfiles utilizados en el portal.  Si hizo una importación completa de los perfiles del Directorio Activo y se programó para que se hiciera regularmente.
  23. Se hizo una carga del contenido de búsqueda y todo funcionó correctamente.

Eso es todo amigos, se que no inquirí en muchos detalles pero puede ver otros artículos que he escrito que si los tiene.  El propósito de este artículo fue dar un panorama general de una recuperación y dejar la experiencia registrará para guiar y prepararse para una recuperación de un portal  por errores del motor de búsqueda de SharePoint Services.

Espero les sirva,

Manolo Herrera

Error Event ID 11706 al intentar instalar SharePoint Server 2007 luego de haberlo desinstalado

No se equivoque como yo este error no le esta dando porque la media de instalación esta mala, ni porque faltan dichos archivos.  Es un error del producto que he encontrado luego de haber hecho una desinstalación del mismo. 

Como solucionarlo:

Encuentre los archivos con extensión “msi” que indica los errores, y ejecútelos, esto hará que los instale y que generé el siguiente error, y eso lo guiará al próximo nombre de archivo. Máximo tuve que instalar 3 archivos y luego la instalación de SharePoint Server 2007 pudo continuar. 

Donde encontrarlos basado en el nombre es fácil encontrarlos, pero aquí una guía:

\x86\WSS.es-es –> wssmui.msi

\x86\OSRCHAPP –> osrchapp.msi

 

Eso es todo amigos, los dejo con el detalle de los errores abajo:

Event Type:    Error
Event Source:    MsiInstaller
Event Category:    None
Event ID:    11706
Date:        7/2/2009
Time:        10:31:10 AM
User:        user name
Computer:    SERVER NAME
Description:
Product: Microsoft Search -- Error 1706. An installation package for the product Microsoft Search cannot be found. Try the installation again using a valid copy of the installation package 'osrchapp.msi'.

For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.
Data:
0000: 7b 39 30 31 32 30 30 30   {9012000
0008: 30 2d 31 30 46 43 2d 30   0-10FC-0
0010: 30 30 30 2d 30 30 30 30   000-0000
0018: 2d 30 30 30 30 30 30 30   -0000000
0020: 46 46 31 43 45 7d         FF1CE} 

Event Type:    Error
Event Source:    MsiInstaller
Event Category:    None
Event ID:    11706
Date:        7/2/2009
Time:        10:00:52 AM
User:        user name
Computer:    server names
Description:
Producto: Microsoft Windows SharePoint Services 3.0 3082 Lang Pack -- Error 1706. No se encuentra ningún paquete de instalación para el producto Microsoft Windows SharePoint Services 3.0 3082 Lang Pack. Vuelva a intentar la instalación utilizando una copia válida del paquete de instalación 'wssmui.msi'.

For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.
Data:
0000: 7b 39 30 31 32 30 30 30   {9012000
0008: 30 2d 31 30 31 35 2d 30   0-1015-0
0010: 43 30 41 2d 30 30 30 30   C0A-0000
0018: 2d 30 30 30 30 30 30 30   -0000000
0020: 46 46 31 43 45 7d         FF1CE} 

Hasta la próxima,

Manolo Herrera

Error event ID 18456 luego de desconectarse de una granja de servidores en SharePoint

No es un error que según la documentación se debe a falta de permisos en SQL Server en la cuenta nt_authority\system. Revise la cuenta en SQL-Server con SQL Management Studio, en propiedades de la cuenta mapee a la base de datos que indica el error. que en este caso es la “Master” y dele los permisos requeridos.

Es necesario reiniciar los servicios de SQL-Server para que corrija el error.

El detalle del error es el siguiente:

Event Type: Failure Audit
Event Source: MSSQLSERVER
Event Category: (4)
Event ID: 18456
Date: 7/1/2009
Time: 10:07:00 AM
User: NT AUTHORITY\SYSTEM
Computer: SERVER NAME
Description:
Login failed for user 'NT AUTHORITY\SYSTEM'. [CLIENT: <local machine>]

For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.
Data:
0000: 18 48 00 00 0e 00 00 00 .H......
0008: 0c 00 00 00 56 00 53 00 ....
0010: 52 00 2d 00 4e 00 50 00
0018: 4f 00 52 00 54 00 41 00
0020: 4c 00 00 00 07 00 00 00 .......
0028: 6d 00 61 00 73 00 74 00 m.a.s.t.
0030: 65 00 72 00 00 00 e.r...

Solución Extrema pero efectiva: Al no corregirse decidí desinstalar SharePoint, y SQL server 2005 e instalar de nuevo. Esto si hizo desaparecer el error.

Hasta la próxima,

Manolo Herrera

miércoles, 1 de julio de 2009

Peculiaridades de los permisos en SharePoint

Tipo de Audencia: Por lo menos el amigo lector haya tenido la experiencia de asignar los permisos predefinidos de SharePoint.

Pareciera que la “herencia” nos hace una mala jugada muchas veces en la Programación Orientada a Objetos según los patrones de diseño, y para la seguridad de SharePoint no es la excepción.  Aunque la motivación de SharePoint de heredar los permisos parece buena, no nos permite personalizar los sub-sitios a menos que “rompamos” o “cortemos” la herencia del sitio padre. Supongamos el siguiente caso:

Deseamos crear dentro del portal una sección de Documentación y dentro de ella por Departamento un sub-sitio, pero requerimos que la documentación de cada departamento este visible solamente al grupo de personas que se le indique. En tal caso podemos pensar que no todos tendrán acceso al sitio de documentación de cada departamento. 

La estructura de los sitios podría ser como esta:

image

Por la herencia si tenemos acceso de lectura a la colección de sitos tendremos acceso de lecturas en los demás sub-sitios, y esto no es lo deseable en este caso.  Entonces no tenemos otra alternativa que “romper” la herencia de permisos, eliminar los permisos heredados no deseables y posiblemente agregar algunos nuevos.

imageImagen de la opción de SharePoint para romper la herencia.

 

 

 

Para el primer nivel o sitio Document Center “romperemos” la herencia de la seguridad y agregaremos nuestros grupos personalizados como lo muestra la imagen de abajo:

image

Recomendaciones:

Utilice una nomenclatura estándar para el nombramiento de los grupos esto facilitará la búsqueda de los grupos y su asignación.  Esta inversión de tiempo luego tendrá sus réditos.

Póngale cuidado a los permisos de cada grupo, como lo muestra la siguiente tabla:

Administradores – Full Control

Colaboradores – Contribute

Lectores y Común - Read

El grupo SP-DOC-Común esta definido para un área común de acceso para los demás sub-sitios.

El grupo SP-DOC-Administradores para los administradores de todos los sub-sitios.  No falta alguien que debe de tener acceso a todos de “Full-Control”.

El grupo SP-DOC-Colaboradores para los responsables de subir los documentos en cada sub-sitio.

El grupo SP-DOC-Lectores para aquellas excepciones que si pueden ver todo la información de todos.

Podemos decir entonces que tendremos 6 grupos de seguridad por cada sub-sitio que representa el departamento; Uno para administradores, otro para colaboradores y el último para lectores del departamento y los tres del nivel superior. Como se muestra la imagen de abajo:

image

Adicionalmente a ello asociaremos a cada grupo de SharePoint un grupo del Directorio Activo de Windows, para que el mantenimiento de los permisos de seguridad sean responsabilidad al área de Infraestructura del departamento de IT, y lo hagan en un ambiente que conocen como lo es el Directorio Activo. 

Los nombres de los grupos en el Directorio activo serán:

    • DOC-DepartamentoX-Administradores
    • DOC-DepartamentoX-Colaboradores
    • DOC-DepartamentoX-Lectores.

image

Imagen de la creación de un grupo dentro de la consola de Grupos y Usuarios del Directorio Activo de Windows 2003.

Tip: Si esta dentro de un Bosque (Forest) defínalo local para que le permita ubicar los usuarios de diferentes dominios.

Finalmente debería obtener una lista como lo muestra la imagen de abajo:

image 

Abajo una imagen de SharePoint asignado a un usuario al grupo de SharePoint, que para este caso el usuario es un  grupo del Directorio Activo.

image

El resultado es el siguiente:

image

De tal forma que el departamento de IT, no tiene porque ingresar a SharePoint para asignar usuarios, sino desde la consola del controlador de dominio agregar los usuarios a los grupos definidos.

De esta forma podemos decir las siguientes afirmaciones:

  1. Luego de “romper” la herencia, al definir un grupo nuevo y asignarle permisos dentro del sitio.  Allí deberá asignarle los usuarios o grupos del directorio activo. Si este grupo es utilizado en otro sitio no necesitará asignar nuevamente a los usuarios miembros de dicho grupo.
  2. Ya que se definió un grupo de SharePoint y un grupo del Directorio Activo, esto me permitirá flexibilidad si cambia el directorio activo no afectará los permisos que he definido en SharePoint porque no están tan directamente relacionados.  Lo único que tendré que hacer es asignar le grupo nuevo del directorio activo o al usuario directamente al grupo de SharePoint.
  3. Aunque esta solución no es una de las recomendaciones (“romper la herencia”) de Microsoft. Cuando tenemos este tipo de requerimientos no tenemos otra manera de individualizar los permisos dentro de SharePoint.

Hasta la próxima,

Manolo Herrera