SiteProperties.WebsCount property is returning zero (CSOM)

%3CLINGO-SUB%20id%3D%22lingo-sub-36595%22%20slang%3D%22en-US%22%3ESiteProperties.WebsCount%20property%20is%20returning%20zero%20(CSOM)%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-36595%22%20slang%3D%22en-US%22%3E%3CP%3EWe%20have%20a%20console%20application%20(C%23)%20that%20runs%20nightly%20to%20gather%20stats%20about%20our%20SharePoint%20Online%20environment.%20It%20has%20been%20logging%20the%20number%20of%20subsites%20we%20have%20using%20the%20SiteProperties.WebsCount%20property%20since%209%2F7%2F2015.%20Starting%20on%2012%2F20%2F2016%2C%20that%20number%20has%20come%20back%20as%20zero%20instead%20of%20the%20actual%20value%20(which%20is%207%2C400%2B).%20We%20haven't%20changed%20this%20code%20since%20late%20November%20and%20all%20of%20the%20other%20stat%20values%20we%20gather%20are%20valid.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EThe%20property%20is%20documented%20here%3A%20%3CA%20href%3D%22https%3A%2F%2Fmsdn.microsoft.com%2FEN-US%2Flibrary%2Fmicrosoft.online.sharepoint.tenantadministration.siteproperties.webscount.aspx%22%20target%3D%22_blank%22%20rel%3D%22noopener%20noreferrer%22%3Ehttps%3A%2F%2Fmsdn.microsoft.com%2FEN-US%2Flibrary%2Fmicrosoft.online.sharepoint.tenantadministration.siteproperties.webscount.aspx%3C%2FA%3E%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EI%20found%20a%20PowerShell%20script%20that%20uses%20the%20same%20approach%20as%20our%20console%20application%20here%3A%20%3CA%20href%3D%22https%3A%2F%2Fgallery.technet.microsoft.com%2Foffice%2FHow-to-get-all-the-tenant-2999c21b%22%20target%3D%22_blank%22%20rel%3D%22noopener%20noreferrer%22%3Ehttps%3A%2F%2Fgallery.technet.microsoft.com%2Foffice%2FHow-to-get-all-the-tenant-2999c21b%3C%2FA%3EI've%20attached%20a%20PowerShell%20version%20of%20this%20script%20that%20pulls%20the%20specific%20property%20I'm%20referring%20to%2C%20.WebsCount.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EI've%20tried%20a%20couple%20of%20versions%20of%20CSOM%3A%26nbsp%3BMicrosoft.SharePointOnline.CSOM.16.1.4727.1200%20and%26nbsp%3BMicrosoft.SharePointOnline.CSOM.16.1.5903.1200%20.%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-LABS%20id%3D%22lingo-labs-36595%22%20slang%3D%22en-US%22%3E%3CLINGO-LABEL%3EDeveloper%3C%2FLINGO-LABEL%3E%3C%2FLINGO-LABS%3E%3CLINGO-SUB%20id%3D%22lingo-sub-52843%22%20slang%3D%22en-US%22%3ERe%3A%20SiteProperties.WebsCount%20property%20is%20returning%20zero%20(CSOM)%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-52843%22%20slang%3D%22en-US%22%3E%3CP%3EThe%20Microsoft%20support%20team%20created%20this%20blog%20post%20to%20document%20this%20issue%3A%26nbsp%3B%3CA%20href%3D%22https%3A%2F%2Fblogs.technet.microsoft.com%2Fsharepointdevelopersupport%2F2017%2F01%2F18%2Fhow-to-get-webscount-and-other-details-from-sharepoint-online-using-tenant-administration-api%2F%26nbsp%3B%22%20target%3D%22_blank%22%20rel%3D%22noopener%20noreferrer%22%3Ehttps%3A%2F%2Fblogs.technet.microsoft.com%2Fsharepointdevelopersupport%2F2017%2F01%2F18%2Fhow-to-get-webscount-and-other-details-from-sharepoint-online-using-tenant-administration-api%2F%3C%2FA%3E%26nbsp%3B%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-45432%22%20slang%3D%22en-US%22%3ERe%3A%20SiteProperties.WebsCount%20property%20is%20returning%20zero%20(CSOM)%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-45432%22%20slang%3D%22en-US%22%3E%3CP%3EThank%20you%20for%20confirming%20and%20for%20providing%20your%20code.%20I%20plan%20to%20something%20similar.%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-45384%22%20slang%3D%22en-US%22%3ERe%3A%20SiteProperties.WebsCount%20property%20is%20returning%20zero%20(CSOM)%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-45384%22%20slang%3D%22en-US%22%3E%3CP%3EYes%2C%20I%20did.%20%26nbsp%3BThe%20product%20group%20confirmed%20that%20this%20is%20working%20as%20expected%20(I%20asked%20them%20to%20please%20update%20the%20documentation).%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3ESeveral%20of%20these%20properties%20aren't%20populating%20(like%20they%20did%20in%20the%20past)%20because%20of%20the%20excessive%20work%20it%20takes%20to%20do%20so.%20%26nbsp%3BInstead%20of%20getting%20the%20details%20in%20one%20call%2C%20you%20have%20to%20loop%20through%20all%20of%20the%20site%20collections%20and%20get%20the%20details%20for%20each%20one.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EHere's%20the%20code%20that%20we%20implemented%20(C%23%20%2F%20CSOM)%3A%20%5Bwe%20use%20a%20DataTable%20to%20store%20the%20info%5D%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CPRE%3E%20%20%20%20%20%20%20%20%20%20%20%20using%20(ClientContext%20adminContext%20%3D%20new%20ClientContext(AdminSC))%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%20int%20startIndex%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20adminContext.Credentials%20%3D%20new%20SharePointOnlineCredentials(SCAUserName%2C%20SCAPassword)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20tenant%20%3D%20new%20Tenant(adminContext)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20SPOSitePropertiesEnumerable%20spp%20%3D%20null%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20while%20(spp%20%3D%3D%20null%20%7C%7C%20spp.Count%20%26gt%3B%200)%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%20spp%20%3D%20tenant.GetSiteProperties(startIndex%2C%20true)%3B%20%2F%2Feven%20though%20details%20is%20set%20to%20true%20it%20won't%20work%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20adminContext.Load(spp)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20adminContext.ExecuteQuery()%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20foreach%20(SiteProperties%20sp%20in%20spp)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20SiteProperties%20sprops%20%3D%20tenant.GetSitePropertiesByUrl(sp.Url%2C%20true)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20adminContext.Load(sprops)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20adminContext.ExecuteQuery()%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20DataRow%20myRow%20%3D%20dtSiteStats.NewRow()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20myRow%5B%22SiteCollectionURL%22%5D%20%3D%20sprops.Url%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20myRow%5B%22WebsCount%22%5D%20%3D%20sprops.WebsCount%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20myRow%5B%22StorageUsage%22%5D%20%3D%20sprops.StorageUsage%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20myRow%5B%22TimeZoneId%22%5D%20%3D%20sprops.TimeZoneId%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20myRow%5B%22LastContentModifiedDate%22%5D%20%3D%20sprops.LastContentModifiedDate%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FTHESE%20NO%20LONGER%20WORK%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FmyRow%5B%22SiteCollectionURL%22%5D%20%3D%20sp.Url%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FmyRow%5B%22WebsCount%22%5D%20%3D%20sp.WebsCount%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FmyRow%5B%22StorageUsage%22%5D%20%3D%20sp.StorageUsage%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FmyRow%5B%22TimeZoneId%22%5D%20%3D%20sp.TimeZoneId%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FmyRow%5B%22LastContentModifiedDate%22%5D%20%3D%20sp.LastContentModifiedDate%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dtSiteStats.Rows.Add(myRow)%3B%0A%20%20%20%20%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%20%20%20%20startIndex%20%2B%3D%20spp.Count%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%7D%3C%2FPRE%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-45250%22%20slang%3D%22en-US%22%3ERe%3A%20SiteProperties.WebsCount%20property%20is%20returning%20zero%20(CSOM)%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-45250%22%20slang%3D%22en-US%22%3E%3CP%3EDid%20you%20hear%20back%20from%20the%20MS%20engineer%3F%20I'm%20experiencing%20the%20same%20issue.%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-37630%22%20slang%3D%22en-US%22%3ERe%3A%20SiteProperties.WebsCount%20property%20is%20returning%20zero%20(CSOM)%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-37630%22%20slang%3D%22en-US%22%3E%3CP%3EThe%20Microsoft%20Support%20Engineer%20is%20trying%20to%20confirm%20with%20the%20product%20group%20that%20this%20was%20intentional.%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-36775%22%20slang%3D%22en-US%22%3ERe%3A%20SiteProperties.WebsCount%20property%20is%20returning%20zero%20(CSOM)%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-36775%22%20slang%3D%22en-US%22%3E%3CP%3EHi%26nbsp%3B%3CA%20href%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F2387%22%20target%3D%22_blank%22%3E%40Pieter%20Veenstra%3C%2FA%3E%26nbsp%3B-%20I'm%20pretty%20sure%20it's%20not%20related%20to%20CSOM.%20%26nbsp%3BI'm%20getting%20the%20same%20results%20with%20a%20few%20versions%20of%20CSOM.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EThe%20Microsoft%20Support%20Engineer%20I'm%20working%20with%20has%20been%20able%20to%20reproduce%20the%20issue.%20%26nbsp%3BHe%20suggested%20using%20the%20%22GetSitePropertiesByUrl%22%20method.%20%26nbsp%3BHowever%2C%20I%20did%20some%20testing%20and%20the%20data%20returned%20from%20the%20%22GetSiteProperties%22%20method%20does%20not%20match%20the%20data%20returned%20from%20the%20%22GetSitePropertiesByUrl%22%20method%20for%20the%20same%20site%20collection.%20%26nbsp%3B(TimeZoneID%2C%20WebsCount%2C%20StorageUsage%2C%20LastContentModifiedDate)%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EHe's%20working%20to%20get%20confirmation%20from%20the%20product%20group%20that%20this%20is%20expected%20behavior%20or%20not.%20%26nbsp%3BI%20don't%20see%20how%20this%20can%20be%20anything%20other%20than%20a%20bug.%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-36771%22%20slang%3D%22en-US%22%3ERe%3A%20SiteProperties.WebsCount%20property%20is%20returning%20zero%20(CSOM)%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-36771%22%20slang%3D%22en-US%22%3E%3CP%3EHi%26nbsp%3B%3CA%20href%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F1273%22%20target%3D%22_blank%22%3E%40Kelly%20Jones%3C%2FA%3E%2C%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EI've%20tried%20the%20same%20with%26nbsp%3B%3CSPAN%3EMicrosoft.SharePointOnline.CSOM.16.1.5903.1200%20and%20it%20seems%20to%20be%20working%20without%20any%20problem%20so%20I%20don't%20think%20that%20this%20is%20related%20to%20the%20version%20of%20your%20CSOM%20version.%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%3CSPAN%3ECould%20this%20be%20related%20to%20permissions%3F%20or%20an%20account%20being%20locked%20out%3F%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3E%26nbsp%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3C%2FLINGO-BODY%3E
Deleted
Not applicable

