Compartir a través de


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

  1. 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.

  2. 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.

  3. 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.

  4. 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 .

  5. 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.

  6. 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
    
  7. 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
      
  8. 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.

  9. 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
    
  10. 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