Estadísticas Acceso y Uso en Sharepoint 2007 – WebPart

En el último artículo vimos como se podía configurar las estadísticas de Acceso y Uso en Sharepoint 2007 y vimos como Sharepoint nos da acceso a los informes creados en la administración de la colección de sitios.
Sharepoint nos provee clases para acceder a la información almacenada en la base de datos y que nosotros podemos utilizar para presentar de forma mas amigable todos los registros sucedidos.
La siguiente WebPart trata de mostrar cómo podemos construir una funcionalidad que le permita al usuario final ver la información almacenada, sin tener que acceder a la administración de la colección de sitios.
En las imágenes siguientes vemos la WebPart terminada y funcionando. La idea de la misma es que el usuario seleccione un tipo de evento y la WebPart despliegue toda la información almacenada para dicho evento.


Imagen 1
1_WebPart   

Imagen 2
   2_WebPart_DropDownLoad

Imagen 3
   3_WebPart_Eventos_Desplegados

Lo primero que vamos hacer es crear un proyecto del tipo WebPart en el Visual Studio 2005, en este proyecto vamos a dibujar la WebPart  y cargar toda la información almacenada de los eventos y accesos sucedidos hasta el momento.
Nuestra WebPart al ser cargada lo primero que realizara es inicializar una Hashtable, como clave vamos a utilizar los tipos de eventos provistos por Sharepoint, los cuales están definidos en la enumeración llamada ” SPAuditEventType” y como valor vamos a proveer una instancia de una clase personalizada llamada “AuditItemType”, la cual creamos pare representar un evento especifico y la cual posee una colección de instancias de la clase personalizada “AuditItemInfo” la cual representa un evento en particular.
En la sección 1 vemos el método que se encarga de inicializar la Hashtable con sus valores por defecto.

Sección 1

private void InitializeHassTable()
{
     lAuditInfoCharts = new Hashtable();
     foreach (object spEvent in SPAuditEventType.GetValues(typeof(SPAuditEventType)))
     {
         lAuditInfoCharts.Add(Enum.ToObject(typeof(SPAuditEventType), spEvent), new AuditItemType(spEvent.ToString()));
     }
}

Una vez inicializada la Hashtable, lo siguiente que vamos a realizar es cargar toda la información de los eventos y sucesos almacenada en Sharepoint dentro de la Hashtalbe. Para almacenar dicha información la Hashtable contiene la instancia  de la clase “AuditItemType” la cual representa a un evento en particular, por ese en el constructor de la misma pasamos en nombre del evento.
Para almacenar la información específica de un evento o acceso en particular contamos con una clase llamada “AuditItemInfo” donde obtenemos los valores del evento y los almacenamos en atributos de dicha clase.
Sharepoint nos provee la información de los eventos y accesos a través de la clase “SPAuditEntry” y algunas de sus propiedades son la siguiente:

11)    DocLocation: Esta propiedad provee la ubicación del elemento visto o accedido.

22)    Event: Tipo de evento sucedido.

33)    ItemId: Id del elemento al que se accedió.

44)    Occurred: Fecha y hora en la que sucedió el acceso.

55)    SiteId: Id (Guid) del sito donde está almacenado el elemento accedido.

66)    UserId: Id del usuario que accedió al elemento.

Esta son algunas de las propiedades que nos provee las clase “SPAuditEntry”, dentro de unas tantas que tiene la misma.

Para poder acceder a la información almacenada en Sharepoint debemos ejecutar una consulta utilizando la clase “SPAuditQuery” a la cual le debemos pasar el site que queremos consultar las estadísticas. Una vez creada la instancia de dicha clase debemos ejecutar el método “Getentries”  y le pasamos la instancia de la clase “SPAuditQuery” creada anteriormente. En nuestro caso vamos a utilizar el contexto de Sharepoint (SPContext) actual y vamos a acceder al método “” a través de la propiedad “Audit” del sitio en ejecución. En la sección 2 vemos como es dicha llamada.

Sección 2

SPAuditQuery lQuery = new SPAuditQuery(SPContext.Current.Site);
SPAuditEntryCollection lCollAudit = SPContext.Current.Site.Audit.GetEntries(lQuery);

Por último lo que hacemos es mostrar toda la información almacenada en la Hashtable dentro de una tabla de HTML. Para ellos lo primero que vamos hacer es dibujar en DropDownList en el método “CreateChildControls” y después en el evento “SelectedIndexChanged” del DropDownList cargamos la información para el evento seleccionado. A continuación todo el código fuente necesario para poder dibujar esta WebPart.

Sección 3 – AuditItemInfo

 

using System;

using System.Collections.Generic;

using System.Text;

using Microsoft.SharePoint; 

namespace Siderys.Blogs.WebPart

{

    public class AuditItemInfo

    {

        SPUser mUserAcces = null;

        SPSite mSite = null;

        string mItemViewd = string.Empty;

