Share via


Implementar una solución de clasificación de sitios de SharePoint

Nota:

Para la clasificación de sitios de SharePoint Online, vea Clasificación "modernas" de sitios de SharePoint.

Incluso con una buena gestión, los sitios de SharePoint pueden proliferar y crecer fuera de control. Los sitios se crean a medida que se necesitan, pero muy pocas veces se eliminan. El rastreo de búsqueda se sobrecarga por la presencia de colecciones de sitios sin usar, por lo que la búsqueda produce resultados irrelevantes y no actualizados. La clasificación de sitios le permite identificar y conservar los datos confidenciales.

En este artículo se muestra cómo usar el ejemplo Core.SiteClassification para implementar una solución de clasificación de sitios y usar las directivas del sitio de SharePoint para exigir la eliminación. Puede integrar esta solución en la solución del sitio de aprovisionamiento existente para administrar mejor sus sitios.

Antes de empezar

Para empezar, descargue el ejemplo Core.DynamicPermissions desde el proyecto modelos y prácticas de Office 365 Developer en GitHub.

Nota:

El código de este artículo se proporciona tal cual, sin garantía de ningún tipo, expresa o implícita, incluidas las garantías implícitas de aptitud para un propósito particular, comerciabilidad o ausencia de infracción.

Definir y establecer directivas del sitio

Al principio, deberá definir y configurar las directivas del sitio que estarán disponibles en todas las colecciones de sitios. El ejemplo Core.SiteClassification se aplica a SharePoint Online MT, pero puede usarse también en SharePoint Online dedicado o SharePoint local. Las directivas del sitio se establecen en el Hub del tipo de contenido, que en SharePoint Online MT se encuentra en https://[tenantname]/sites/contentTypeHub.

Para establecer las directivas del sitio, vaya a Configuración>Administración de la colección de sitios>Directivas del sitio>Crear. Aparece la página Nueva directiva del sitio. Para obtener más información sobre las opciones de la directiva de sitio, consulte Información general sobre la directiva de sitio en SharePoint Server.

En la página Nueva directiva del sitio, escriba la siguiente información en los campos:

  • Nombre: HBI

  • Descripción: Es muy confidencial.

  • Establezca el botón de selección Eliminar sitios automáticamente.

  • Para Eliminación de evento:, use la fecha de creación del sitio + 1 año.

  • Seleccione la casilla Tiempo de antelación para enviar una notificación por correo electrónico a los propietarios de sitios antes de la eliminación: y establezca el valor a 1 mes.

  • Seleccione la casilla Enviar notificaciones de seguimiento cada: y establezca el valor a 14 días.

  • Seleccione la casilla Los propietarios pueden posponer la eliminación inminente: y establezca el valor a 1 mes.

  • Seleccione la casilla La colección de sitios será de solo lectura cuando está cerrada.

Repita estos pasos dos veces más, para los nombres MBI y LBI. Use una diferente configuración para las directivas de retención o eliminación. Cuando haya terminado, puede publicar las directivas nuevas.

Insertar una acción personalizada.

Puede insertar una acción personalizada para la clasificación de sitios en la página Configuración y el icono Engranaje de SharePoint. Esta acción solo está disponible para los usuarios con el permiso ManageWeb. Para obtener más información, consulte ID y ubicaciones de acción personalizada de forma predeterminada

/// <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);
}

Personalizar la clasificación de sitios

Puede usar la página Editar la información del sitio para elegir las siguientes opciones de clasificación específicas:

  • Ámbito público: Establezca a Empresa, Organización o Equipo.

  • Clasificación de seguridad: Establezca a una de las categorías de clasificación que ha escrito, como LBI.

  • Fecha de vencimiento: Reemplace la fecha de vencimiento predeterminada, que se basa en la clasificación que ha escrito previamente.

Tanto el Alcance público como la Clasificación de sitios se pueden buscar y tendrán propiedades administradas asociadas después de la realización del rastreo. Luego, puede usar estas propiedades para buscar determinados tipos de sitios específicos mediante una lista personalizada oculta dentro de la colección de sitios. Esta lista se ha implementado en el proyecto Core.SiteClassification.Common en la clase SiteManagerImpl.

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);

}

De forma predeterminada, al crear una lista que puede usarse de inmediato o con CSOM, esta se encuentra disponible en el menú Novedades. Pero, la lista debe estar oculta. En el siguiente código se elimina el elemento del menú Novedades.

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();    
  }

El ejemplo Core.SiteClassification proporciona la posibilidad de que un administrador del sitio o un usuario con permisos puede eliminar la nueva lista. Cuando se tiene acceso a esta página, se vuelve a crear la lista, pero el ejemplo no vuelve a configurar las propiedades. Para evitarlo, puede ampliar el ejemplo para modificar los permisos de la lista para que solo los administradores de colección de sitios tengan acceso. Como alternativa, puede usar el ejemplo PnP Core.SiteEnumeration para realizar comprobaciones en la lista y notificar a los administradores de sitios en consecuencia.

También se implementa la comprobación de la lista en la clase SiteManagerImpl, en el miembro Initialize.

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)
         {

         }
     }
}

Agregar un indicador de clasificación a la página del sitio

Puede agregar un indicador a una página para mostrar su clasificación del sitio. El ejemplo Core.SiteClassification muestra cómo se inserta una imagen que muestra la clasificación al lado del Título del sitio. En versiones anteriores de SharePoint, esto se hace mediante un control delegado del lado servidor. Aunque puede utilizar una página principal personalizada con JavaScript, en este ejemplo se usa un patrón de JavaScript incrustado. Al cambiar la Directiva de sitio en la página Editar la información del sitio, esto cambia el indicador de sitio para mostrar un pequeño cuadro con colores de fondo distintos para cada una de las opciones de clasificación del sitio.

El método siguiente se define en classifier.js, scripts y el proyecto Core.SiteClassificationWeb. Las imágenes se almacenan en un sitio web de Microsoft Azure. Tendrá que cambiar la URL codificada de forma rígida para que coincida con su entorno.

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;
                    }
                }
            }
        }));
    }

Enfoque alternativo

Puede usar el método de extensión Web.AddIndexedPropertyBagKey en el archivo ObjectPropertyBagEntry.cs en OfficeDevPnP Core para almacenar los valores de clasificación de los contenedores de propiedades del sitio en lugar de una lista. El método permite el rastreo y la búsqueda de los contenedores de propiedades.

Vea también