Partager via


Procédure : créer une règle d'intégrité

Dernière modification : vendredi 16 octobre 2009

S’applique à : SharePoint Foundation 2010

Dans Microsoft SharePoint Foundation 2010, vous créez une règle d'intégrité en écrivant du code pour une sous-classe concrète qui hérite de l'une de ces deux classes abstraites SPHealthAnalysisRule ou SPRepairableHealthAnalysisRule.

Les deux classes exigent l'implémentation des propriétés Summary, Explanation, Remedy, Category et ErrorLevel ainsi que la méthode Check(). Pour des règles personnalisées, n'affectez pas à ErrorLevel la valeur Success ou RuleExecutionFailure, qui sont réservées à un usage interne.

Utilisez la méthode Check pour détecter le problème que votre règle est supposée trouver. Si votre règle hérite de la classe SPRepairableHealthAnalysisRule, vous devez également implémenter la méthode Repair(). C'est là qu'il faut placer le code qui corrige le problème trouvé par la méthode Check.

Si vous envisagez d'installer le règle de façon qu'elle puisse s'exécuter automatiquement, vous devez également substituer et implémenter la propriété AutomaticExecutionParameters. Cette propriété fournit les paramètres par défaut pour le travail du minuteur qui exécute la règle.

Pour créer une règle d'intégrité

  1. Ouvrez Visual Studio en tant qu'administrateur en cliquant avec le bouton droit sur le programme dans le menu Démarrer et en sélectionnant Exécuter en tant qu'administrateur.

  2. Créez un projet Bibliothèque de classes.

    Dans la boîte de dialogue Nouveau projet, sélectionnez Visual C# ou Visual Basic, puis Windows et choisissez le modèle Bibliothèque de classes.

    Le nom que vous donnez à votre projet est utilisé en tant qu'espace de noms par défaut pour l'assembly. Plusieurs règles d'intégrité peuvent être déployées dans le même assembly, ce qui fait que vous devez penser à nommer le projet en conséquence : CompanyNameHealthRules, par exemple.

  3. Signez l'assembly.

    Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le nom du projet, puis sélectionnez Propriétés. Sur la feuille de propriétés, cliquez sur Signature, puis cochez Signer l'assembly. Naviguez jusqu'à un fichier de clé de nom ou créez-en un.

    Cette étape est nécessaire car l'assembly doit être installé dans le Global Assembly Cache (GAC) sur tous les ordinateurs avant d'être inscrit auprès de Analyseur d’intégrité SharePoint. Les assemblys qui sont installés dans le GAC doivent être signés avec un nom fort. Pour plus d'informations, voir Comment : signer un assembly avec un nom fort.

  4. Remplacez le nom de la classe Class1 par un nom qui décrit l'erreur que votre règle détectera.

    Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le fichier Class1.cs ou Class1.vb, choisissez Renommer, puis tapez un nouveau nom. Lorsque le système vous demande si vous souhaitez renommer toutes les références à Class1, cliquez sur Oui.

  5. Ajouter une référence à Microsoft.SharePoint.dll

    Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le nom du projet, puis sélectionnez Ajouter une référence. Dans la boîte de dialogue Ajouter une référence, accédez à %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\ISAPI\Microsoft.SharePoint.dll. Select Microsoft.SharePoint.dll, puis cliquez sur OK.

  6. Ajoutez une instruction using (Imports dans Visual Basic) pour l’espace de noms Microsoft.SharePoint.Administration.Health.

    using Microsoft.SharePoint.Administration.Health;
    
    Imports Microsoft.SharePoint.Administration.Health
    
  7. Modifiez la déclaration de classe de façon que la classe hérite de la classe SPHealthAnalysisRule ou de la classe SPRepairableHealthAnalysisRule.

    • Si vous travaillez avec Visual C#, naviguez jusqu'à la déclaration de classe. Après le nom de classe, tapez deux points, puis le nom de la classe de laquelle votre classe doit hériter. Appuyez ensuite sur Shift+Alt+F10. Lorsque le système vous demande si vous souhaitez implémenter la classe, appuyez sur Entrée. Les stubs pour les membres qui sont marqués abstract dans la classe de base sont ajoutés à la classe dérivée.

      À ce stade, le code de votre bibliothèque de classes doit rassembler à l'exemple suivant.

      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 vous travaillez avecVisual Basic, sur la première ligne vide en-dessous de la déclaration de classe, tapez Inherits et le nom de la classe de laquelle doit hériter votre règle. Appuyez ensuite sur Entrée. Les stubs pour les membres qui sont marqués MustOverride dans la classe de base sont ajoutés à la classe dérivée.

      À ce stade, le code de votre bibliothèque de classes doit rassembler à l'exemple suivant.

      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. Écrivez du code pour implémenter les membres de la classe abstract (ou, dans Visual Basic, MustOverride). Pour plus d'informations, consultez la documentation des classes SPHealthAnalysisRule et SPRepairableHealthAnalysisRule.

  9. Substituez et implémentez la propriété AutomaticExecutionParameters.

    L'exemple illustre l'implémentation de cette propriété pour une règle qui doit s'exécuter toutes les heures sur tous les serveurs de la batterie.

    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. Compilez et testez la règle.

Pour des information sur la préparation de la nouvelle règle d'intégrité pour l'installation par un administrateur de batterie, voir Procédure : créer une fonction pour inscrire une règle d’intégrité.

Exemple

L'exemple suivant illustre une règle d'intégrité qui vérifie tous les serveurs de la batterie une fois par jour pour voir si les disques qui ont été réparés manquent d'espace.

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

Voir aussi

Tâches

Procédure : tester une règle d’intégrité lors du développement

Procédure : créer une fonction pour inscrire une règle d’intégrité

Procédure : déployer une règle d’intégrité avec un package de solution