Compartilhar via


Implementar uma solução de classificação de site do SharePoint

Observação

Para conhecer a classificação de site do SharePoint Online, confira Classificação de sites "moderna" do SharePoint.

Mesmo com a boa governança, os sites do SharePoint podem proliferar e sair do controle. Os sites são criados à medida que se tornam necessários, mas raramente são excluídos. O rastreamento de pesquisa fica sobrecarregado por conjuntos de sites não utilizados, e a pesquisa produz resultados desatualizados ou irrelevantes. A classificação de site permite identificar e preservar dados confidenciais.

Este artigo mostra como usar o exemplo Core.SiteClassification para implementar uma solução de classificação de site, bem como usar as políticas de site do SharePoint para aplicar a exclusão. Você pode integrar essa solução à sua solução de provisionamento de sites existente para gerenciar melhor seus sites.

Antes de começar

Para começar, baixe o exemplo Core.SiteClassification no projeto Padrões e Práticas de Desenvolvedores do Office 365 no GitHub.

Observação

The code in this article is provided as-is, without warranty of any kind, either express or implied, including any implied warranties of fitness for a particular purpose, merchantability, or non-infringement.

Definir e configurar políticas de site

Inicialmente, você precisa definir e configurar as políticas de site que estarão disponíveis em todos os seus conjuntos de sites. O exemplo Core.SiteClassification aplica-se ao SharePoint Online MT, mas pode ser usado também no SharePoint Online dedicado ou do SharePoint local. As políticas de site são definidas no Hub de tipos de conteúdo, que está localizado no SharePoint Online MT em https://[tenantname]/sites/contentTypeHub.

Para definir políticas de site, acesse Configurações>Administração do Conjunto de Sites>Políticas de Site>Criar. A página Nova Política de Site é exibida. Para saber mais sobre as opções de política de site, confira Visão geral das políticas de site no SharePoint Server.

Na página Nova Política de Site, insira as seguintes informações nos campos:

  • Nome: HBI

  • Descrição: isto é ultrassecreto.

  • Defina o botão de opção como Excluir sites automaticamente.

  • Em Evento de exclusão:, use Data de criação do site de mais de 1 ano.

  • Marque a caixa de seleção Enviar uma notificação por email aos proprietários do site com a seguinte antecedência antes da exclusão: e defina para 1 mês.

  • Marque a caixa de seleção Enviar notificações de acompanhamento a cada: e defina para 14 dias.

  • Marque a caixa de seleção Os proprietários podem adiar a exclusão iminente por: e defina para 1 mês.

  • Marque a caixa de seleção O conjunto de sites será lido apenas quando estiver fechado.

Repita essas etapas mais duas vezes, para os nomes MBI e LBI. Use configurações diferentes para políticas de retenção ou exclusão. Quando terminar, você poderá publicar as novas políticas.

Inserir uma ação personalizada

É possível inserir uma ação personalizada para a classificação de site na página Configurações e no ícone de engrenagem do SharePoint. Essa ação só está disponível para usuários com a permissão ManageWeb. Para saber mais informações, confira IDs e locais de ação personalizada padrão.

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

Classificação de site personalizada

Você pode usar a página Editar Informações do Site para escolher as seguintes opções de classificação específicas:

  • Escopo do Público: defina como Empresa, Organização ou Equipe.

  • Classificação de Segurança: defina como uma das categorias de classificação que você inseriu, como LBI.

  • Data de Validade: substitua a data de expiração padrão, baseada na classificação inserida anteriormente.

Tanto Alcance de Público quanto Classificação de Site podem ser pesquisados e terão propriedades gerenciadas associadas a eles depois que um rastreamento ocorrer. É possível usar essas propriedades para procurar tipos específicos de sites usando uma lista personalizada oculta no conjunto de sites. Essa lista foi implementada no projeto Core.SiteClassification.Common na classe 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);

}

Por padrão, quando você cria uma lista pronta para uso ou empregando o CSOM, a lista fica disponível no menu Recentes. No entanto, a lista precisa ser oculta. O código a seguir remove o item do menu Recentes.

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

O exemplo Core.SiteClassification oferece a possibilidade de que um administrador de site ou alguém com permissão remova a nova lista. Quando essa página é acessada, a lista é criada novamente, mas o exemplo não redefine as propriedades. Para evitar isso, amplie o exemplo para modificar as permissões da lista, de modo que somente os administradores de conjunto de sites tenham acesso. Como alternativa, você pode usar o exemplo PnP Core.SiteEnumeration para fazer verificações na lista e notificar os administradores de site adequadamente.

A verificação de lista também foi implementada na classe SiteManagerImpl, no membro 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)
         {

         }
     }
}

Adicionar um indicador de classificação à página de site

Você pode adicionar um indicador a uma página de site para mostrar a classificação dela. O exemplo Core.SiteClassification mostra como uma imagem exibindo a classificação é inserida ao lado do Título do Site. Em versões anteriores do SharePoint, isso é feito por meio de um representante de controle do lado do servidor. Embora você possa usar uma página mestra personalizada com JavaScript, esse exemplo usa um padrão de JavaScript inserido. Quando você altera a Política de Site na página Editar Informações de Site, isso altera o indicador de site para mostrar uma pequena caixa usando cores de fundo diferentes para cada uma das opções de classificação de site.

O seguinte método é definido no projeto Core.SiteClassificationWeb, em scripts e no classifier.js. As imagens são armazenadas em um site do Microsoft Azure. Você precisará alterar as URLs embutidas em código para que correspondam ao seu ambiente.

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

Abordagem alternativa

Você pode usar o método de extensão Web.AddIndexedPropertyBagKey no arquivo de ObjectPropertyBagEntry.cs em OfficeDevPnP Core para armazenar os valores de classificação em recipientes de propriedades de site, em vez de fazer isso em uma lista. O método permite que recipientes de propriedades sejam rastreados ou pesquisados.

Confira também