We have a console application (C#) that runs nightly to gather stats about our SharePoint Online environment. It has been logging the number of subsites we have using the SiteProperties.WebsCount property since 9/7/2015. Starting on 12/20/2016, that number has come back as zero instead of the actual value (which is 7,400+). We haven't changed this code since late November and all of the other stat values we gather are valid.

 

The property is documented here: https://msdn.microsoft.com/EN-US/library/microsoft.online.sharepoint.tenantadministration.siteproper...

 

I found a PowerShell script that uses the same approach as our console application here: https://gallery.technet.microsoft.com/office/How-to-get-all-the-tenant-2999c21b I've attached a PowerShell version of this script that pulls the specific property I'm referring to, .WebsCount.

 

I've tried a couple of versions of CSOM: Microsoft.SharePointOnline.CSOM.16.1.4727.1200 and Microsoft.SharePointOnline.CSOM.16.1.5903.1200 .

7 Replies

Hi @Deleted,

 

I've tried the same with Microsoft.SharePointOnline.CSOM.16.1.5903.1200 and it seems to be working without any problem so I don't think that this is related to the version of your CSOM version.

 

Could this be related to permissions? or an account being locked out?

 

 

 

Hi @Pieter Veenstra - I'm pretty sure it's not related to CSOM.  I'm getting the same results with a few versions of CSOM.

 

The Microsoft Support Engineer I'm working with has been able to reproduce the issue.  He suggested using the "GetSitePropertiesByUrl" method.  However, I did some testing and the data returned from the "GetSiteProperties" method does not match the data returned from the "GetSitePropertiesByUrl" method for the same site collection.  (TimeZoneID, WebsCount, StorageUsage, LastContentModifiedDate)

 

He's working to get confirmation from the product group that this is expected behavior or not.  I don't see how this can be anything other than a bug.

The Microsoft Support Engineer is trying to confirm with the product group that this was intentional.

Did you hear back from the MS engineer? I'm experiencing the same issue.

Yes, I did.  The product group confirmed that this is working as expected (I asked them to please update the documentation).

 

Several of these properties aren't populating (like they did in the past) because of the excessive work it takes to do so.  Instead of getting the details in one call, you have to loop through all of the site collections and get the details for each one.

 

Here's the code that we implemented (C# / CSOM): [we use a DataTable to store the info]

 

            using (ClientContext adminContext = new ClientContext(AdminSC))
            {
                int startIndex = 0;
                adminContext.Credentials = new SharePointOnlineCredentials(SCAUserName, SCAPassword);

                var tenant = new Tenant(adminContext);
                SPOSitePropertiesEnumerable spp = null;

                while (spp == null || spp.Count > 0)
                {
                    spp = tenant.GetSiteProperties(startIndex, true); //even though details is set to true it won't work
                    adminContext.Load(spp);
                    adminContext.ExecuteQuery();

                    foreach (SiteProperties sp in spp)
                    {

                        SiteProperties sprops = tenant.GetSitePropertiesByUrl(sp.Url, true);

                        adminContext.Load(sprops);
                        adminContext.ExecuteQuery();

                        DataRow myRow = dtSiteStats.NewRow();
                        myRow["SiteCollectionURL"] = sprops.Url;
                        myRow["WebsCount"] = sprops.WebsCount;
                        myRow["StorageUsage"] = sprops.StorageUsage;
                        myRow["TimeZoneId"] = sprops.TimeZoneId;
                        myRow["LastContentModifiedDate"] = sprops.LastContentModifiedDate;

                        //THESE NO LONGER WORK
                        //myRow["SiteCollectionURL"] = sp.Url;
                        //myRow["WebsCount"] = sp.WebsCount;
                        //myRow["StorageUsage"] = sp.StorageUsage;
                        //myRow["TimeZoneId"] = sp.TimeZoneId;
                        //myRow["LastContentModifiedDate"] = sp.LastContentModifiedDate;

                        dtSiteStats.Rows.Add(myRow);
                    }

                    startIndex += spp.Count;
                }
            }

 

Thank you for confirming and for providing your code. I plan to something similar.