SharePoint Latin Rotating Header Image

Situaciones y Asuntos

Exchange 2010 GetSteppablePipeline Issue

Llegas a la oficina en lunes y te encuentras con que la consola de administracion de Exchange 2010 no permite explorar los nodos de las opciones disponibles. De pronto sale un error como “GetSteppablePipeline” with “1” argument blablabnla. El caso es que no funciona.

Bueno, despues buscar un poco en google encontré que hay que desbloquear los permisos de PowerShell para permitir a la consola ejecutar comandos que mayor nivel de permisos. Esto se hace mediante la consola de Script de PowerShell.

  1. Ejecutas como administrador la consola de PowerShell
  2. Invocas el comando Get-ExecutionPolicy y debera retornar la palabra Restricted
  3. Invocas el comando Set-ExecutionPolicy RemoteSigned y listo.
  4. Ahora si carga la consola de administracion de Exchange 2010 y listo!

Una menos! al parecer esta situacion sucede cuando instalamos algunos updates de Exchange. Mejor me regreso a mi producto favorito, viva SharePoint!

Sin capacidad de almacenamiento suficiente durante proceso de Exportacion/Importacion en SharePoint

En esta semana nos encontramos con un escenario muy particular relacionado con comandos Import/Export SPWeb en SharePoint 2010. Al correr Export-SPWeb o Import-SPWeb el proceso en algún punto marcaba error y la razón fue porque la unidad C: llegaba a su capacidad máxima de almacenamiento.

Es increíble, ya que es bien sabido que debemos contar con volúmenes de disco duro adicionales para guardar los LOGS de SharePoint y en el caso de la base de datos los LOGS y MDFs de SQL. Además, la unidad C: solo es para guardar los archivos del sistema y debemos tener libre el doble equivalente de memoria RAM en capacidad de almacenamiento en disco duro. En otras palabras, si tengo 8GB de RAM, siempre debería tener por lo menos 16GB de espacio almacenamiento libre en C:

Entonces si tengo el almacenamiento de mi servidor de aplicaciones debidamente configurado con diversos volúmenes e incluso con cierto nivel de RAID, ¿porque se llena el disco duro al ejecutar comandos Import-SPWeb y Export-SPWeb?

Resulta que estos comandos son la alternativa disponible para mover sitios web de SharePoint entre colecciones de sitio, son capaces de mover permisos, contenido, versiones, workflows, etc. En estos tiempos donde muchas empresas carecen de gobernabilidad y planeación de un servicio SharePoint es común ver sitios web de SharePoint realmente grandes con una jerarquía de sitios muy profunda y desde la perspectiva de almacenamiento realmente enormes y esto tiene una implicación importante a considerar cuando trabajamos con Import-SPweb y Export-SPWeb.  En realidad y de forma interna estos comandos hacen uso de una funcionalidad pre-construida en SharePoint llamada Content Deployment.

Content Deployment ofrece una alternativa para mover contenido de un lugar a otro y cuenta con todo un proceso para realizarlo. Este proceso es invocado tanto por los comandos Import-SPWeb, Export-SPWeb, Content Deployment del Central Administracion, los respaldos granulares y el modelo de objetos de SharePoint entre otros. En primer instancia este proceso requiere de varios atributos como tipo de exportación (full o incremental), sitios o contenido que será incluido, rutas y paths de archivos donde se exporta el contenido y los logs de los procesos, entre otras opciones de configuración. El caso es que en algún punto, este proceso construye un archivo XML que describe todas las instrucciones detalladas de exportación o importación que proceso deberá seguir y por consiguiente si el sitio a exportar es muy grande, este archivo y algunos otros temporales que genera lo será también. Y bueno, ¿En dónde crees que estos archivos tras bambalinas se almacenan de forma temporal? Pues en el TEMP del usuario firmado y ¿En dónde se almacena el TEMP del usuario firmado? Pues en el disco duro C: y he ahí la razón.

