Implémenter une solution de classification de site SharePoint

Remarque

Pour une classification de site SharePoint Online, voir Classification des sites SharePoint « modernes ».

Même avec une bonne gouvernance, des sites SharePoint peuvent se multiplier et devenir incontrôlables. Les sites sont créés au fur et à mesure des besoins, mais ils sont rarement supprimés. L’analyse de recherche est surchargée par des collections de sites inutilisées, et la recherche produit des résultats obsolètes et non pertinents. Une classification de site vous permet d’identifier et de préserver des données sensibles.

Cet article explique comment utiliser l’exemple Core.SiteClassification pour implémenter une solution de classification de site, ainsi qu’utiliser des stratégies de site SharePoint pour appliquer une suppression. Vous pouvez intégrer cette solution dans votre solution d’approvisionnement de site existante pour mieux gérer vos sites.

Avant de commencer

Pour commencer, téléchargez l’exemple Core.SiteClassification à partir du projet Pratiques et modèles Office 365 Développeur sur GitHub.

Remarque

Le code dans cet article est fourni tel quel, sans garantie d’aucune sorte, expresse ou implicite, y compris mais sans s’y limiter, aucune garantie implicite d’adéquation à un usage particulier, à une qualité marchande ou une absence de contrefaçon.

Définir et établir des stratégies de site

Initialement, vous devez définir et établir les stratégies de site qui seront disponibles dans toutes vos collections de sites. L’exemple Core.SiteClassification s’applique à SharePoint Online MT, mais peut également servir dans SharePoint Online dédié ou SharePoint local. Les stratégies de site sont définies dans le Concentrateur de type de contenu qui, dans SharePoint Online MT, se trouve dans https://[tenantname]/sites/contentTypeHub.

Pour définir des stratégies de site, accédez à Paramètres>Administration de la collection de sites>Stratégies de site>Créer. La page Nouvelle stratégie de site s’affiche. Pour plus d’informations sur les options de stratégie de site, voir Vue d’ensemble des stratégies de site dans SharePoint Server.

Dans la page Nouvelle stratégie de site, entrez les informations suivantes dans les champs :

  • Nom : HBI

  • Description : ceci est secret.

  • Cochez la case d’option Supprimer les sites automatiquement.

  • Pour Événement de suppression, utilisez la date de création du site + 1 an.

  • Activez la case à cocher Envoyer une notification par courrier électronique aux propriétaires du site à ce stade de la suppression, puis définissez sa valeur sur 1 mois.

  • Activez la case à cocher Envoyer des notifications de suivi à la fréquence suivante, puis définissez sa valeur sur 14 jours.

  • Activez la case à cocher Les propriétaires peuvent reporter la suppression imminente des éléments suivants, puis définissez sa valeur sur 1 mois.

  • Activez la case à cocher La collection de sites sera en lecture seule à la fermeture.

Répétez ces étapes deux fois de plus, pour les noms MBI et LBI. Utilisez des paramètres différents pour les stratégies de suppression et de rétention. Lorsque vous avez terminé, vous pouvez publier les nouvelles stratégies.

Insérer une action personnalisée

Vous pouvez insérer une action personnalisée pour une classification de site via la page Paramètres et l’icône engrenage SharePoint. Cette action est uniquement disponible pour les utilisateurs disposant de l’autorisation ManageWeb. Pour plus d’informations, voir Emplacements d’action personnalisée par défaut et ID.

/// <summary>
/// Adds a custom Action to a Site Collection.
/// </summary>
/// <param name="ctx">The Authenticated client context.</param>
/// <param name="hostUrl">The provider-hosted URL for the application</param>

static void AddCustomAction(ClientContext ctx, string hostUrl)
{
    var _web = ctx.Web;
    ctx.Load(_web);
    ctx.ExecuteQuery();

    // You only want the action to show up if you have manage web permissions.
    BasePermissions _manageWebPermission = new BasePermissions();
    _manageWebPermission.Set(PermissionKind.ManageWeb);

    CustomActionEntity _entity = new CustomActionEntity()
    {
        Group = "SiteTasks",
        Location = "Microsoft.SharePoint.SiteSettings",
        Title = "Site Classification",
        Sequence = 1000,
        Url = string.Format(hostUrl, ctx.Url),
        Rights = _manageWebPermission,
    };

    CustomActionEntity _siteActionSC = new CustomActionEntity()
    {
        Group = "SiteActions",
        Location = "Microsoft.SharePoint.StandardMenu",
        Title = "Site Classification",
        Sequence = 1000,
        Url = string.Format(hostUrl, ctx.Url),
        Rights = _manageWebPermission
    };
    _web.AddCustomAction(_entity);
    _web.AddCustomAction(_siteActionSC);
}

Classification de site personnalisée

