Freigeben über


Gewusst wie: Erstellen einer Integritätsregel

Letzte Änderung: Freitag, 16. Oktober 2009

Gilt für: SharePoint Foundation 2010

In Microsoft SharePoint Foundation 2010 erstellen Sie eine Integritätsregel, indem Sie Code für eine konkrete Unterklasse schreiben, die von einer der beiden folgenden abstrakten Klassen erbt: SPHealthAnalysisRule oder SPRepairableHealthAnalysisRule.

Beide Basisklassen erfordern die Implementierung der Eigenschaften Summary, Explanation, Remedy, Category und ErrorLevel sowie der Check()-Methode. Legen Sie für benutzerdefinierte Regeln ErrorLevel nicht auf Success oder RuleExecutionFailure fest, diese Werte sind nur zur internen Verwendung.

Verwenden Sie die Check-Methode, um das Problem zu definieren, das von der Regel erkannt werden soll. Falls die Regel von der SPRepairableHealthAnalysisRule-Klasse erbt, müssen Sie auf die Repair()-Methode implementieren. Hier wird Code platziert, mit dem das von der Check-Methode erkannte Problem behoben wird.

Wenn Sie die Regel für eine automatische Ausführung installieren möchten, sollten Sie auch die AutomaticExecutionParameters-Eigenschaft außer Kraft setzen und implementieren. Mit dieser Eigenschaft werden Standardeinstellungen für den Zeitgeberauftrag bereitgestellt, der die Regel ausführt.

So erstellen Sie eine Integritätsregel

  1. Öffnen Sie Visual Studio als Administrator, indem Sie mit der rechten Maustaste auf das Programm im Startmenü klicken und Als Administrator ausführen auswählen.

  2. Erstellen Sie ein neues Klassenbibliotheksprojekt.

    Wählen Sie im Dialogfeld Neues Projekt die Option Visual C# oder Visual Basic aus, wählen Sie dann Windows und die Vorlage Klassenbibliothek aus.

    Der Name, den Sie für das Projekt verwenden, wird als Standardnamespace für die Assembly verwendet. In einer Assembly können mehrere Integritätsregeln bereitgestellt werden, daher sollten Sie das Projekt entsprechend benennen. Ein Beispiel: CompanyNameHealthRules.

  3. Signieren der Assembly

    Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, und wählen Sie Eigenschaften aus. Klicken Sie auf der Eigenschaftenseite auf Signierung, und aktivieren Sie dann Assembly signieren. Gehen Sie zu einer Schlüsseldatei mit starkem Namen, oder erstellen Sie eine neue Datei.

    Dieser Schritt ist erforderlich, da die Assembly im globalen Assemblycache (Global Assembly Cache, GAC) auf allen Computern installiert werden muss, bevor sie mit SharePoint-Integritätsanalyse registriert wird. Im globalen Assemblycache installierte Assemblys müssen mit einem starken Namen signiert sein. Weitere Informationen finden Sie unter Gewusst wie: Signieren einer Assembly mit einem starken Namen.

  4. Ändern Sie den Namen der Klasse von Class1 in den Namen, der den von der Regel zu erkennenden Fehler beschreibt.

    Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Datei Class1.cs oder Class1.vb, wählen Sie Umbenennen aus, und geben Sie dann den neuen Namen ein. Klicken Sie, wenn Sie gefragt werden, ob alle Verweise auf Class1 umbenannt werden sollen, auf Ja.

  5. Fügen Sie einen Verweis auf Microsoft.SharePoint.dll hinzu.

    Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, und wählen Sie Verweis hinzufügen aus. Gehen Sie im Dialogfeld Verweis hinzufügen zu %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\ISAPI\Microsoft.SharePoint.dll. Wählen Sie Microsoft.SharePoint.dll aus, und klicken Sie dann auf OK.

  6. Fügen Sie eine using-Anweisung (Imports in Visual Basic) für den Microsoft.SharePoint.Administration.Health-Namespace hinzu.

    using Microsoft.SharePoint.Administration.Health;
    
    Imports Microsoft.SharePoint.Administration.Health
    
  7. Ändern Sie die Klassendeklaration, sodass die Klasse von der SPHealthAnalysisRule-Klasse oder der SPRepairableHealthAnalysisRule-Klasse erbt.

    • Wenn Sie mit Visual C# arbeiten, navigieren Sie zur Klassendeklaration. Geben Sie hinter dem Klassennamen ein Semikolon und dann den Namen der Klasse ein, von der die Regel erben soll. Drücken Sie dann UMSCHALT+ALT+F10. Drücken Sie, wenn Sie gefragt werden, ob die Klasse implementiert werden soll, die EINGABETASTE. Der abgeleiteten Klasse werden Stubs für Elemente hinzugefügt, die in der Basisklasse mit abstract gekennzeichnet sind.

      Zu diesem Zeitpunkt wird der Code für die Klassenbibliothek wie im folgenden Beispiel angezeigt.

      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(); }
              }
          }
      }
      
    • If you are working with Visual Basic, geben Sie in die erste leere Zeile unter der Klassendeklaration Inherits und den Namen der Klasse ein, von der die Regel erben soll. Drücken Sie dann die EINGABETASTE. Der abgeleiteten Klasse werden Stubs für Elemente hinzugefügt, die in der Basisklasse mit MustOverride gekennzeichnet sind.

      Zu diesem Zeitpunkt wird der Code für die Klassenbibliothek wie im folgenden Beispiel angezeigt.

      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. Schreiben Sie Code zum Implementieren der abstract-Elemente (oder in Visual Basic MustOverride) der Klasse. Weitere Informationen finden Sie in der Dokumentation für die Klassen SPHealthAnalysisRule und SPRepairableHealthAnalysisRule.

  9. Nun müssen Sie die AutomaticExecutionParameters-Eigenschaft außer Kraft setzen und implementieren.

    Im folgenden Beispiel wird die Implementierung dieser Eigenschaft für eine Regel gezeigt, die stündlich auf allen Servern in der Farm ausgeführt werden soll.

    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. Kompilieren und testen Sie die Regel.

Informationen zum Vorbereiten der neuen Integritätsregel für die Installation durch einen Farmadministrator finden Sie unter Gewusst wie: Erstellen eines Features zum Registrieren einer Integritätsregel.

Beispiel

Im folgenden Beispiel überprüft eine Integritätsregel jeden Server in der Farm einmal am Tag, um zu sehen, ob angeschlossene Datenträger über genügend freien Speicherplatz verfügen.

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

Siehe auch

Aufgaben

Gewusst wie: Testen einer Integritätsregel während der Entwicklung

Gewusst wie: Erstellen eines Features zum Registrieren einer Integritätsregel

Gewusst wie: Bereitstellen einer Integritätsregel mit einem Lösungspaket