Una alternativa de solución a esto es modificar la variable de entorno TEMP para que su ruta de almacenamiento apunte a una unidad que si tenga la capacidad de almacenamiento necesaria para soportar nuestros procesos de importación y exportación.

clip_image001

También si estás trabajando con PowerShell puedes usar $env:temp para obtener la ruta del TEMP y modificarla usando set-item -path env:temp -value "F:\TEMP".

Cosas de la vida! Saludos

UPDATE: Existe el switch NoFileCompression que podemos utilizar para evitar que de forma temporal se generen los archivos adicionales que se comentaron durante el post. Por default, NoFileCompression es False y esto genera en la carpeta TEMP los archivos temporales previos a los que genera el proceso. Este switch lo deberas especificar tanto en Export-SPWeb como Import-SPWeb.

Descargando las PPTs de SharePoint Conference 2011

Para los que fueron o han adquirido el acceso a MySPC del sitio http://www.mssharepointconference.com encontré en internet un script de PowerShell para descargar las presentaciones de SharePoint Conference 2011 de forma automática, solo que al ejecutarlo, PowerShell marcaba el siguiente error:

File C:\spc2011\GetAllPPTs.ps1 cannot be loaded because the execution of scripts is disabled on this system. Please see “get-help about_signing” for more details

Para solucionarlo:

1. Ejecutamos el script Set-ExecutionPolicy RemoteSigned

2. Posteriormente, en las propiedades del archivo GetAllPPTs.ps1 damos clic en el botón Unblock.

clip_image001

3. Ejecutamos de nuevo y listo.

Aun no se si este script nos sirve para descargar los videos.

Saludos

Accediendo a documentos SharePoint desde explorador de Windows

El día de hoy me contactó un colega para preguntar sobre cómo manejar la información de una biblioteca de documentos SharePoint 2010 desde una experiencia de usuario totalmente familiar que no requiera capacitación y/o dependencia al uso del mismo SharePoint como tal.

El escenario consiste en poner a disposición un conjunto de archivos a un grupo de personas que se encuentran geográficamente dispersos y que requieren colaborar en el consumo y edición de los mismos archivos. Claro que uno primeramente piensa en crear un sitio de equipo y mostrar las bondades pre fabricadas del producto, sin embargo, fue muy estricto en especificar que la experiencia de usuario debe de ser desde explorador de Windows ya que la manera en que trabajan estas personas es abrir un multiples de archivos relacionados de un software no convencional con simplemente seleccionarlos desde el explorador de windows, dar clic derecho y abrirlos.

La solución que pude ofrecer fue la de mapear una biblioteca de documentos de SharePoint 2010 hacia una unidad lógica dentro del disco duro para que así se pueda trabajar con los archivos sin necesidad de acceder al portal SharePoint desde un navegador y seguir respetando el requerimiento de seleccionar y abrir conjuntos de archivos.

Buscamos la biblioteca en cuestión y en el Tab Library del Ribbon elegimos la opción de Open with Explorer:

image

Esto carga una ventana de explorador de Windows con las carpetas y elementos de nuestra biblioteca de documentos. Seleccionamos y copiamos la dirección Url de la ventana de explorador de Windows y presionamos la tecla Alt para mostrar la barra de menú, damos clic sobre Tools y seleccionamos el sub menú Map Network drive para cargar la ventana de configuración de mapeo de un ruta de red.

SNAGHTMLc54a8a

Configuramos la unidad de red con la informacion de unidad y las credenciales necesarias para acceder.

SNAGHTMLc728d8

Especificamos la unidad que se asignara a esta carpeta. En Folder pegamos nuestra dirección Url copiada desde el explorador de Windows. Damos clic en Finish, con esto se configura en nuestro explorador de Windows una nueva unidad de disco duro que de forma directa mapea el contenido de una biblioteca de documentos.

Cuando los usuarios acceden a su equipo simplemente cargan su explorador de Windows y tienen  a su disposición los documentos de SharePoint.