Vous pouvez utiliser la page Modifier les informations des sites pour choisir les options de classification spécifiques suivantes :

  • Étendue de l’audience : définissez Entreprise, Organisation ou Équipe.

  • Classification de sécurité : définissez l’une des catégories de Classification que vous avez entrées, telle que LBI.

  • Date d’expiration : remplacez la date d’expiration par défaut basée sur la classification entrée précédemment.

La Portée de l’audience et la Classification du site peuvent faire l’objet d’une recherche et des propriétés gérées y sont associées après exécution d’une analyse de recherche. Vous pouvez ensuite utiliser ces propriétés pour rechercher des types spécifiques de sites à l’aide d’une liste masquée personnalisée au sein de la collection de sites. Cette liste est implémentée dans la classe SiteManagerImpl du projet Core.SiteClassification.Common.

private void CreateSiteClassificationList(ClientContext ctx)
{
  var _newList = new ListCreationInformation()
    {
    Title = SiteClassificationList.SiteClassificationListTitle,
    Description = SiteClassificationList.SiteClassificationDesc,
    TemplateType = (int)ListTemplateType.GenericList,
    Url = SiteClassificationList.SiteClassificationUrl,
    QuickLaunchOption = QuickLaunchOptions.Off
    };

  if(!ctx.Web.ContentTypeExistsById(SiteClassificationContentType.SITEINFORMATION_CT_ID))
    {
    // Content type.
    ContentType _contentType = ctx.Web.CreateContentType(SiteClassificationContentType.SITEINFORMATION_CT_NAME,
    SiteClassificationContentType.SITEINFORMATION_CT_DESC,
    SiteClassificationContentType.SITEINFORMATION_CT_ID,
    SiteClassificationContentType.SITEINFORMATION_CT_GROUP);

    FieldLink _titleFieldLink = _contentType.FieldLinks.GetById(new Guid("fa564e0f-0c70-4ab9-b863-0177e6ddd247"));
    titleFieldLink.Required = false;
    contentType.Update(false);

    // Key field.
    ctx.Web.CreateField(SiteClassificationFields.FLD_KEY_ID, 
      SiteClassificationFields.FLD_KEY_INTERNAL_NAME, 
      FieldType.Text, 
      SiteClassificationFields.FLD_KEY_DISPLAY_NAME, 
      SiteClassificationFields.FIELDS_GROUPNAME);

    // Value field.
    ctx.Web.CreateField(SiteClassificationFields.FLD_VALUE_ID, 
      SiteClassificationFields.FLD_VALUE_INTERNAL_NAME, 
      FieldType.Text, 
      SiteClassificationFields.FLD_VALUE_DISPLAY_NAME, 
      SiteClassificationFields.FIELDS_GROUPNAME);

    // Add Key field to content type.
    ctx.Web.AddFieldToContentTypeById(SiteClassificationContentType.SITEINFORMATION_CT_ID, 
      SiteClassificationFields.FLD_KEY_ID.ToString(), 
      true);

    // Add Value field to content type.
    ctx.Web.AddFieldToContentTypeById(SiteClassificationContentType.SITEINFORMATION_CT_ID,
      SiteClassificationFields.FLD_VALUE_ID.ToString(),
      true);
    }

  var _list = ctx.Web.Lists.Add(_newList);

  list.Hidden = true;
  list.ContentTypesEnabled = true;
  list.Update();
  ctx.Web.AddContentTypeToListById(SiteClassificationList.SiteClassificationListTitle,
    SiteClassificationContentType.SITEINFORMATION_CT_ID, true);
  this.CreateCustomPropertiesInList(_list);
  ctx.ExecuteQuery();
  this.RemoveFromQuickLaunch(ctx, SiteClassificationList.SiteClassificationListTitle);

}

Par défaut, lorsque vous créez une liste prête à l’emploi ou à l’aide de CSOM, celle-ci est disponible dans le menu Récents. La liste doit être toutefois être masquée. Le code suivant supprime l’élément du menu Récents.

private void RemoveFromQuickLaunch(ClientContext ctx, string listName)
  {
  Site _site = ctx.Site;
  Web _web = _site.RootWeb;

  ctx.Load(_web, x => x.Navigation, x => x.Navigation.QuickLaunch);
  ctx.ExecuteQuery();

  var _vNode = from NavigationNode _navNode in _web.Navigation.QuickLaunch
      where _navNode.Title == "Recent"
      select _navNode;

  NavigationNode _nNode = _vNode.First<NavigationNode>();
  ctx.Load(_nNode.Children);
  ctx.ExecuteQuery();
  var vcNode = from NavigationNode cn in _nNode.Children
     where cn.Title == listName
     select cn;
  NavigationNode _cNode = vcNode.First<NavigationNode>();
 _cNode.DeleteObject();
  ctx.ExecuteQuery();    
  }

