How to get available classification labels with CSOM?

%3CLINGO-SUB%20id%3D%22lingo-sub-111892%22%20slang%3D%22en-US%22%3EHow%20to%20get%20available%20classification%20labels%20with%20CSOM%3F%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-111892%22%20slang%3D%22en-US%22%3E%3CP%3EI%20have%20created%20a%20few%20compliance%20labels%20from%20the%20Office%20365%20Security%20%26amp%3B%20Compliance%20portal.%20These%20have%20been%20successfully%20published%20to%20one%20of%20my%20SharePoint%20sites%20and%20I%20can%20apply%20it%20to%20document%20from%20the%20modern%20library%20UI.%20My%20understanding%20from%20the%20%3CA%20href%3D%22https%3A%2F%2Fdev.office.com%2Fblogs%2Fnew-sharepoint-csom-version-released-for-Office-365-august-2017%22%20target%3D%22_blank%22%20rel%3D%22noopener%20noreferrer%20noopener%20noreferrer%22%3Eaugust%202017%20CSOM%20release%20notes%3C%2FA%3E%26nbsp%3Bwas%20that%20it%20should%20be%20possible%20to%20get%20the%20available%20labels%20in%20a%20site%20using%20the%20GetComplianceTag%20methods.%20I%20have%20not%20been%20successful%20i%20doing%20this%20however.%20One%20approach%20causes%20a%20exception%20saying%20I%20need%20to%20enable%20the%20Site%20Policy%20feature%2C%20even%20though%20it%20is%20enabled.%20The%20other%20return%20a%20empty%20result.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EIs%20there%20a%20working%20example%20for%20getting%20available%20classification%20tags%20programatically%3F%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3ESee%20code%20example%20below%3A%3C%2FP%3E%3CPRE%3Eusing%20Microsoft.SharePoint.Client%3B%0Ausing%20Microsoft.SharePoint.Client.CompliancePolicy%3B%0Ausing%20System%3B%0Ausing%20System.Collections.Generic%3B%0Ausing%20System.Linq%3B%0Ausing%20System.Security%3B%0A%0Anamespace%20Policies%0A%7B%0A%20%20%20%20class%20Program%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20static%20void%20Main(string%5B%5D%20args)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20using%20(var%20clientContext%20%3D%20CreateClientContext())%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FReturns%20empty%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20tags%20%3D%20GetAvailableTagsForSite(clientContext)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20foreach%20(var%20tag%20in%20tags)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine(tag)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Throws%20%22Site%20Policy%20feature%20not%20activated%20in%20site%20collection%22%20even%20if%20it%20is%20activated%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20tags%20%3D%20GetComplianceTags(clientContext)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20foreach%20(var%20tag%20in%20tags)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine(tag)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.ReadLine()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20private%20static%20ClientContext%20CreateClientContext()%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20password%20%3D%20new%20SecureString()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20foreach%20(var%20c%20in%20%22foobar%22)%20password.AppendChar(c)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20credentials%20%3D%20new%20SharePointOnlineCredentials(%22admin%40contoso.onmicrosoft.com%22%2C%20password)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20new%20ClientContext(%22https%3A%2F%2Fcontoso.sharepoint.com%2Fsites%2Fgdpr%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Credentials%20%3D%20credentials%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20private%20static%20IEnumerable%26lt%3Bstring%26gt%3B%20GetComplianceTags(ClientContext%20clientContext)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20web%20%3D%20clientContext.Web%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20clientContext.Load(web)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20clientContext.ExecuteQuery()%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20policyStore%20%3D%20new%20SPPolicyStore(clientContext%2C%20web)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20tags%20%3D%20policyStore.GetComplianceTags()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20clientContext.ExecuteQuery()%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20tags.Select(t%20%3D%26gt%3B%20t.TagName)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20private%20static%20IEnumerable%26lt%3Bstring%26gt%3B%20GetAvailableTagsForSite(ClientContext%20clientContext)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20web%20%3D%20clientContext.Web%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20clientContext.Load(web)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20clientContext.ExecuteQuery()%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20tags%20%3D%20SPPolicyStoreProxy.GetAvailableTagsForSite(clientContext%2C%20clientContext.Url)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20tags.Select(t%20%3D%26gt%3B%20t.TagName)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%7D%3C%2FPRE%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-117546%22%20slang%3D%22en-US%22%3ERe%3A%20How%20to%20get%20available%20classification%20labels%20with%20CSOM%3F%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-117546%22%20slang%3D%22en-US%22%3E%3CP%3EHi%20Gabriel%2C%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EThanks%20for%20your%20post%2C%20I%20was%20able%20to%20find%20my%20answer.%20A%20SharePoint%20site%20object%20has%20a%20property%20classification%20which%20provided%20the%20desired%20result%20in%20my%20case.%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-117523%22%20slang%3D%22en-US%22%3ERe%3A%20How%20to%20get%20available%20classification%20labels%20with%20CSOM%3F%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-117523%22%20slang%3D%22en-US%22%3EThen%20I%20am%20afraid%20I%20do%20not%20know.%20I%20was%20trying%20to%20get%20the%20classification%20label%20from%20individual%20documents.%20I%20suggest%20you%20start%20a%20new%20thread.%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-117515%22%20slang%3D%22en-US%22%3ERe%3A%20How%20to%20get%20available%20classification%20labels%20with%20CSOM%3F%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-117515%22%20slang%3D%22en-US%22%3E%3CP%3EHi%20Gabriel%2C%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EThanks%20for%20your%20response%2C%20my%20library%20is%20showing%20up%20the%20labels.%20But%20my%20requirement%20is%20how%20to%20get%20the%20label%20value%20that%20is%20applied%20to%20my%20site.%20For%20example%20if%20my%20site%20has%20been%20classified%20as%20highly%20confidential%2C%20then%20I%20need%20to%20generate%20a%20report%20which%20list%20down%20all%20the%20sites%20that%20are%20highly%20confidential.%26nbsp%3B%3C%2FP%3E%3CP%3EThe%20CSOM%20release%20shows%20a%20method%20(%3CSPAN%3Epublic%26nbsp%3B%3C%2FSPAN%3E%3CSTRONG%3Emethod%3C%2FSTRONG%3E%3CSPAN%3E%26nbsp%3BMicrosoft.SharePoint.Client.CompliancePolicy.SPPolicyStoreProxy.GetAvailableTagsForSiteLabel).%20I%20tried%20using%20this%20method%20but%20getting%20the%20count%20as%200.%3C%2FSPAN%3E%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-117082%22%20slang%3D%22en-US%22%3ERe%3A%20How%20to%20get%20available%20classification%20labels%20with%20CSOM%3F%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-117082%22%20slang%3D%22en-US%22%3ESee%20the%20code%20in%20my%20first%20reply%20in%20this%20thread.%20That%20code%20was%20working%20for%20me.%20Keep%20in%20mind%20that%20it%20can%20take%20up%20to%2024%20hours%20for%20labels%20to%20be%20propagated%20to%20a%20site.%20Check%20in%20library%20settings%20before%20testing%20your%20code%20just%20to%20be%20sure.%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-117069%22%20slang%3D%22en-US%22%3ERe%3A%20How%20to%20get%20available%20classification%20labels%20with%20CSOM%3F%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-117069%22%20slang%3D%22en-US%22%3E%3CP%3EHi%20Gabriel%2C%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EI%20just%20read%20your%20post%2C%20did%20you%20manage%20to%20get%20a%20solution%20to%20access%20labels%3F%20I%20tried%20at%20my%20end%20as%20well%20but%20could%20not%20succeed.%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EThanks%3C%2FP%3E%3CP%3ERahul%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-111916%22%20slang%3D%22en-US%22%3ERe%3A%20How%20to%20get%20available%20classification%20labels%20with%20CSOM%3F%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-111916%22%20slang%3D%22en-US%22%3E%3CP%3EIt%20appears%20that%20you%20must%20ExecuteQuery%20even%20though%20the%20ComplianceTag%20class%20is%20not%20a%20ClientObject.%20The%20SPPolicyStore%20in%20the%20OP%20still%20fails.%20It%20is%20not%20clear%20to%20me%20what%20the%20differences%20is%20between%20SPPolicyStore%20and%20SPPolicyStoreProxy.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CPRE%3Eprivate%20static%20IEnumerable%26lt%3Bstring%26gt%3B%20GetAvailableTagsForSite(ClientContext%20clientContext)%0A%7B%0A%20%20%20%20var%20web%20%3D%20clientContext.Web%3B%0A%20%20%20%20clientContext.Load(web)%3B%0A%20%20%20%20clientContext.ExecuteQuery()%3B%0A%0A%20%20%20%20var%20tags%20%3D%20SPPolicyStoreProxy.GetAvailableTagsForSite(clientContext%2C%20clientContext.Url)%3B%0A%20%20%20%20clientContext.ExecuteQuery()%3B%0A%0A%20%20%20%20return%20tags.Select(t%20%3D%26gt%3B%20t.TagName)%3B%0A%7D%3C%2FPRE%3E%3C%2FLINGO-BODY%3E
Highlighted
Contributor

I have created a few compliance labels from the Office 365 Security & Compliance portal. These have been successfully published to one of my SharePoint sites and I can apply it to document from the modern library UI. My understanding from the august 2017 CSOM release notes was that it should be possible to get the available labels in a site using the GetComplianceTag methods. I have not been successful i doing this however. One approach causes a exception saying I need to enable the Site Policy feature, even though it is enabled. The other return a empty result.

 

Is there a working example for getting available classification tags programatically?

 

See code example below:

using Microsoft.SharePoint.Client;
using Microsoft.SharePoint.Client.CompliancePolicy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security;

namespace Policies
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var clientContext = CreateClientContext())
            {
                //Returns empty
                var tags = GetAvailableTagsForSite(clientContext);

                foreach (var tag in tags)
                {
                    Console.WriteLine(tag);
                }

                // Throws "Site Policy feature not activated in site collection" even if it is activated
                var tags = GetComplianceTags(clientContext);

                foreach (var tag in tags)
                {
                    Console.WriteLine(tag);
                }
                Console.ReadLine();
            }
        }

        private static ClientContext CreateClientContext()
        {
            var password = new SecureString();
            foreach (var c in "foobar") password.AppendChar(c);
            var credentials = new SharePointOnlineCredentials("admin@contoso.onmicrosoft.com", password);

            return new ClientContext("https://contoso.sharepoint.com/sites/gdpr")
            {
                Credentials = credentials
            };
        }

        private static IEnumerable<string> GetComplianceTags(ClientContext clientContext)
        {
            var web = clientContext.Web;
            clientContext.Load(web);
            clientContext.ExecuteQuery();

            var policyStore = new SPPolicyStore(clientContext, web);
            var tags = policyStore.GetComplianceTags();
            clientContext.ExecuteQuery();

            return tags.Select(t => t.TagName);
        }

        private static IEnumerable<string> GetAvailableTagsForSite(ClientContext clientContext)
        {
            var web = clientContext.Web;
            clientContext.Load(web);
            clientContext.ExecuteQuery();

            var tags = SPPolicyStoreProxy.GetAvailableTagsForSite(clientContext, clientContext.Url);

            return tags.Select(t => t.TagName);
        }
    }
}
6 Replies
Highlighted