SNAGHTMLc97e47

Es posible renombrar la unidad con algo un poco mas descriptivo.

image

Asi mismo es posible crear un Group Policy Object para empujar a todos los usuarios del dominio la configuracion mencionada sin necesidad de que los mismos usuarios tenga que realizarla. 

Programación ASP.NET en WebParts de SharePoint

Si eres un de desarrollador ASP.NET que se está iniciando en desarrollo SharePoint este ejemplo puede ser de utilidad. Básicamente, usaremos un enfoque de desarrollo de WebParts basado en el uso de Web User Controls de ASP.NET 2.0.

Antes que nada utilizaremos las siguientes herramientas:

Dentro de nuestro servidor de desarrollo SharePoint cargamos Visual Studio 2008 y elegimos la creación de un proyecto SharePoint en blanco, este proyecto lo nombraremos ASPNETWebPart.

clip_image002

Especificaremos que el nivel de confianza de esta solución SharePoint sea Full Trust y la razón es que usaremos un método Page.LoadControl que requiere de permisos elevados para ejecutarse, me parece que la razón es porque este método lee de la ruta de archivos SharePoint “12 hive” y para ello requiere que el proceso w3wpg.exe solicite los permisos necesarios.

clip_image004

Usando la solución generada por Visual Studio 2008 dentro del Solution Explorer agregamos un nuevo Empty Web Site de ASP.NET llamado ASPNETWebPArtsWebSite ubicándolo en la misma carpeta creada por nuestro proyecto anterior.

clip_image006

Dentro de nuestro proyecto ASPNETWebPartWebSite agregamos un Web User Control llamado ASPNETWebUserControl y es muy importante que no deseleccionemos el cuadro de verificación Place Code in separate file.

clip_image008

Esto nos crea un simple archivo con extensión .ascx dentro de nuestro proyecto ASP.NET. A estas alturas podremos realizar cualquier funcionalidad ASP.NET. Solo hay que asegurarnos de no generar dependencias a otras carpetas como App_Code, tratemos de generar todo el código y funcionalidad sobre el Web User Control. En mi caso usare las características de vinculación de controles de ASP.NET para crear el más humilde de los GridView de ASP.NET. Podemos crear una página Defaullt.aspx para probar el funcionamiento del mismo. A continuación agregare un cuadro de texto , un botón y un label.

clip_image010

El resultado es un código Markup que podría tener sin duda código C#. En la sección de Script runat=”Server” estarían los eventos disparados por los controles de nuestro Web User Control. Solo que para propósitos de este ejemplo quiero hacer que los eventos sean disparados desde un WebPart de SharePoint y no necesariamente desde aquí.

A continuación en nuestro proyecto SharePoint agregamos un elemento de tipo Template, el cual nos creara un archivo dentro de la ruta interna de archivos de SharePoint o más conocida como 12 hive “C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\”.

clip_image012

Eliminamos el archivo generado TemplateFile.txt y agregamos la carpeta CONTROLTEMPLATES y dentro la carpeta ASPNETWebParts. Esto permite incluir en nuesdttro paquete de deployment generado por nuestro proyecto SharePoint una nueva carpeta que será aprovisionada de forma confiable en la ruta 12 hive de cada Web Front End de la granja SharePoint. Agregara una nueva carpeta llamada ASPNETWebParts. Dentro de esta carpeta agregaremos como elemento existente nuestro archivo .ascx. El resultado es algo asi:

clip_image014

Ya casi terminamos, a continuación agregamos el código de un WebPart de SharePoint que nos permitirá cargar en tiempo de ejecución el .ascx recién desarrollado. Dentro de nuestro proyecto ASPNETWebPart damos clic derecho y agregamos un nuevo elemento de tipo Web Part bajo el nombre ASPNETWebPart. En realidad puede ser cualquier nombre.

clip_image016

