Implementieren einer SharePoint-Lösung für Websiteklassifizierung
Hinweis
Informationen zur SharePoint Online-Websiteklassifizierung finden Sie unter "Moderne" SharePoint-Websiteklassifizierung.
Auch bei guter Steuerung können SharePoint-Websites wuchern und außer Kontrolle geraten. Websites werden nach Bedarf erstellt, aber selten gelöscht. Die Suchdurchforstung wird durch nicht verwendete Websitesammlungen belastet, und die Suche gibt veraltete und irrelevante Ergebnisse zurück. Die Websiteklassifizierung ermöglicht es Ihnen, sensible Daten zu identifizieren und zu schützen.
In diesem Artikel wird erläutert, wie Sie das Beispiel Core.SiteClassification verwenden, um eine Lösung zur Websiteklassifizierung zu implementieren, wie Sie SharePoint-Websiterichtlinien einsetzen, um das Löschen durchzusetzen. Sie können diese Lösung in Ihre vorhandene Websitebereitstellungslösung integrieren, um die Verwaltung Ihrer Websites zu verbessern.
Bevor Sie beginnen
Laden Sie zunächst das Core.SiteClassification-Beispiel aus dem Projekt "Office 365-Entwicklermuster und -vorgehensweisen" auf GitHub herunter.
Hinweis
Der Code in diesem Artikel wird wie besehen und ohne jegliche Garantie zur Verfügung gestellt, gleich ob ausdrücklich oder konkludent, einschließlich jedweder stillschweigenden Gewährleistung der Eignung für einen bestimmten Zweck, Marktgängigkeit oder Nichtverletzung von Rechten.
Definieren und Festlegen von Websiterichtlinien
Zunächst müssen Sie die Websiterichtlinien definieren und festlegen, die in allen Ihren Websitesammlungen verfügbar sein sollen. Das Beispiel Core.SiteClassification gilt für SharePoint Online MT, kann aber auch in SharePoint Online Dedicated oder SharePoint lokal verwendet werden. Websiterichtlinien werden im Inhaltstyphub festgelegt, der sich in SharePoint Online MT unter https://[tenantname]/sites/contentTypeHub
befindet.
Um Websiterichtlinien festzulegen, navigieren Sie zu Einstellungen>Websitesammlungsverwaltung>Websiterichtlinien>Erstellen. Die Seite Neue Websiterichtlinie wird angezeigt. Weitere Informationen zu Websiterichtlinienoptionen finden Sie unter Übersicht über Websiterichtlinien in SharePoint Server.
Geben Sie auf der Seite Neue Websiterichtlinie die folgenden Informationen in die Felder ein:
Name: HBI
Beschreibung: Absolut geheim.
Legen Sie das Optionsfeld Websites automatisch löschen fest.
Verwenden Sie für Ereignis löschen: das Websiteerstellungsdatum + 1.
Aktivieren Sie das Kontrollkästchen Eine Benachrichtigung per E-Mail an Websitebesitzer so früh vor der Löschung senden:, und legen Sie es auf 1 Monat fest.
Aktivieren Sie das Kontrollkästchen Senden von Benachrichtigungen zur Nachverfolgung alle:, und legen Sie es auf 14 Tage fest.
Aktivieren Sie das Kontrollkästchen Besitzer können bevorstehende Löschung verschieben für:, und legen Sie es auf 1 Monat fest.
Aktivieren Sie das Kontrollkästchen Die Websitesammlung steht nach dem Schließen im schreibgeschützten Modus zur Verfügung.
Wiederholen Sie diese Schritte zwei weitere Male für die Namen MBI und LBI. Verwenden Sie verschiedene Einstellungen für Lösch- oder Aufbewahrungsrichtlinien. Wenn Sie fertig sind, können Sie die neuen Richtlinien veröffentlichen.
Einfügen einer benutzerdefinierten Aktion
Sie können der Seite Einstellungen und dem Symbol SharePoint-Gerät eine benutzerdefinierte Aktion für die Klassifizierung der Website hinzufügen. Diese Aktion ist nur für Benutzer mit der Berechtigung ManageWeb verfügbar. Weitere Informationen finden Sie unter Standorte und IDs für benutzerdefinierte Standardaktionen.
/// <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);
}
Benutzerdefinierte Websiteklassifizierung
Auf der Seite Websiteinformationen bearbeiten können Sie die folgenden spezifischen Klassifizierungsoptionen auswählen:
Zielgruppenbereich: Wählen Sie Unternehmen, Organisation oder Team aus.
Sicherheitsklassifizierung: Wählen Sie eine der Klassifizierungskategorien aus, die Sie eingegeben haben, z. B. LBI.
Ablaufdatum: Setzen Sie das standardmäßige Ablaufdatum außer Kraft, das auf der zuvor eingegebenen Klassifizierung basiert.
Sowohl Zielgruppenreichweite als auch Websiteklassifizierung sind durchsuchbar und verfügen über Eigenschaften, die ihnen nach dem Durchführen einer Durchforstung zugeordnet wurden. Sie können diese Eigenschaften anschließend verwenden, um nach bestimmten Arten von Websites zu suchen, indem Sie eine benutzerdefinierte versteckte Liste innerhalb der Websitesammlung verwenden. Diese Liste ist im Projekt Core.SiteClassification.Common in der Klasse SiteManagerImpl implementiert.
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);
}
Wenn Sie eine Liste entweder Out-of-Box oder mit CSOM erstellen, ist die Liste standardmäßig im Menü Zuletzt verwendet verfügbar. Die Liste muss jedoch ausgeblendet werden. Der folgende Code entfernt das Element aus dem Menü Zuletzt verwendet.
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();
}
Das Core.SiteClassification-Beispiel sieht die Möglichkeit vor, dass ein Websiteadministrator oder eine berechtigte Person die neue Liste entfernen kann. Wenn auf diese Seite zugegriffen wird, wird die Liste erneut erstellt, aber das Beispiel setzt die Eigenschaften nicht zurück. Sie können dies vermeiden, indem Sie das Beispiel erweitern, um die Berechtigungen für die Liste so zu ändern, dass nur Administratoren von Websitesammlungen Zugriff haben. Alternativ können Sie auch das PnP-Beispiel Core.SiteEnumeration verwenden, um Überprüfungen der Liste durchzuführen und Websiteadministratoren entsprechend zu informieren.
Die Listenüberprüfung ist auch in der Klasse SiteManagerImpl, im Member Initialize implementiert.
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)
{
}
}
}
Hinweis
Weitere Informationen finden Sie unter Create a list in the host web when your SharePoint add-in is installed, and remove it from the recent stuff list (Erstellen Sie eine Liste im Hostweb, wenn Ihr SharePoint-Add-In installiert wird, und entfernen Sie sie aus der Liste "Zuletzt verwendet").
Hinzufügen eines Klassifizierungsindikators zur Websiteseite
Sie können einer Websiteseite einen Indikator hinzufügen, um deren Klassifizierung anzuzeigen. Das Core.SiteClassification-Beispiel zeigt, wie ein Bild mit der Klassifizierung neben dem Websitetitel eingebettet ist. In früheren Versionen von SharePoint geschah dies über ein serverseitiges Stellvertretungs-Steuerelement. Sie können zwar eine benutzerdefinierte Masterseite mit JavaScript verwenden, dieses Beispiel verwendet aber ein eingebettetes JavaScript-Muster. Wenn Sie die Websiterichtlinie auf der Seite Websiteinformationen bearbeiten ändern, wird der Websiteindikator so geändert, dass er für jede der Klassifizierungsoptionen der Website ein kleines Kästchen mit unterschiedlichen Hintergrundfarben anzeigt.
Die folgende Methode ist im Core.SiteClassificationWeb-Projekt, in den Skripten und classifier.js definiert. Die Bilder werden in einer Microsoft Azure-Website gespeichert. Sie müssen die hartcodierten URLs Ihrer Umgebung entsprechend ändern.
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;
}
}
}
}));
}
Alternativer Ansatz
Sie können die Erweiterungsmethode Web.AddIndexedPropertyBagKey in der Datei "ObjectPropertyBagEntry.cs" in OfficeDevPnP Core verwenden, um die Klassifizierungswerte in Websiteeigenschaftenbehältern statt in einer Liste zu speichern. Die Methode ermöglicht das Durchforsteten oder Durchsuchen von Eigenschaftenbehältern.