It appears that you must ExecuteQuery even though the ComplianceTag class is not a ClientObject. The SPPolicyStore in the OP still fails. It is not clear to me what the differences is between SPPolicyStore and SPPolicyStoreProxy.

 

private static IEnumerable<string> GetAvailableTagsForSite(ClientContext clientContext)
{
    var web = clientContext.Web;
    clientContext.Load(web);
    clientContext.ExecuteQuery();

    var tags = SPPolicyStoreProxy.GetAvailableTagsForSite(clientContext, clientContext.Url);
    clientContext.ExecuteQuery();

    return tags.Select(t => t.TagName);
}
Highlighted

Hi Gabriel,

 

I just read your post, did you manage to get a solution to access labels? I tried at my end as well but could not succeed. 

 

Thanks

Rahul

Highlighted
See the code in my first reply in this thread. That code was working for me. Keep in mind that it can take up to 24 hours for labels to be propagated to a site. Check in library settings before testing your code just to be sure.
Highlighted

Hi Gabriel,

 

Thanks for your response, my library is showing up the labels. But my requirement is how to get the label value that is applied to my site. For example if my site has been classified as highly confidential, then I need to generate a report which list down all the sites that are highly confidential. 

The CSOM release shows a method (public method Microsoft.SharePoint.Client.CompliancePolicy.SPPolicyStoreProxy.GetAvailableTagsForSiteLabel). I tried using this method but getting the count as 0.

Highlighted
Then I am afraid I do not know. I was trying to get the classification label from individual documents. I suggest you start a new thread.
Highlighted

Hi Gabriel,

 

Thanks for your post, I was able to find my answer. A SharePoint site object has a property classification which provided the desired result in my case.