L’exemple Core.SiteClassification permet à un administrateur de site ou à une personne disposant d’une autorisation de supprimer la nouvelle liste. Lors de l’accès à cette page, la liste est créée à nouveau, mais l’exemple ne rétablit pas les propriétés. Vous pouvez éviter cela en développant l’exemple de façon à modifier les autorisations répertoriées dans la liste afin que seuls des administrateurs de collection de sites aient accès. Vous pouvez également utiliser l’exemple PnP Core.SiteEnumeration pour contrôler la liste et informer les administrateurs de site en conséquence.

Le contrôle de la liste est également implémenté dans le membre Initialize de la classe SiteManagerImpl.

internal void Initialize(ClientContext ctx)
{
try {
       	 var _web = ctx.Web;
         var lists = _web.Lists;
         ctx.Load(_web);
         ctx.Load(lists, lc => lc.Where(l => l.Title == SiteClassificationList.SiteClassificationListTitle));
         ctx.ExecuteQuery();
                
          if (lists.Count == 0) {
                this.CreateSiteClassificationList(ctx); 
          }
      }
      catch(Exception _ex)
         {

         }
     }
}

Ajouter un indicateur de classification à une page de site

Vous pouvez ajouter un indicateur à une page de site pour afficher sa classification. L’exemple Core.SiteClassification montre comment une image présentant une classification est incorporée en regard du Titre du Site. Dans les versions antérieures de SharePoint, cette opération est effectuée via un contrôle délégué côté serveur. Bien que vous puissiez utiliser une page maître personnalisée avec JavaScript, cet exemple utilise un modèle JavaScript incorporé. Lorsque vous modifiez la Stratégie de site dans la page Modifier les informations des sites, cela a pour effet de modifier l’indicateur de site pour afficher une petite case dont la couleur d’arrière-plan est différente pour chacune des options de classification de site.

La méthode suivante est définie dans le projet Core.SiteClassificationWeb, des scripts et classifier.js. Les images sont stockés dans un site web Microsoft Azure. Vous devez modifier les URL codées en dur pour qu’elles correspondent à votre environnement.

function setClassifier() {
    if (!classified)
    {
        var clientContext = SP.ClientContext.get_current();
        var query = "<View><Query><Where><Eq><FieldRef Name='SC_METADATA_KEY'/><Value Type='Text'>sc_BusinessImpact</Value></Eq></Where></Query><ViewFields><FieldRef Name='ID'/><FieldRef Name='SC_METADATA_KEY'/><FieldRef Name='SC_METADATA_VALUE'/></ViewFields></View>";
        var list = clientContext.get_web().get_lists().getByTitle("Site Information");
        clientContext.load(list);
        var camlQuery = new SP.CamlQuery();
        camlQuery.set_viewXml(query);
        var listItems = list.getItems(camlQuery);
        clientContext.load(listItems);

        clientContext.executeQueryAsync(Function.createDelegate(this, function (sender, args) {
            var listItemInfo;
            var listItemEnumerator = listItems.getEnumerator();

            while (listItemEnumerator.moveNext()) {
                listItemInfo = listItemEnumerator.get_current().get_item('SC_METADATA_VALUE');
                
                var pageTitle = $('#pageTitle')[0].innerHTML;
                if (pageTitle.indexOf("img") > -1) {
                    classified = true;
                }
                else {
                    var siteClassification = listItemInfo;
                    if (siteClassification == "HBI") {
                        var img = $("<a href='http://insertyourpolicy' target=_blank><img id=classifer name=classifer src='https://spmanaged.azurewebsites.net/content/img/hbi.png' title='Site contains personally identifiable information (PII), or unauthorized release of information on this site would cause severe or catastrophic loss to Contoso.' alt='Site contains personally identifiable information (PII), or unauthorized release of information on this site would cause severe or catastrophic loss to Contoso.'></a>");
                        $('#pageTitle').prepend(img);
                        classified = true;
                    }
                    else if (siteClassification == "MBI") {
                        var img = $("<a href='http://insertyourpolicy' target=_blank><img id=classifer name=classifer src='https://spmanaged.azurewebsites.net/content/img/mbi.png' title='Unauthorized release of information on this site would cause severe impact to Contoso.' alt='Unauthorized release of information on this site would cause severe impact to Contoso.'></a>");
                        $('#pageTitle').prepend(img);
                        classified = true;
                    }
                    else if (siteClassification == "LBI") {
                        var img = $("<a href='http://insertyourpolicy' target=_blank><img id=classifer name=classifer src='https://spmanaged.azurewebsites.net/content/img/lbi.png' title='Limited or no impact to Contoso if publically released.' alt='Limited or no impact to Contoso if publically released.'></a>");
                        $('#pageTitle').prepend(img);
                        classified = true;
                    }
                }
            }
        }));
    }

Autre approche

Vous pouvez utiliser la méthode d’extension Web.AddIndexedPropertyBagKey dans le fichier ObjectPropertyBagEntry.cs dans OfficeDevPnP Core pour stocker les valeurs de classification dans des conteneurs de propriétés de site plutôt que dans une liste. La méthode permet de naviguer et d’effectuer une recherche dans des conteneurs de propriétés.

Voir aussi