Abrimos el código de nuestro WebPart y agregaremos lo siguiente:

  1. Una variable miembro de tipo UserControl, esta se utilizara como un placeholder de todo el ASPNETWebUserControl.ascx.
  2. Sobre escribimos el método Render para escribir en el flujo de salida de nuestro WebPart el contenido del WebUserControl.
  3. Múltiples variables miembro que representan cada uno de los controles que existen en nuestro archivo ASPNETWebUserControl.ascx
  4. En el evento CreateChaldControls hacemos una instancia de UserControl mediante Page.LoadControl y de cada uno de los controles;

Básicamente podremos tener el control de la funcionalidad desde el WebPart y esto facilita el hacer uso del modelo de objetos de SharePoint para leer datos de otras listas o hacer querys que podamos usar para después presentarlos en el Web User Control.

using System;

using System.Runtime.InteropServices;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Xml.Serialization;

using Microsoft.SharePoint;

using Microsoft.SharePoint.WebControls;

using Microsoft.SharePoint.WebPartPages;

namespace ASPNETWebPart

{

[Guid("7625d718-fb33-4bbc-b05f-2f1ff0dd4a88")]

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

{

public ASPNETWebPart()

{

this.ExportMode = WebPartExportMode.All;

}

protected override void Render(HtmlTextWriter writer)

{

this.ascxControl.RenderControl(writer);

}

UserControl ascxControl;

Button button1;

TextBox textbox1;

Label label1;

GridView gridView1;

protected override void CreateChildControls()

{

base.CreateChildControls();

ascxControl = (UserControl)Page.LoadControl(@"/_controltemplates/ASPNETWebParts/ASPNETWebUserControl.ascx");

button1 = (Button)this.ascxControl.FindControl("Button1");

textbox1 = (TextBox)this.ascxControl.FindControl("TextBox1");

label1 = (Label)this.ascxControl.FindControl("Label1");

gridView1 = (GridView)this.ascxControl.FindControl("GridView1");

button1.Click += new EventHandler(button1_Click);

this.Controls.Add(ascxControl);

}

void button1_Click(object sender, EventArgs e)

{

label1.Text = textbox1.Text;

}

}

}

El resultado:

clip_image018

Como ayudar a que programadores SharePoint dejen de pensar como programadores .NET

Es natural esta situación y todos aquellos programadores ASP.NET en algún momento hemos pasado por aquí:


  • Las listas de SharePoint no son tablas de SQL
  • No te inventes problemas que demuestren tu superioridad ingenieril
  • Piensa en el usuario y su experiencia
  • También existe Office cliente como parte de la solución
  • Conoce las funcionalidades OOB (Out of the box) de SharePoint
  • No pierdas tiempo diseñando lo que ya existe
  • No instales el Office en los WFE
  • XML, XPath y XSLT son amigos
  • Aléjate del web.config y global.asax
  • No hagas Web Services para invocar Web Services de SharePoint
  • Conoce los roles de SharePoint y la arquitectura en general
  • Consulta el User Profile programáticamente en vez del Active Directory
  • No todo son Event o Feature Receivers ni Site Definitions
  • Existen comandos en el stsadm.exe o PowerShell considéralos antes de abrir Visual Studio
  • Conoce lo que significa ensamblados Partial Trust y Full Trust en SharePoint
  • Abre tu mente a temas de infraestructura como SSL, DNS, FQDN, NLB, etc.
  • Crear desarrollo ASP.NET con SQL y mediante Page Viewer WebParts simular y creerse que es SharePoint
  • Sobre todo, no minimices el problema
  • Cuando le eches la culpa a SharePoint y la frustración suba de nivel, es tiempo de comprarse un libro y leerlo Sonrisa

Bienvenido cualquier escenario o consejo.


HG


NOTA: Este post no pretende incomodar, ofender o comparar absolutamente a ninguna clase de programador, lenguaje de programación o tecnología. Gracias.

Cuantos ingenieros se necesitan para cambiar una bombilla o crear sitios SharePoint