        DateTime mOcurredView = DateTime.MinValue; 

        public string ItemViewd

        {

            get { return mItemViewd; }

        } 

        public DateTime OcurredView

        {

            get { return mOcurredView; }

        }  

        public SPUser UserAcces

        {

            get { return mUserAcces; }

        }      

        public SPSite Site

        {

            get { return mSite; }

        } 

        public AuditItemInfo(int pIdUser, Guid pSite, Guid pListItem, string pItemViewed, DateTime pOcurredView)

        {

            mItemViewd = pItemViewed;

            mOcurredView = pOcurredView;

            mUserAcces = GetUser(pIdUser);

            mSite = GetSite(pSite);

        }

        //Obtiene el usuario de Sharepoint.

        private SPUser GetUser(int pIdUser)

        {

            return SPContext.Current.Web.AllUsers.GetByID(pIdUser);

        }

        //Obtiene el sitio de donde se vio el elemento.

        private SPSite GetSite(Guid pSite)

        {

            return new SPSite(pSite);

        }

Sección 4 – AuditItemType

using System;

using System.Collections.Generic;

using System.Text;

using Microsoft.SharePoint; 

namespace Siderys.Blogs.WebPart

{

    public class AuditItemType

    {

        string mEventType = string.Empty;

        List<AuditItemInfo> mColAudit = null;

        int mElemntAcces = 0; 

        public List<AuditItemInfo> Eventos

        {

            get { return mColAudit; }

        } 

        public int ElemntAcces

        {

            get { return mColAudit.Count; }

        }

        public string EventType

        {

            get { return mEventType; }

        } 

        public AuditItemType(string pEventType)

        {

            mEventType = pEventType;

            mColAudit = new List<AuditItemInfo>();

        } 

        public void Add(AuditItemInfo pAuditInfo)

        {

            mColAudit.Add(pAuditInfo);

        }

    }

}

 

Sección 5 – AuditingInformationWebPart

namespace Siderys.Blogs.WebPart {

    [Guid("8eac29c5-5b86-481f-8675-2b40914d7bcc")]

    public class AuditingInformationWebPart : System.Web.UI.WebControls.WebParts.WebPart

    { 

        Hashtable lAuditInfoCharts = null;

        DVDropDownList ddEvent = null;

        public AuditingInformationWebPart()

        {

            this.ExportMode = WebPartExportMode.All;

            bool p = this.DesignMode;

            InitializeHassTable();

            GetDataCharts();

            ddEvent = new DVDropDownList();

            ddEvent.SelectedIndexChanged += new EventHandler(ddEvent_SelectedIndexChanged);

            ddEvent.AutoPostBack = true;

            LoadItemDDL();

        } 

        protected override void Render(HtmlTextWriter writer)

        {

            base.Render(writer);

        } 

        protected override void CreateChildControls()

        {

            base.CreateChildControls();           

            HtmlTable lTable = new HtmlTable();

            HtmlTableRow lRow = null;

            HtmlTableCell lCell = null;

            lTable.Border = 0;

            lCell = new HtmlTableCell();

            lRow = new HtmlTableRow();

            lCell.InnerHtml = "<b>Seleccionar Evento: </b>";

            lRow.Controls.Add(lCell);

            lCell = new HtmlTableCell();

            lCell.Controls.Add(ddEvent);

            lRow.Controls.Add(lCell);

            lTable.Controls.Add(lRow);

            Controls.Add(lTable);

        } 

        private void ddEvent_SelectedIndexChanged(object sender, EventArgs e)

        {

            string pEventSelected = ((DVDropDownList)sender).SelectedItem.Text;

            Controls.Add(GetInfoEvetSelected(pEventSelected));

        }

        private HtmlTable GetInfoEvetSelected(string pEventSelected)

        {

//Agregue el código necesario para dibujar las entradas
}

        private void LoadItemDDL()

        {

            ddEvent.Items.Add("Seleccionar...");

            foreach(object lKey in lAuditInfoCharts.Keys)

            {

                string lValue = lKey.ToString();

                ddEvent.Items.Add(lValue);

            }

        }

        private object GetKeyHastTable(string pKey)

        {

            object lReturn = null;

            foreach (object spEvent in SPAuditEventType.GetValues(typeof(SPAuditEventType)))

            { 

                if (spEvent.ToString().EndsWith(pKey)) 

                {

                    lReturn = spEvent;

                    break;

                }                

            }

            return lReturn;

        }

        private void InitializeHassTable()

        {

            lAuditInfoCharts = new Hashtable();

            foreach (object spEvent in SPAuditEventType.GetValues(typeof(SPAuditEventType)))

            {

                lAuditInfoCharts.Add(Enum.ToObject(typeof(SPAuditEventType), spEvent), new AuditItemType(spEvent.ToString()));

            }

        }

        //Carga la información de los eventos en la Hashtable para despues utilizarla.

        private void GetDataCharts()

