Procedimiento para crear una regla de mantenimiento
Última modificación: viernes, 16 de octubre de 2009
Hace referencia a: SharePoint Foundation 2010
En Microsoft SharePoint Foundation 2010, las reglas de mantenimiento se crean mediante la escritura de código para una subclase concreta que hereda de una de estas dos clases abstractas: SPHealthAnalysisRule o SPRepairableHealthAnalysisRule.
Ambas clases base requieren que se implementen las propiedades Summary, Explanation, Remedy, Category y ErrorLevel, además del método Check(). Para las reglas personalizadas, no establezca ErrorLevel en Success ni RuleExecutionFailure, ya que son únicamente para uso interno.
Use el método Check para detectar el problema para el que está diseñada la regla. Si la regla hereda de la clase SPRepairableHealthAnalysisRule, se debe implementar también el método Repair(). Aquí debe colocarse el código que corrige el problema que encuentra el método Check.
Si tiene la intención de instalar la regla para que pueda ejecutarse automáticamente, también debe invalidar e implementar la propiedad AutomaticExecutionParameters. Esta propiedad proporciona la configuración predeterminada para el trabajo de temporizador que ejecuta la regla.
Para crear una regla de mantenimiento
Para abrir Visual Studio como administrador, haga clic con el botón secundario en el programa en el menú Inicio y seleccione Ejecutar como administrador.
Cree un nuevo proyecto de biblioteca de clases.
En el cuadro de diálogo Nuevo proyecto, seleccione Visual C# o Visual Basic y, a continuación, seleccione Windows y elija la plantilla Biblioteca de clases.
El nombre que se le da al proyecto se usa como espacio de nombres predeterminado para el ensamblado. Tenga en cuenta que se pueden implementar muchas reglas de mantenimiento en el mismo ensamblado, por lo que deberá asignar un nombre correspondiente al proyecto, por ejemplo: CompanyNameHealthRules.
Firme el ensamblado.
En el Explorador de soluciones, haga clic con el botón secundario en el nombre del proyecto y elija Propiedades. En la hoja de propiedades, haga clic en Firma y, a continuación, seleccione Firmar el ensamblado. Explore o navegue hasta un archivo de clave de nombre seguro o cree uno nuevo.
Este paso es necesario porque el ensamblado debe estar instalado en la memoria caché global de ensamblado (GAC) en todos los equipos para que se registre con Analizador de mantenimiento de SharePoint. Los ensamblados instalados en la GAC deben estar firmados con un nombre seguro. Para obtener más información, vea el tema sobre el procedimiento para firmar un ensamblado con un nombre seguro.
Cambie el nombre de la clase de Class1 a un nombre que describa el error que la regla detectará.
En el Explorador de soluciones, haga clic con el botón secundario en el archivo Class1.cs o Class1.vb, seleccione Cambiar nombre y, a continuación, escriba un nuevo nombre. Cuando el sistema le pregunte si desea cambiar el nombre a todas las referencias a Class1, haga clic en Sí.
Agregue una referencia en Microsoft.SharePoint.dll.
En el Explorador de soluciones, haga clic con el botón secundario en el nombre del proyecto y seleccione Agregar referencia.... En el cuadro de diálogo Agregar referencia, explore o navegue hasta llegar a %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\ISAPI\Microsoft.SharePoint.dll. Seleccione Microsoft.SharePoint.dll y, a continuación, haga clic en Aceptar.
Agregue una instrucción using (Imports en Visual Basic) para el espacio de nombres Microsoft.SharePoint.Administration.Health.
using Microsoft.SharePoint.Administration.Health;
Imports Microsoft.SharePoint.Administration.Health
Modifique la instrucción de clase para que la clase herede de la clase SPHealthAnalysisRule o de la clase SPRepairableHealthAnalysisRule.
Si va a trabajar con Visual C#, navegue a la instrucción de clase. Después del nombre de la clase, escriba un carácter de dos puntos y, a continuación, el nombre de la clase de la que la regla debe heredar. A continuación, presione Mayús+Alt+F10. Cuando el sistema le pregunte si desea implementar la clase, presione Entrar. Los códigos auxiliares para los miembros marcados como abstract en la clase base se agregan a la clase derivada.
En este momento, el código de la biblioteca de clases debe ser similar al del ejemplo siguiente.
using Microsoft.SharePoint.Administration.Health; namespace Samples.HealthRules { public class DiskDriveAlmostFull: SPHealthAnalysisRule { public override SPHealthCategory Category { get { throw new System.NotImplementedException(); } } public override SPHealthCheckStatus Check() { throw new System.NotImplementedException(); } public override SPHealthCheckErrorLevel ErrorLevel { get { throw new System.NotImplementedException(); } } public override string Explanation { get { throw new System.NotImplementedException(); } } public override string Remedy { get { throw new System.NotImplementedException(); } } public override string Summary { get { throw new System.NotImplementedException(); } } } }
Si va a trabajar con Visual Basic, en la primera línea en blanco debajo de la instrucción de clase, escriba Inherits y el nombre de la clase de la que la regla debe heredar. A continuación, presione Entrar. Los códigos auxiliares para los miembros marcados como MustOverride en la clase base se agregan a la clase derivada.
En este momento, el código de la biblioteca de clases debe ser similar al del ejemplo siguiente.
Imports Microsoft.SharePoint.Administration.Health Public Class DiskDriveAlmostFull Inherits SPHealthAnalysisRule Public Overrides ReadOnly Property Category() As Microsoft.SharePoint.Administration.Health.SPHealthCategory Get End Get End Property Public Overrides Function Check() As Microsoft.SharePoint.Administration.Health.SPHealthCheckStatus End Function Public Overrides ReadOnly Property ErrorLevel() As Microsoft.SharePoint.Administration.Health.SPHealthCheckErrorLevel Get End Get End Property Public Overrides ReadOnly Property Explanation() As String Get End Get End Property Public Overrides ReadOnly Property Remedy() As String Get End Get End Property Public Overrides ReadOnly Property Summary() As String Get End Get End Property End Class
Escriba el código para implementar los miembros abstract (o, en Visual Basic, MustOverride) de la clase. Para obtener más información, vea la documentación para las clases SPHealthAnalysisRule y SPRepairableHealthAnalysisRule.
Invalide e implemente la propiedad AutomaticExecutionParameters.
El ejemplo siguiente muestra la implementación de esta propiedad para una regla que debe ejecutarse cada hora en todos los servidores del conjunto o granja de servidores.
public override SPHealthAnalysisRuleAutomaticExecutionParameters AutomaticExecutionParameters { get { SPHealthAnalysisRuleAutomaticExecutionParameters retval = new SPHealthAnalysisRuleAutomaticExecutionParameters(); retval.Schedule = SPHealthCheckSchedule.Hourly; retval.Scope = SPHealthCheckScope.All; retval.ServiceType = typeof(SPTimerService); return retval; } }
Public Overrides ReadOnly Property AutomaticExecutionParameters() As Microsoft.SharePoint.Administration.Health.SPHealthAnalysisRuleAutomaticExecutionParameters Get Dim retval As SPHealthAnalysisRuleAutomaticExecutionParameters = _ New SPHealthAnalysisRuleAutomaticExecutionParameters() retval.Schedule = SPHealthCheckSchedule.Hourly retval.Scope = SPHealthCheckScope.All retval.ServiceType = Type.GetType("Microsoft.SharePoint.Administration.SPTimerService") Return retval End Get End Property
Compile y pruebe la regla.
Para obtener información acerca de cómo preparar la nueva regla de mantenimiento para que la instale un administrador de la granja de servidores, vea Procedimiento para crear una característica para registrar una regla de mantenimiento.
Ejemplo
El ejemplo siguiente es una regla de mantenimiento que comprueba una vez al día todos los servidores de la granja para ver si los discos que se corrigieron se están quedando sin espacio libre.
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using Microsoft.SharePoint.Administration;
using Microsoft.SharePoint.Administration.Health;
namespace Samples.HealthRules
{
public class DiskDriveAlmostFull: SPHealthAnalysisRule
{
private List<DriveInfo> m_FailingDrives = new List<DriveInfo>();
public override string Summary
{
get { return "One or more disk drives are running out of free space."; }
}
public override string Explanation
{
get
{
StringBuilder sb = new StringBuilder();
foreach (DriveInfo drive in this.m_FailingDrives)
{
sb.AppendFormat("{0} ({1}), ",
drive.VolumeLabel, drive.Name);
}
if (sb.Length > 2)
sb.Remove(sb.Length - 2, 2);
return string.Concat(
"The following drives on the failing servers have less than 10GB free: ", sb);
}
}
public override string Remedy
{
get { return "Examine the failing servers and delete old logs or free space on the drives."; }
}
public override SPHealthCategory Category
{
get { return SPHealthCategory.Availability; }
}
public override SPHealthCheckErrorLevel ErrorLevel
{
get { return SPHealthCheckErrorLevel.Error; }
}
public override SPHealthAnalysisRuleAutomaticExecutionParameters AutomaticExecutionParameters
{
get
{
SPHealthAnalysisRuleAutomaticExecutionParameters retval =
new SPHealthAnalysisRuleAutomaticExecutionParameters();
retval.Schedule = SPHealthCheckSchedule.Daily;
retval.Scope = SPHealthCheckScope.All;
retval.ServiceType = typeof(SPTimerService);
return retval;
}
}
public override SPHealthCheckStatus Check()
{
const long bytesInGb = 1024 * 1024 * 1024;
if (!SPFarm.Joined)
throw new InvalidOperationException();
foreach (DriveInfo di in DriveInfo.GetDrives())
{
try
{
if (!(di.IsReady && di.DriveType == DriveType.Fixed))
continue;
if (di.TotalFreeSpace < 10 * bytesInGb)
this.m_FailingDrives.Add(di);
}
catch (IOException)
{
}
}
if (this.m_FailingDrives.Count == 0)
return SPHealthCheckStatus.Passed;
else
return SPHealthCheckStatus.Failed;
}
}
}
Imports System
Imports System.Collections.Generic
Imports System.IO
Imports System.Text
Imports Microsoft.SharePoint.Administration
Imports Microsoft.SharePoint.Administration.Health
Public Class DiskDriveAlmostFull
Inherits SPHealthAnalysisRule
Private m_FailingDrives As List(Of DriveInfo) = New List(Of DriveInfo)
Public Overrides ReadOnly Property Summary() As String
Get
Return "One or more disk drives are running out of free space."
End Get
End Property
Public Overrides ReadOnly Property Explanation() As String
Get
Dim sb As StringBuilder = New StringBuilder()
Dim drive As DriveInfo
For Each drive In Me.m_FailingDrives
sb.AppendFormat("{0} ({1}), ", _
drive.VolumeLabel, drive.Name)
Next
If sb.Length > 2 Then
sb.Remove(sb.Length - 2, 2)
End If
Return String.Concat( _
"The following drives on the failing servers have less than 10GB free: ", sb)
End Get
End Property
Public Overrides ReadOnly Property Remedy() As String
Get
Return "Examine the failing servers and delete old logs or free space on the drives."
End Get
End Property
Public Overrides ReadOnly Property Category() As Microsoft.SharePoint.Administration.Health.SPHealthCategory
Get
Return SPHealthCategory.Availability
End Get
End Property
Public Overrides ReadOnly Property ErrorLevel() As Microsoft.SharePoint.Administration.Health.SPHealthCheckErrorLevel
Get
Return SPHealthCheckErrorLevel.Error
End Get
End Property
Public Overrides ReadOnly Property AutomaticExecutionParameters() As Microsoft.SharePoint.Administration.Health.SPHealthAnalysisRuleAutomaticExecutionParameters
Get
Dim retval As SPHealthAnalysisRuleAutomaticExecutionParameters = _
New SPHealthAnalysisRuleAutomaticExecutionParameters()
retval.Schedule = SPHealthCheckSchedule.Daily
retval.Scope = SPHealthCheckScope.All
retval.ServiceType = Type.GetType("Microsoft.SharePoint.Administration.SPTimerService")
Return retval
End Get
End Property
Public Overrides Function Check() As Microsoft.SharePoint.Administration.Health.SPHealthCheckStatus
Dim bytesInGb As Long = 1024 * 1024 * 1024
If Not SPFarm.Joined Then
Throw New InvalidOperationException()
End If
Dim di As DriveInfo
For Each di In DriveInfo.GetDrives()
Try
If Not (di.IsReady And di.DriveType = DriveType.Fixed) Then
Continue For
End If
If di.TotalFreeSpace < 10 * bytesInGb Then
Me.m_FailingDrives.Add(di)
End If
Catch ex As IOException
End Try
Next
If Me.m_FailingDrives.Count = 0 Then
Return SPHealthCheckStatus.Passed
Else
Return SPHealthCheckStatus.Failed
End If
End Function
End Class
Vea también
Tareas
Procedimiento para probar una regla de mantenimiento durante el desarrollo
Procedimiento para crear una característica para registrar una regla de mantenimiento
Procedimiento para implementar una regla de mantenimiento con un paquete de solución