No es curioso, es un hecho que en el ambiente laboral relacionado con tecnologías de información y seguramente en muchos otros, nos encontramos con diversas personalidades, temperamentos y arquetipos colaborando día con día para resolver algún problema técnico o de negocio. Las personas tenemos toda una historia distinta, además de cualidades que en parte de forma consiente o inconsciente constituye la forma muy particular de ver y reaccionar ante vida, en algunos casos estas cualidades son las adecuadas para ciertos escenarios pero que en definitiva en otros no lo son.

Entonces la pregunta es, ¿cómo aprovechar lo que cada quien aporta para generar valor empresarial?, esa es una pregunta que especialistas en Management, Leadership y Coaching podrían responder sin ningún problema. Sin embargo, desde mi óptica por lo menos compartir constantemente una visión compartida con lineamientos claros es esencial para organizar y aprovechar lo que cada persona con su historia histeria y experiencia aporta.

En esta historia, el requerimiento es crear un conjunto finito de sitios con las siguientes características:

  • Cada sitio se basa en la plantilla de sitio de Trabajo en Equipo
  • Cada sitio no deberá tener herencia de permisos
  • Cada sitio deberá contar con 4 grupos “Owners, Visitors, Members, Permissions” bajo la nomenclatura “Sitio + Nombre de grupo
  • Cada sitio cuenta con usuarios específicos para cada grupo.

Lo que piensan los miembros del equipo de TI:

  • Miembro 1 – Vamos a lucirnos con la solución, hagamos un WSP con feature receiver a nivel sitio web para que cuando le den activar en las características del sitio, programáticamente los construya y configure.
  • Miembro 2 – ¿Hay urgencia por parte del cliente como para dedicar tiempo a construir y probar un WSP?, ¿se va a reutilizar la jerarquía en algún otro sitio en el futuro?, ¿conviene dejar archivos en el 12 hive y un ensamblado en el GAC con full trust assembly?, ¿vamos a implementar en DEV, QA, UAT y PROD el WSP? Yo digo que construyamos los sitios manualmente usando el UI de SharePoint.
  • Miembro 3 – Usemos scripts en un archivos *.bat que ejecute el comando stsadm.exe para crear los sitios y grupos, pasamos parámetros e nivel comando y creamos un solo archivo que cuente con todas las instrucciones necesarias.

Después los miembros dan inicio a los argumentos técnico-personales para defender su postura a capa y espada, como si fueran program managers de microsoft, correos electrónicos empiezan a fluir con preguntas que toman minutos leer y escribir de regreso para ser enviados de nuevo. El tiempo pasa, el tema sube de nivel, siguen estancados, el usuario pregunta por sus sitios y en eso Miembro 2 lo toma personal, sube de nivel su contestación y claudica ante su postura. Miembro 1 ratifica la postura de Miembro 2 con el afán de no afectar al equipo y Miembro 3 procede a ejecutar la postura del Miembro 2. Tiempo total transcurrido 2.5 horas.

Si lo analizamos, todos pierden. El espíritu del equipo se deteriora, definitivamente se ve mal y el usuario de plano esperando. Realmente cualquier postura es aceptable y totalmente factible, cada una con sus peculiaridades, estimaciones, esfuerzos y consecuencias.

Dicho esto, tengo 2 preguntas:

  1. ¿Cómo podríamos contextualizar las cosas para asegurar que antes de dar inicio a una solución construida por ingenieros, todos estén viendo hacia el mismo lugar? Esa es una respuesta que probablemente podamos encontrar aquí http://www.crecenegocios.com/los-objetivos-de-una-empresa/
  2. ¿Qué estrategia técnica conviene utilizar para un escenario donde el resultado se requiere de inmediato? A veces me pregunto si mi trabajo es preguntar, sin embargo haciendo un intento de posible respuesta, dejo algunos cuestionamientos respecto al escenario planteado y claro, su implementación.