        {

            SPAuditQuery lQuery = new SPAuditQuery(SPContext.Current.Site);

            SPAuditEntryCollection lCollAudit = SPContext.Current.Site.Audit.GetEntries(lQuery);

            SPAuditEntry p;

            foreach (SPAuditEntry lAuditInfo in lCollAudit)

            {

                switch (lAuditInfo.Event)

                {

                    case SPAuditEventType.Update:

                        ((AuditItemType)lAuditInfoCharts[SPAuditEventType.Update]).Add(new AuditItemInfo(lAuditInfo.UserId, lAuditInfo.SiteId, lAuditInfo.ItemId, lAuditInfo.DocLocation, lAuditInfo.Occurred));

                        break;

                    case SPAuditEventType.View:

                        ((AuditItemType)lAuditInfoCharts[SPAuditEventType.View]).Add(new AuditItemInfo(lAuditInfo.UserId, lAuditInfo.SiteId, lAuditInfo.ItemId, lAuditInfo.DocLocation, lAuditInfo.Occurred));

                        break;

//Agregue el mismo código para todos los tipos de evento y cambien lo necesario para cada tipo de evento.

                 }

            }

        } 

    }

}

La idea de esta WebPart fue demostrar cómo podemos mejorar la forma de mostrar la información que Sharepoint va almacenando.

Fabián Imaz

Siderys Elite Software

Estadísticas de Uso y Accesos en Sharepoint 2007 – Como configurarlo

Sharepoint 2007  cuenta con una característica para registrar todos los movimientos realizados  en los portales web creados, esto es quien accede a ver un documento, quien desprotege un documento, quien borra un elemento de una lista, es decir graba todos los movimientos de uso y acceso a nuestro portal.
Por defecto viene deshabilitada esta característica, la cual tenemos que habilitar y configurar, primero en la administración central para que se cree el archivo físico donde se irán grabando dichos movimientos y después habilitarlo en el portal web que nosotros queremos registrar los movimientos.
Lo primero que tenemos que hacer es habilitar “Procesamiento de Análisis de Uso” en la administración central, para lo cual accedemos a la sección operaciones y después seleccionamos el link “Procesamiento de Análisis de Uso” dentro de la sección  “Operaciones”, como vemos en la Imagen 1.

Imagen 1
1_Adminisracion_Central

Una vez en dicha sección lo que tenemos que hacer es habilitar el registro, dejar la ubicación física que se nos propone cuando habilitamos y después seleccionar la hora de inicio y la hora de fin de cuando se va a procesar la información, una vez configurado, presionamos el botón “Aceptar” para que los cambios sean almacenados, en la imagen 2 podemos apreciar la configuración cargada.

Imagen 2
2_Adminisracion_Central_Configuracion

Una vez realizada la configuración en la administración central, debemos proceder al portal web donde queremos habilitar que se registren los movimientos.
En la administración de la colección de sitios accedemos al link “Configuración de auditoria de la colección de sitios”, ver imagen 3, donde vamos a seleccionar que evento queremos registrar en nuestro portal web. Nosotros vamos a seleccionar todas las opciones sobre los documentos y sobre las listas, pero debemos tener en cuenta que podemos seleccionar la opción que deseemos procesar.

Imagen 3
3_Configuracion_De_Auditoria


Una vez seleccionadas las opciones que queremos procesar lo que debemos hacer es guardar los cambios realizados, para lo cual presionamos el botón “Aceptar”.
Una vez configurado los movimientos que queremos almacenar, ahora podemos acceder a la sección informes para poder ver los mismos, para ello lo que vamos hacer es seleccionar el link “Informes de registro de auditoria” en la administración de la colección de sitios. Una vez en dicha sección nos encontramos con una serie de links que nos permitirán acceder a un archivo Excel o XML con los datos almacenados para el tipo de evento seleccionado. En la imagen 4 vemos todos los links para acceder a la información almacenada para cada uno de los eventos.

Imagen 4
4_Autitoría_Información

Para acceder a la información debemos esperar que los eventos que se van produciendo en el sitio se vayan almacenando en el archivo físico configurado en la administración central.
Sharepoint también cuenta con una funcionalidad llamada “” que nos brinda información detallada de cómo está siendo utilizado el portal web. La información de esta funcionalidad dependerá de si nos encontramos en un Portal MOSS o en un portal WSS. En la imagen 5 vemos la pantalla de resumen de uso para MOSS y en la imagen 6 vemos la pantalla de uso del portal web para WSS (en Ingles).

Imagen 5
5_Informe_Uso_Moss

Imagen 6
6_Informe_Uso_WSS

 

En nuestro próximo articulo vamos a ver cómo utilizando el modelo de clases (Objetos) de Sharepoint 2007 construimos una WebPart que nos permita consultar la información de los movimientos realizados en el sitio y presentarla de una forma mas amigable para el usuario final, puesto que a lo que podemos acceder es a un Excel o Xml para ver la información.