Construyendo sitios de forma manual

Pros

  • Rápida ejecución usando UI de SharePoint
  • Cero dependencia a código, ensamblado o XMLs, todo queda en la base de datos usando los site definitions y templates propietarios de SharePoint que si están considerados para ser migrados y respaldados

Cons

  • No es repetible
  • Requiere de intervención manual para replicar en cada ambiente y por lo tanto hay margen de error

Implementación

Ubicados en el sitio en cuestión accedemos a Acciones de sitio, Configuración del sitio, Toda la configuración del sitio y al de final las galerías elegimos crear sitios o área de trabajo. Especificamos el nombre, url y los siguientes puntos:

Crear sitio Configurar grupos
image image

 

Construyendo sitios programáticamente

Pros

  • Total portabilidad a múltiples ambientes y sitios con mínimo esfuerzo de implementación
  • Aprovisionamiento y des aprovisionamiento flexible de la funcionalidad y dependencias

Cons

  • Crea una dependencia a un WSP, ensamblado en GAC y archivos en 12 hive
  • Requiere de construcción, pruebas, empaquetamiento y puesta en marcha en cada ambiente
  • Pasa a control de versiones y gestión

Implementación

En este caso vemos que utilizamos una colección especial de tipo diccionario para almacenar la URL y Nombre del sitio que deseamos crear. Existen varias formas de hacer lo mismo, en este caso recorremos la colección de plantillas SharePoint para poder elegir la que usaremos “Team Sites”. Recorremos la colección de nuestro diccionario y utilizamos la colección Webs para agregar un nuevo site pasando los argumento recolectados, lo mas importante destacar en este punto es que el ultimo argumento false indica que no se mantiene la herencia y a continuación ya dentro del sitio rompemos la herencia, posteriormente recorremos el arreglo que tiene el nombre de los grupos que estaremos construyendo programáticamente, ese código se los debo y si alguien quiere compartirlo adelante.

           uint        lcid_english = 1033;
            string      siteUrl = "http://portal.litwareinc.com";
            string[]    groupTypeNames = {"Owners","Members","Permissions","Visitors"};

            Dictionary<string, string> targetSites = new Dictionary<string, string>();
            targetSites.Add("demo1", "Sitio de demostracion 1");
            targetSites.Add("demo2", "Sitio de demostracion 2");
            targetSites.Add("demo3", "Sitio de demostracion 3");
                    
                using (SPSite site = new SPSite(siteUrl))
                {
                    SPWebTemplate siteTemplate = null;
                    SPWebTemplateCollection templateCollection = site.GetWebTemplates(lcid_english);
                    
                    foreach (SPWebTemplate template in templateCollection)
                    {
                        if (template.Title.Equals("Team Site"))
                        {
                            siteTemplate = template; 
                            break;
                        }
                    }

                    using (SPWeb web = site.OpenWeb())
                    {
                        foreach (KeyValuePair<string, string> siteInfo in targetSites)
                        {
                            using (SPWeb newWeb = web.Webs.Add(
siteInfo.Key, 
siteInfo.Value, 
string.Empty, 
lcid_english, siteTemplate, false, false))
                            {
                                newWeb.BreakRoleInheritance(false);
                                newWeb.Update();

                                foreach(string groupTypeName in groupTypeNames)
                                {
                                    string groupType = string.Format("{0} {1}",siteInfo.Value,groupTypeName);
                                    
                                    // aqui deberas crear el grupo y asignar los permisos         
                                }                                                                  
                            }                            
                        }
                    }                
                } 



Construyendo sitios con comandos stsadm.exe


Pros


  • Reutilización moderada e intervención manual para especificar sites, groups que se aprovisionaran por los comandos
  • Fácil de corregir y reaccionar ante cualquier error
  • La forma recomendada por Microsoft

Cons


  • Crea una dependencia al script que ejecuta los comandos de staadm.exe para la estructura solicitada
  • Pasa a control de versiones y gestión

Implementación


En esta alternativa utilizamos las sentencias del comando stsadm.exe ubicado en c:\program files\common files\microsoft shared\web server extensions\12\bin especificando mediante –o la opción que deseamos y mediante los parámetros especificamos lo que requerimos. Específicamente –unique describe que no queremos heredar los permisos. Subrayo en rojo la parte donde especificamos el URL del sitio que estaremos creando. En este caso estamos creando un sitio llamado Sitio 1 y posteriormente creando cuatro grupos en donde los grupos Visitors y Members tienen como dueño al grupo Permissions.


stsadm.exe -o createweb –url “el url del sitio donde crearemos/url del nuevo sitio -lcid 1033 -sitetemplate STS#0  -title “Sitio 1″ -description “” –unique


stsadm.exe -o creategroup -url “el url del sitio donde aplicaremos” -name “Sitio 1 Permissions” -description “Permissions of the site” -ownerlogin “administrator@litwareinc.com” -type “Owner”


stsadm.exe -o creategroup -url “el url del sitio donde aplicaremos” -name “Sitio 1 Owners” -description “Owners of the site” -ownerlogin “administrator@litwareinc.com” -type “Owner”


stsadm.exe -o creategroup -url “el url del sitio donde aplicaremos” -name “Sitio 1 Visitors” -description “Visitors of the site” -ownerlogin “Sitio 1 Permissions” -type “Visitor”


stsadm.exe -o creategroup -url “el url del sitio donde aplicaremos” -name “Sitio 1 Members” -description “Members of the site” -ownerlogin “Sitio 1 Permissions” -type “Member”


 


Personalmente en ocasiones he llegado a pensar, ¿qué es mas complejo?, la tecnología o la psicología, en fin.


¿Cuál es la mejor alternativa? Depende Sonrisa

Operation aborted (Exception from HRESULT: 0x80004004 (E_ABORT))

Si por alguna razón te encuentras realizando algún respaldo de tu granja SharePoint y de repente surge la siguiente excepción:

Operation aborted (Exception from HRESULT: 0x80004004 (E_ABORT))

Significa que tu archive LOG de la base de datos en cuestión ha llegado al límite de su capacidad. La solución a esto es truncarlo o reducir su tamaño. Por truncarlo entendemos bloquear el límite que puede almacenar el archive log para que el resto se almacene en Data, en otras palabras establecer un tamaño fijo de almacenamiento del LOG.

Para realizar este proceso desde nuestro Enterprise Manager de SQL ejecutamos las siguientes instrucciones:

 

USE nombredebasededatos
GO
DBCC SHRINKFILE(‘nombredebasededatos’, 1)
BACKUP LOG nombredebasededatos WITH TRUNCATE_ONLY
DBCC SHRINKFILE(‘nombredebasededatos’, 1)

¿Desaparecieron las opciones del menú de acciones de sitio?¿No se puede agregar, modificar o eliminar contenido en SharePoint? ¿A tan solo 3 horas de la presentación tan importante con el cliente estratégico?

Sucede que cuando hacemos un respaldo en SharePoint 2007 mediante el comando stsadm.exe –o backup –url http://xxx –filename “c:\xxx.dat” la base de datos se configura automáticamente en modo de solo lectura y cuando la generación del respaldo termina la base de datos se configure en el modo original.


Pero que sucede si por alguna razón cósmica el proceso de respaldo casi nunca falla? El estado de configuración de base de datos de solo lectura no se establece al modo original causando el siguiente comportamiento:


image


Así es, la cuenta del sistema que se supone debería de tener todas las opciones del menú de acciones de sitio presenta solo una. Seguramente te iras a ver los grupos y permisos y confirmaras que tu cuenta esta como propietario o como administrador de la colección de sitios y sin embargo el mismo comportamiento.


Aqui mas informacion al respecto: http://technet.microsoft.com/en-us/library/cc262811%28office.12%29.aspx