Introduction

Status: DRAFT IN PROCESS

This posting consolidates notes and references associated with resolving Microsoft Project-related dependencies when upgrading an on-premises SharePoint 2010 site collection to on-premises SharePoint 2013 and then to on-premises SharePoint 2016. This posting involves a SharePoint 2010 version site collection hosted in a dedicated content database mounted to a dedicated web application. The site collection needs to be upgraded to SharePoint 2016. The SharePoint 2010 production farm originally featured an instance of Microsoft Project server 2010, and various SharePoint 2010 OOTB Project-related features at the site and web scopes were activated so as to enable integration with the Project Server instance. The organization subsequently migrated all user Microsoft Project portfolios to its Microsoft Project Online available through its O365 instance. Microsoft Project Server 2010 was then disabled and removed. The Project Server PSI Service Application on the SharePoint Server 2010 production farm was left enabled, and Microsoft Project-related features at the site- and web-scope levels were left activated, but their features were no longer used. When the organization deployed an instance of on-premises SharePoint Server 2013 to support new offices, Microsoft Project Server 2013 was not deployed as by that time all Microsoft Project portfolios had been migrated to Project Online, and the 2010 site collection remained hosted on the 2010 production farm and its various Project-related features remained activated but unused. Once resource availability enabled upgrade of the site, upgrade planning and testing began.

We began this effort with little experience or knowledge in Microsoft Project 2010 integration with SharePoint 2010 and thus much of the work was exploratory in nature; thus the great deal of analysis and inspection that was performed.

The test environment includes the following: a development SharePoint Server 2013 farm consisting of a single SharePoint Server and single SQL Server and a development SharePoint Server 2016 farm consisting of one WFE, two APP and a single SQL server. OS for all servers is Windows Server 2012 R2. Authentication is Kerberos. All servers virtualized on vSphere. Server access via MSTSC. Upgrade method was database attach. Content database hosting the site collection was small, only about 10 GB, but heavily used and containing critical content.

The methods used to resolve the various Microsoft Project 2010-related dependencies only employed SharePoint PowerShell API commands or involved making settings changes through the various site collection and web settings user interfaces. No third party tools were used. Read-only SQL queries were performed against copies of the content database hosted to development environments. 

Perform Exploratory Test

An initial exploratory test upgrade from 2010 to 2013 was performed on the site collection to observationally determine what the major issues might be. Prior to engaging the upgrade, no mitigative measures were performed on any known or suspected issues that might block or otherwise be detected during the upgrade process, such as deactivating features, deleting problematic lists and document libraries, etc. The upgrade was performed on the site collection as-is. A dedicated web application was provisioned on the 2013 farm having only local access. The inputs to this process were a backup of the site's content database.  The outputs of this process were content database and site collection upgrade reports.  Here was the process followed for performing a single upgrade:

  1. Full backup of target content database
  2. Migration of backup to development SQL Server
  3. Restoration of backup to development SQL Server
  4. Test-SPContentDatabase executed
  5. Backup mounted to target web application
  6. Analyzed upgrade reports.
  7. Site Collection Health check performed and report analyzed
  8. Site collection upgrade performed (only for 2010 > 2013)

After the full backup was copied over to the 2013 development farm, Test-SPContentDatabase was executed on the content database. The upgrade report generated by Test-SPContentDatabase found a number of non-upgrade-blocking missing dependencies associated with various external and OOTB solutions. Those associated just with Microsoft Project 2010 are listed below. The "Remedy" column is not shown as it did not present additional useful information.

Category Error UpgradeBlocking Message
MissingSiteDefinition TRUE FALSE 3 Sites in database [SP2010_Content_ORG] have reference(s) to a missing site definition, Id = [6215], Lcid = [1033], compatibility level = [14].
MissingFeature TRUE FALSE Database [SP2010_Content_ORG] has reference(s) to a missing feature: Id = [7a8b11f4-38b2-402b-ad94-1213e25150ca].
MissingFeature TRUE
FALSE
Database [SP2010_Content_ORG] has reference(s) to a missing feature: Id = [448e1394-5e76-44b4-9e1c-169b7a389a1b].
MissingFeature TRUE
FALSE
Database [SP2010_Content_ORG] has reference(s) to a missing feature: Id = [525dc00c-0745-47c0-8073-221c2ec22f0f].
MissingFeature
TRUE
FALSE
Database [SP2010_Content_ORG] has reference(s) to a missing feature: Id = [d8d8df90-7b1f-49c1-b170-6f46a94f8c3c].
MissingFeature TRUE
FALSE
Database [SP2010_Content_ORG] has reference(s) to a missing feature: Id = [60d1e34f-0eb3-4e56-9049-85daabfec68c].
MissingFeature
TRUE
FALSE
Database [SP2010_Content_ORG] has reference(s) to a missing feature: Id = [90014905-433f-4a06-8a61-fd153a27a2b5].
MissingAssembly
TRUE
FALSE
Assembly [Microsoft.Office.Project.Server.PWA,Version=14.0.0.0, Culture=neutral,PublicKeyToken=71e9bce111e9429c] is referenced in the database [SP2010_Content_ORG], but is not installed on the current farm. Please install any feature/solution which contains this assembly.

Given that no upgrade-blocking issues were found, the content database was mounted to a web application on the development 2013 farm dedicated to the test and that did not have any other content database mounted to it. After the content database mount and upgrade process was completed, and a browser was able to successfully connect to the site and the site rendered within the browser, a site collection health check was performed. The site collection health check report listed 13 site collection upgrade-blocking problems involving sites that were using a missing template and that therefore could not be upgraded. Each of these entries presented the web's URL followed by "- #0".  These are listed below:

Missing Site Templates

The following sites are using templates that are not yet supported after upgrade:

  • https://.../ - #0
  • https://.../web2/web22 - #0
  • https://.../web2/web23 - #0

Sites that rely on these templates cannot be upgraded at this time, preventing upgrade of this site collection.

Because this problem blocked upgrade to 2016, and we wanted to continue the exploratory test through 2016, we opted to resolve the site collection upgrade-blocking issue first. The method used to resolve the missing site definition problem is discussed later in this posting.  After the missing site definition problem was resolved, steps 1 - 7 were repeated, this time from SharePoint 2013 to SharePoint 2016. No content database upgrade-blocking problems were found when executing Test-SPContentDatabase the second time just prior to mounting the content database to the development SharePoint 2016 farm.

Overall, the test found that there were:

  • No content database upgrade-blocking problems when upgrading from 2010 to 2013 or from 2013 to 2016 and that there was 
  • One site collection upgrade-blocking problem when upgrading from 2010 to 2013

The exploratory test provided a rough boundary to the scope of Microsoft Project 2010-related problems likely to be experienced when upgrading the site and thus more effectively guide resolution of these problems.  The next phase of this effort begins the resolution effort by taking an inventory of the farm and the target site collection.

Generate Site Collection Inventory

This phase involved taking inventories of site objects, including: solutions, features, event receivers, assemblies, webs and lists and document libraries, and specifically noting where these dependencies involved Microsoft Project 2010. The reporting tools and methods used are listed below:

Enumerate All Webs
This report uses STSADM to generate a hierarchical list of webs in each site collection hosted in a content database. Using the syntax provided below, the report is saved in XML format, enabling simple, rapid and efficient text-based searches by name, ID, etc. For example, searching on the ID of a missing feature quickly identified all three subsites where that feature had been activated. The report list includes: sites, site collection features, webs, web features, web event receiver assemblies, web parts, setup files, etc, and it includes the IDs for these objects (where appropriate) and some key information on the object, such as its name and whether it is missing. This report is only available through STSADM. It also works for SharePoint 2013 and 2016, but only if the "-includewebparts" and "-includecustomlistview" switches are not used.
Activated Farm Features
Listing of all activated features having Farm-scope. Generated by PowerShell commandlet and formatted as CSV. Includes all feature properties. This report was executed to document the features activated at the farm level after visually inspecting farm features and to discover hidden farm features. It provides good background on the overall effort, but does not provide information useful directly to the upgrade effort.
Activated Web Application Features
Listing of all activates features having web application-scope. Generated by PowerShell commandlet and formatted as CSV. Includes all feature properties. Executed to document activated features at the web application level. It provides good background on the overall effort, but does not provide information useful directly to the upgrade effort.
Activated Site Collection Features
Listing of all activated features having site collection-scope. Generated by PowerShell commandlet and formatted as CSV. Includes all feature properties.
Activated Web Features
Listing of all activated features having web-scope. Generated by PowerShell commandlet and formatted as CSV. Includes all feature properties.
Installed Farm Solutions
Listing of all solutions added to the farm and installed to farm web applications. Generated by PowerShell commandlet and formatted as CSV. Includes all solution properties. In this upgrade and migration effort, this report was used in conjunction with the site collection and web feature reports, to definitively associate a feature with an unfamiliar solution, such as when investigating features associated with third-party solutions that need to be removed. Sometimes features do not provide immediately clear associations with their solutions, so, they need to be matched through the solution ID. It provides good background on the overall effort, but does not provide information useful directly to the upgrade effort.
All Webs
Listing of all webs in a site collection. Generated by PowerShell commandlet and formatted as CSV. Includes all web properties. In this migration effort, this report was found useful when needing to quickly determine the number of webs in a site collection and when needing to verify that a particular web had been deleted.
All Lists and Libraries
Listing of all lists and all document libraries in all webs in a site collection, grouped by their parent web. Generated by PowerShell script. As used in this upgrade and migration, this report script is a tweak of the original script developed by SharePointRyan. The modified version provides some additional list/library information, such as number of items. In this upgrade and migration effort, this report was useful in quickly determining which webs contained the Microsoft Project-related lists and document libraries that needed to be deleted. It also provided handy cross-correlation between the missing assembly names found in a Test-SPContentDatabase Upgrade report and the results of a query of the content database's EventReceivers table for those missing assemblies. The query results return HostIDs, which are the IDs of the list or document library that the receiver is attached to. The correlation is like so:
Upgrade report MissingAssembly name <<>> Content Database EventReceivers table query results <<>> All Lists and Libraries Report
Visual Inspections
Listing of solutions at the farm and site collection levels; and listings of features and their status at the farm, web application, site collection and web levels; compiled through direct visual inspection of appropriate settings pages.
Content Database Upgrade Reports
Listing of problems associated with upgrade of the content database, identified as missing dependencies. Generated by executing Test-SPContentDatabase and by executing Mount-SPContentDatabase. Have typically seen these five categories of upgrade problems in this report over the course of performing multiple upgrades: MissingSiteDefinition, MissingFeature, MissingSetupFile, MissingAssembly and MissingWebPart.
Site Collection Upgrade Reports
Listing of problems associated with upgrade of the site collection itself.  These reports are generated by: 1) initiating a site collection upgrade health check or 2) launching a site collection upgrade itself.  The upgrade report results are summarized on a web page that the administrator is navigated to after the health check or site upgrade is completed, and a more detailed report is written to a separate SiteUpgrade report.

Some of these reports required STSADM or PowerShell scripts to be run, and details of these scripts are provided at the end of this posting. The output files of these scripts were saved to a test folder and named in such a way as to show: the number of the test, the test step at which the script was run, the commandlet involved, and the date and time at which the script was run. A timestamp was also included in the filename as sometimes a particular report was executed multiple times in order to verify the results of mitigation steps (e.g., deleting a list and its attached event receivers) and some means was needed to distinguish among the different versions. In addition to these reports we also visually reviewed the Site collection features for the site collection and the Manage site features pages for each of the webs in the site collection in order to identify and document all installed features and their status. After all of these reports had been generated, they were then reviewed and their results collated.

Review Inventory Reports and Collate Results

Overview

The focus of this phase of the upgrade and migration effort was in reviewing the inventory reports generated in the previous phase and then collating their results. The inputs to this phase included all of the various inventory reports, and the outputs of this phase were several lists that collated the information contained in the  inventory reports lists.

Visual Inspection Results

A review of the results of visual inspections found no Microsoft Project 2010 features had farm or web application scope. The only Microsoft Project 2010 features that were found were at the site collection and web scopes. Furthermore, none of the site collection-scope features were found to be activated, and only a few web-scope features were found activated. The results of the visual inspections are shown below:

Feature Name Scope Status Comment
Project Server Approval Content Type Site Collection Not activated
Project Web App Ribbon Site Collection Not activated
Sample Proposal Site Collection Not activated
Project Proposal Workflow Web Mixed Activated for one web
Project Sites Collaboration Lists Web Mixed Activated for a few webs

From the visual inspection of the feature settings, we predicted that there would likely be no Microsoft Project 2010-related feature upgrade problems occurring at the: farm, web application or site collection levels. The results of the visual inspection were confirmed through review of the various feature reports.

Content Database Upgrade Report Results

Next, the upgrade reports generated by Test-SPContentDatabase Upgrade were reviewed to determine which of the various missing dependencies in this report were associated with Microsoft Project 2010. Our focus was primarily on the upgrade report generated for the upgrade from 2010 to 2013 since we intended to resolve these problems at that upgrade level.  Three categories of Microsoft Project-related missing dependencies were found in the report: MissingSiteDefinition, MissingFeature and MissingAssembly. These are collated in the tables below:

MissingSiteDefinition ID LCID Compatibility Level
6215 1033 14

and

MissingFeature ID
7a8b11f4-38b2-402b-ad94-1213e25150ca
448e1394-5e76-44b4-9e1c-169b7a389a1b
525dc00c-0745-47c0-8073-221c2ec22f0f
d8d8df90-7b1f-49c1-b170-6f46a94f8c3c
60d1e34f-0eb3-4e56-9049-85daabfec68c
60d1e34f-0eb3-4e56-9049-85daabfec68c

and

MissingAssembly Name
Microsoft.Office.Project.Server.PWA,Version=14.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c

Other missing feature problems were also noted in the upgrade report, but only those believed to be Microsoft Project 2010-related were noted.

Site Collection Upgrade Report Results

A review of the site collection health check report that was obtained before resolving the missing site definition problem found 3 webs missing a site definition.  Just a reminder: the missing site definition problem was resolved early so as to enable the content database to be upgraded from 2013 to 2016, however, we are now discussing it here so as to present how it was resolved.  The Site Collection Upgrade report didn't indicate whether all of the listed sites shared the same missing definition problem, or whether one or two or more of these sites were missing different site definitions. Reviewing the MissingSiteDefinition entry in the Upgrade report, we noted that

3 Sites in database [SP2010_Content_ORG] have reference(s) to a missing site definition, Id = [6215], Lcid = [1033], compatibility level = [14].

Putting these two results together indicated that 3 different webs (aka "sites") were all experiencing a missing site definition problem involving the same site definition.

Enumerate All Webs Report Results

Review of the Enumerate All Webs Report involved performing various text searches using key information provided in the other reports. For example, searching for the ID of a missing feature listed in the Upgrade report would would result in finding an entry in the Enumerate All Webs Report that looked like the following:

- <Feature Id="7a8b11f4-38b2-402b-ad94-1213e25150ca" Count="1" DisplayName="PWAProposals" InstallPath="C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\Template\Features\PWAProposals" Status="Installed"/>

Just one instance of this particular ID was found in the report.  On the other hand, multiple instances were found in the report for the other feature IDs.  Performing searches for all missing feature IDs and collating the results, obtained the following:

FeatureID FeatureName WebID WebURL
7a8b11f4-38b2-402b-ad94-1213e25150ca PWAProposals 2adad6c6-5b08-4dda-a224-e4f999778f94 /Web1
448e1394-5e76-44b4-9e1c-169b7a389a1b PWSRisks 67096682-44b7-43d5-90e8-7d485abe0985 /
448e1394-5e76-44b4-9e1c-169b7a389a1b PWSRisks f5a6296d-f8f8-45d4-a05b-c486a172873f /Web2/Web22
448e1394-5e76-44b4-9e1c-169b7a389a1b PWSRisks 3f471626-2940-4853-bdce-cb0f49838caf /Web2/Web23
525dc00c-0745-47c0-8073-221c2ec22f0f PWSDocLibs 67096682-44b7-43d5-90e8-7d485abe0985 /
525dc00c-0745-47c0-8073-221c2ec22f0f PWSDocLibs f5a6296d-f8f8-45d4-a05b-c486a172873f /Web2/Web22
525dc00c-0745-47c0-8073-221c2ec22f0f PWSDocLibs 3f471626-2940-4853-bdce-cb0f49838caf /Web2/Web23
d8d8df90-7b1f-49c1-b170-6f46a94f8c3c PWSCommitments 67096682-44b7-43d5-90e8-7d485abe0985 /
d8d8df90-7b1f-49c1-b170-6f46a94f8c3c PWSCommitments f5a6296d-f8f8-45d4-a05b-c486a172873f /Web2/Web22
d8d8df90-7b1f-49c1-b170-6f46a94f8c3c PWSCommitments 3f471626-2940-4853-bdce-cb0f49838caf /Web2/Web23
60d1e34f-0eb3-4e56-9049-85daabfec68c PWSIssues 67096682-44b7-43d5-90e8-7d485abe0985 /
60d1e34f-0eb3-4e56-9049-85daabfec68c PWSIssues f5a6296d-f8f8-45d4-a05b-c486a172873f /Web1/Web11
60d1e34f-0eb3-4e56-9049-85daabfec68c PWSIssues 3f471626-2940-4853-bdce-cb0f49838caf /Web2
90014905-433f-4a06-8a61-fd153a27a2b5 PWS 67096682-44b7-43d5-90e8-7d485abe0985 /
90014905-433f-4a06-8a61-fd153a27a2b5 PWS f5a6296d-f8f8-45d4-a05b-c486a172873f /Web1/Web11
90014905-433f-4a06-8a61-fd153a27a2b5 PWS 3f471626-2940-4853-bdce-cb0f49838caf /Web2

The analysis of the Enumerate All Webs report revealed a repeating pattern of missing features that suggested there were some relationships among these features. For the missing assembly, the Enumerate All Webs report revealed a single instance that occurred in one web:

Assembly Name Web ID Web URL
Microsoft.Office.Project.Server.PWA,Version=14.0.0.0, Culture=neutral,PublicKeyToken=71e9bce111e9429c ca9840ef-dde8-4e65-a915-16e8be1d4c39 /web3

For the missing site definition, searching the Enumerate All Webs report for the missing site definition ID, "6215", found 3 entries in this report. Each entry was similar to the following:

<Web Id="[web id]" TemplateId="6215" TemplateName="PWS#0" LanguageId="1033" Url="/[web url]">

The template name shown in these entries, PWS#0, identified these missing site definition problem as associated with Microsoft Project 2010.

PWS incidentally stands for Project Workspace

Summary

At this point, the scope of the overall problem had been narrowed to the site collection and web levels and found to involve:

  • A single missing site definition used by 3 webs in the site collection;
  • Several missing features used by what seems to be three webs in the site collection; and
  • A single missing assembly used by one or more event receivers attached to either the web or to one or more lists or libraries in the web.

These are the Microsoft Project 2010-related missing dependencies that need to be resolved. 

Analyze Results and Identify Missing Dependencies

Overview

The lists generated in the previous phase provide the starting point for where to look, but there is still some key information needed about these missing Project-related dependencies in order to resolve them, such as:

  • What are the file or files needed to resolve the missing site definition problem and just what does the problem involve
  • What are the actual names of the missing features; how are they manifested in a web or are they hidden; what are the relationships among these missing features; and how can these missing feature problems best be resolved
  • What event receivers are associated with the missing assembly; what lists or libraries are these event receivers attached to; and what is the best way to resolve the missing assembly problem

The methods for obtaining this information are different for each kind of missing dependency. In the next phase of this effort, using the problem listings as a starting point, we use various methods useful in obtaining sufficient information about them, so as to be able to develop and implement plans for resolving them. The inputs to this phase are the collated lists of missing dependencies generated in the previous phase. The outputs of this phase will be: 1) specific key information that augments the information collated previously and 2)  that provide additional and sufficient information to enable them to be resolved. Let's first analyze missing feature dependencies.

Missing Features

The additional information needed for resolving missing feature problems is obtained from several sources, including:

  • SQL queries of the content database AllLists table
  • Inspection of feature definition and feature resource files
  • SharePoint API SPWeb object

The SQL query that needs to be developed must look for all rows in the AllLists table where the Feature ID column equals one of the missing feature IDs listed in the Upgrade report, and the information needed back would be the web ID, the ID of the list and its type (list or library), and the title of the list.  Developing the SQL script, we have:

USE SP2010_Content_ORG
SELECT tp_FeatureID, tp_WebID, tp_ID, tp_Title, tp_BaseType
FROM AllLists WITH (NoLOCK)
WHERE tp_FeatureID IN ('7a8b11f4-38b2-402b-ad94-1213e25150ca', 'd8d8df90-7b1f-49c1-b170-6f46a94f8c3c', 
'525dc00c-0745-47c0-8073-221c2ec22f0f', '448e1394-5e76-44b4-9e1c-169b7a389a1b', '60d1e34f-0eb3-4e56-9049-85daabfec68c',
'90014905-433f-4a06-8a61-fd153a27a2b5')

And executing the SQL query returns something like the following:

tp_FeatureID tp_WebID tp_ID tp_Title tp_BaseType
7a8b11f4-38b2-402b-ad94-1213e25150ca
2adad6c6-5b08-4dda-a224-e4f999778f94 EEA96AFA-1571-4E58-A7E9-29F5B22287F5
Proposal Proxy List 0
d8d8df90-7b1f-49c1-b170-6f46a94f8c3c 67096682-44b7-43d5-90e8-7d485abe0985 4BAAE329-C297-46AE-8367-5AF0FDB39147 Deliverables 0
d8d8df90-7b1f-49c1-b170-6f46a94f8c3c f5a6296d-f8f8-45d4-a05b-c486a172873f B34D60C5-C1C0-47B4-A8E6-FD10AD5FAED7
Deliverables 0
d8d8df90-7b1f-49c1-b170-6f46a94f8c3c 3f471626-2940-4853-bdce-cb0f49838caf 0F990D14-A7A9-4603-8CD1-339104FC73F9
Deliverables
0
525dc00c-0745-47c0-8073-221c2ec22f0f 67096682-44b7-43d5-90e8-7d485abe0985 88B2DCAD-284C-44EB-8459-79C937BED671
Project Documents 1
525dc00c-0745-47c0-8073-221c2ec22f0f f5a6296d-f8f8-45d4-a05b-c486a172873f
7AAF3350-3C98-475F-A617-2B46CD95DC37
Project Documents
1
525dc00c-0745-47c0-8073-221c2ec22f0f 3f471626-2940-4853-bdce-cb0f49838caf A3705270-2D64-4AEB-8D6E-B812C4A939A2
Project Documents
1
448e1394-5e76-44b4-9e1c-169b7a389a1b 67096682-44b7-43d5-90e8-7d485abe0985 F10646C5-8B16-4BBF-9828-E772C6004BBE
Risks 0
448e1394-5e76-44b4-9e1c-169b7a389a1b f5a6296d-f8f8-45d4-a05b-c486a172873f
F8A62F13-4728-4F67-8EB8-087E07391B39
Risks 0
448e1394-5e76-44b4-9e1c-169b7a389a1b 3f471626-2940-4853-bdce-cb0f49838caf 04C43B7D-3B21-49B2-9902-F25A460B3E09
Risks 0
60d1e34f-0eb3-4e56-9049-85daabfec68c
67096682-44b7-43d5-90e8-7d485abe0985 C1EE439D-06AD-44FD-943B-EC7699BB3EB9
Issues 0
60d1e34f-0eb3-4e56-9049-85daabfec68c
f5a6296d-f8f8-45d4-a05b-c486a172873f
9F89C038-C66A-4704-B9FD-BAB75F7EA778
Issues 0
60d1e34f-0eb3-4e56-9049-85daabfec68c
3f471626-2940-4853-bdce-cb0f49838caf
CB3A5A17-BFB2-462C-B7D6-69E692227326
Issues 0
90014905-433f-4a06-8a61-fd153a27a2b5
67096682-44b7-43d5-90e8-7d485abe0985 (nothing)
90014905-433f-4a06-8a61-fd153a27a2b5
f5a6296d-f8f8-45d4-a05b-c486a172873f
(nothing)
90014905-433f-4a06-8a61-fd153a27a2b5
3f471626-2940-4853-bdce-cb0f49838caf
(nothing)

The results of this query enable us to positively identify most of the features and how they are manifested as lists and libraries and even the names of those lists and libraries as seen by users. Going one small step further, we can match the query results with the BaseTypes table,

Value Meaning
0 Generic List
1 Document Library
3 Discussion Board
4 Survey List
5 Issues List

and that enables us to firmly determine what the actual type of each result was. Note that one feature, PWS, was not found associated with any list in the AllLists table. This indicates that the PWS feature is not a list or library but something else. Given that it appears activated each time along with the same set of lists and libraries suggests that it is somehow closely associated with those lists and libraries. To delve into this feature, we can inspect the PWS feature's definition file and also interrogate the SPWeb features property for PWS ActivationDependencies.

The feature.xml file is located in the 14 hive for SharePoint 2010. Using the FeatureName property value found earlier, "PWS", the feature.xml file can be found here:

  • C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\FEATURES\PWS\

Feature folders are named the same as their DisplayName property. Looking into this file, we find that it has four activation dependencies (bolded):

<?xml version="1.0" encoding="UTF-8"?>
<!-- _lcid="1033" _version="14.0.6015" _dal="1" -->
<!-- _LocalBinding -->
-<Feature xmlns="http://schemas.microsoft.com/sharepoint/" DefaultResourceFile="core" Scope="Web" ImageUrl="PwsCollab.gif" Description="$Resources:pws,PWSFeatureDesc;" Title="$Resources:pws,PWSFeatureTitle;" Id="90014905-433F-4a06-8A61-FD153A27A2B5">
-<ActivationDependencies>
<ActivationDependency FeatureId="60D1E34F-0EB3-4E56-9049-85DAABFEC68C"/>
<ActivationDependency FeatureId="448E1394-5E76-44B4-9E1C-169B7A389A1B"/>
<ActivationDependency FeatureId="D8D8DF90-7B1F-49C1-B170-6F46A94F8C3C"/>
<ActivationDependency FeatureId="525DC00C-0745-47C0-8073-221C2EC22F0F"/>
</ActivationDependencies>
</Feature>

These are the same four features found earlier, both in the Enumerate All Webs report and the AllLists query. This result is corroborated by using a single commandlet and some piping to extract the FeatureDependencies of the PWS feature from the parent web::

(Get-SPFeature -Web "https://eli.nist.gov/program/additivemanufac/" | Where {$_.DisplayName -eq "PWS"}).ActivationDependencies | Select FeatureID | Ft -auto

and this returns:

FeatureId
-----------
60d1e34f-0eb3-4e56-9049-85daabfec68c
448e1394-5e76-44b4-9e1c-169b7a389a1b
d8d8df90-7b1f-49c1-b170-6f46a94f8c3c
525dc00c-0745-47c0-8073-221c2ec22f0f

which are the same four features found previously. These results indicate that the PWS feature is dependent on the other four features. The PWS feature is likely the feature that the administrator can directly activate, and activation of this feature by the administrator causes the other four features to be activated, which in turn leads to the creation of the four lists and libraries.

To find the feature's actual title as is appears to the administrator listed on the Manage site features page, we need to inspect the PWS feature's definition file, in the Title parameter. Inspecting this however we find:

Title="$Resources:pws,PWSFeatureTitle;"

which is a pointer to the feature's resource file.  "$Resources" indicates that it is a pointer to a resource file. "pws" indicates the base name of the file (not including its locality and file ending). "PWSFeatureTitle" is the property name in the resource file containing the feature title. Resource files are located in the 14 hive (for SharePoint 2010), in the Resources subdirectory:

C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\Resources\

The file that we need to find will include "pws" in its file name, along with the locality, which in this case is "en-US", or:

pws.en-US.resx

This file can be opened in any text processor to search for the PWSFeatureTitle property and obtain its value.  It can also be found using two lines of PowerShell, like so:

[xml]$xml = Get-Content "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\Resources\pws.en-US.resx"
$xml.selectNodes("//root/data[@name='PWSFeatureTitle']") | select value

which returns:

value
-----
Project Sites Collaboration Lists

and that is the actual name that is seen when navigating to the parent web's Manage site features page.

Removing these missing feature dependencies can be done before upgrade or after.  If done before, the Project Sites Collaboration Lists web-scope feature is deactivated on the three webs identified previously, using either the administrative interface or the SharePoint API.  If done after, the missing dependency associated with this feature will have to be removed using the SharePoint API.  In either case, whether deactivating it before upgrade or removing its dependency after upgrade, the four lists and libraries that are created by the four hidden features that the Project Sites Collaboration Lists feature is dependent on are not removed but persist and must be resolved separately.

tbd

tbd

tbd

We now have sufficient information to develop a resolution plan for resolving the missing Microsoft Project 2010-related features: we know the names, IDs, web locations and how these features are manifested in each web. We also know the relationships among these features. In the next section, we will determine the missing assembly and obtain the information necessary to resolve it.  

Missing Assembly

The missing assembly is associated with one or more event receivers attached to a list or library in a web. The Upgrade report generated by the Test-SPContentDatabase commandlet provides the name of the missing assembly

Microsoft.Office.Project.Server.PWA,Version=14.0.0.0, Culture=neutral,PublicKeyToken=71e9bce111e9429c

but not other information, such as whether the event receiver is associated with a site, a web or a list; or the name of the site, web or list it is associated with. This information can be found from two sources:

  • Enumerate All Webs report
  • Content database EventReceivers and AllLists table queries

The Enumerate All Webs report provided the name. To discover the IDs of the individual event receivers associated with the assembly, and the parent list, web and site collection, we need to first query the content database's EventReceivers tables for all rows where Assembly equals the name of the assembly listed in the Upgrade report, and we need to obtain the IDs of each event receiver and the IDs of the parent site collection and web.  We also need to obtain the ID of the object that is the direct parent of the event receiver and what type of object it is, such as site collection, web or list.  The developed SQL script looks like the following:

USE SP2010_Content_ORG
Select Id, SiteID, WebID, HostType, hostId
FROM EventReceivers (NOLOCK)
WHERE Assembly = 'Microsoft.Office.Project.Server.PWA,Version=14.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c'

Executing that SQL script obtains (leaving the Assembly column out):

ID SiteID WebID HostType HostID
82C35484-B259-4752-B5D5-1F1A9F9F7864
C1A41F57-9B36-4F02-A8DB-1CB6AE2555BF
CA9840EF-DDE8-4E65-A915-16E8BE1D4C39
2 CB98ED59-F7ED-4814-A658-C7A246E65A4A
AC7F3C45-E083-40B0-9932-76965F1A98B5
C1A41F57-9B36-4F02-A8DB-1CB6AE2555BF
CA9840EF-DDE8-4E65-A915-16E8BE1D4C39
2 CB98ED59-F7ED-4814-A658-C7A246E65A4A
1573C3CA-1430-4BEB-B112-AD52200278EB
C1A41F57-9B36-4F02-A8DB-1CB6AE2555BF
CA9840EF-DDE8-4E65-A915-16E8BE1D4C39
2 CB98ED59-F7ED-4814-A658-C7A246E65A4A

Host Type values can be obtained from the following table:

HostTypeValue Scope
0 SPSite
1 SPWeb
2 SPList

From this query, we discovered that there are three event receivers attached to a single list (or library) in a single web.  The ID of the library is provided by the HostID value. We then query the AllLists table to match the list ID to the title of the list.  We need to know the list title in order to accurately identify it in the parent web.  It would also be helpful to know whether the list object is a standard list or library. Using the HostID value, we query the AllLists table to find the row for this HostID. This is the SQL script that needs to be executed:

USE SP2010_Content_ORG
Select tp_ID, tp_Title, tp_BaseType, tp_FeatureId
FROM AllLists (NOLOCK)
WHERE tp_ID = 'CB98ED59-F7ED-4814-A658-C7A246E65A4A'

which obtains

tp_ID tp_Title tp_BaseType tp_FeatureID
CB98ED59-F7ED-4814-A658-C7A246E65A4A
[title of library as shown in Site Contents] 1 00BFEA71-E717-4E80-AA17-D0C71B360101

Using the BaseType table presented earlier, we find that the three event receivers associated with the assembly are in fact all attached to a single document library.

We now have sufficient information for resolving the missing assembly problem. We know the name, ID and web location of the assembly, and we know the IDs of the event receivers associated with the assembly and the name of the document library that the event receivers are attached to. Next, we'll analyze the remaining missing dependency, a missing site definition.

Missing Site Definition

As found previously, the missing site definition involved Microsoft Project 2010 and was named "PWS#0" with ID 6215 in the Upgrade report generated by Test-SPContentDatabase.  "PWS" stands for Project Workspace, and indicates the name of the site definition used to create the site.  "0" here indicates the particular web template configuration that was used to actually to create the localized site. Going back to the production farm, and then looking in the Site Definition Folder on the web front end in this folder

[system drive]\Program Files\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\SiteTemplates\

we found the PWS Site Definition folder:

[system drive]\Program Files\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\SiteTemplates\PWS\

and the PWS site definition's ONET.XML file: 

[system drive]\Program Files\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\SiteTemplates\PWS\XML\ONET.XML

Inspecting the PWS site definition file contents we found a single web template configuration having ID "0".

This name was corroborated by viewing the web page source and searching for these variables

  • g_wsaLCID
  • g_wsaSiteTemplateId

Inspecting source of a page from one of the 3 webs listed previously obtains this value:

g_wsaSiteTemplateId = 'PWS#0'

This value should be the same for this page either on the 2010 production farm or the 2013 development farm, since (for the purposes of this procedure at this phase) the site collection was still running in 14 compatibility mode and therefore site pages still presented this template ID.  This value can also be obtained through the SharePoint API using this PowerShell script:

(Get-SPWeb -Identity "[web url]").WebTemplate & (Get-SPWeb -Identity "[web url]").WebTemplateID

We found the the supplemental PWS web template file in the localized web templates directory,

[system drive]\Program Files\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\1033\XML\

having this file name

webtemppwa.xml

We then went to the SharePoint 2013 development farm to look for the PWS subdirectory and supplemental PWS web template file, but did not find these in either the compatibility 14 hive or the 15 hive.  This then was the basis for the missing site definition problem identified by Test-SPContentDatabase.

Inspecting the contents of the PWS site definition file more closely, we found the PWS feature ID, 90014905-433F-4a06-8A61-FD153A27A2B5, listed in the <WebFeatures> element of the PWS#0 configuration, indicating that the PWS feature is activated when a new Project Workspace site is created.  Furthermore, in this file we found three <View> elements configuring views for these lists:

  • Deliverables
  • Issues
  • Risks

This finding was confidence-building and "closed the loop" so to speak in that it confirmed the relationship between the four lists and libraries and the PWS feature that we surmised previously.  This information, the template name and ID, the site definition folder and supplemental web template file were sufficient for developing a plan for resolving the missing site definition problem.

Summary

At this point, we have obtained sufficient information on the various missing dependencies sufficient for effectively resolving them. In the next phase of this effort, we develop resolution plans for all of them.

Plan for Resolving Missing Dependencies

Overview

In this phase of the overall effort, we developed plans for resolving each of the various missing Microsoft Project 2010-related dependencies identified in the Test-SPContentDatabase Upgrade report, including:

  • MissingSiteDefinition
  • MissingFeature
  • MissingAssembly

Inputs to this phase are the collated lists of missing dependencies and the results of analyses performed in the previous phases. Outputs of this phase will be plans for resolving each category of missing dependency, including the administrative or scripting steps that must be executed.

Plan for Resolving Missing Features

In developing the plan for resolving missing feature dependencies, we had two objectives: 1) to involve the site collection administrator as an active participant and stakeholder in the resolution process  and 2) to accomplish as many resolution tasks before the upgrade and migration.  The site collection administrator has active and current knowledge of site collection content and settings, and this knowledge can help resolution efforts be more effective; additionally, the more resolution tasks that can be accomplished before the site is upgraded and migrated, the more efficient the upgrade and migration process becomes.   With these objectives in mind, our plan for the resolving missing features was as follows:

  1. Before upgrade, develop listing of features needing de-activation and provide to site collection administrator; verify that the features were de-activated using inventory methods.
  2. After upgrade, if any features still need to be deactivated, de-activate them using the SharePoint API.

Plan for Resolving Missing Assembly

The analysis of the missing assembly revealed that it was associated with three event receivers attached to a single document library in a single web.  Two solutions are possible in this case: delete the document library before upgrading using the user interface or remove the three event receivers after upgrading using the SharePoint API.  Given that the document library contain many user documents and that the document library showed active and current usage, the second resolution option was planned for.  This second resolution method would be implemented after upgrade to SharePoint 2013 on the SharePoint 2013 development farm.  Inputs to this task are the results of SQL queries of the target content database's AllLists and EventReceivers tables.  Output are the detailed steps for implementing this solution.

All the necessary information for resolving the missing assembly problem can be found among the results of AllLists and EventReceivers queries, including:

  • SiteID
  • WebID
  • HostID
  • IDs of individual event receivers

The steps then for resolving this problem after upgrade to 2013 are:

  1. Review the results of AllLists and EventReceivers SQL queries for the missing assembly
  2. Identify the necessary values for these data items:
    1. SiteID
    2. WebID
    3. HostID (in this case this will be the document libraryID)
    4. AssemblyID1
    5. AssemblyID2
    6. AssemblyID3
  3. Mount the full backup of the content database to the 2013 development farm.
  4. In an elevated SharePoint Management Shell, execute the following:
    #set the constants
    $siteID = "[site id]"
    $webID = "[web id]
    $hostID = "[host id]"
    $assemblyID1 = "[ID of first event receiver]"
    $assemblyID2 = "[ID of second event receiver]"
    $assemblyID3 = "[ID of third event receiver]"
    $web = Get-SPWeb -Identity $webID -Site $siteID
    #check that you have the right site:
    $web
    $list = $web.lists | ?{$_.id -eq $hostID}
    #check that you have the right library
    #list
    $spEventReceivers = $list.EventReceivers
    #check that it currently has three event receivers:
    $spEventReceivers.ID
    #now delete them
    ($list.EventReceivers | ?{$_.id -eq $assemblyID1}).delete()
    ($list.EventReceivers | ?{$_.id -eq $assemblyID2}).delete()
    ($list.EventReceivers | ?{$_.id -eq $assemblyID3}).delete()
    #then verify that they were deleted:
    $spEventReceivers.ID
    
  5. Dismount the content database
  6. Execute Test-SPContentDatabase to generate another Upgrade report
  7. Review the upgrade report to verify that the MissingAssembly problem no longer appears.

Plan for Resolving MissingSiteDefinition

The analysis of the missing site definition problem revealed that the SharePoint 2013 development farm lacked the PWS site definition subfolder and the supplemental PWS web template file.  The solution then is to add these resources to the 2013 farm before upgrade.  Inputs to this task are copies of the PWS site definition subfolder, the supplemental PWS web template file and the locations in the 14 and 15 hives were these resources need to be copied to.  Output of this task are the detailed steps for implementing this solution

These are the solutions steps that must be performed before upgrading the content database from 2010 to 2013:

  1. On the production 2010 farm WFE, copy these resources (bolded):
  2. C:\Program Files\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\SiteTemplates\PWS\
    C:\\Program Files\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\1033\XML\webtemppwa.xml
  3. Then paste these resources to these locations on the development 2013 farm WFE:
    C:\Program Files\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\SiteTemplates\
    C:\\Program Files\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\1033\XML\
    and
    C:\Program Files\Common Files\Microsoft Shared\web server extensions\15\TEMPLATE\SiteTemplates\
    C:\\Program Files\Common Files\Microsoft Shared\web server extensions\15\TEMPLATE\1033\XML\

Summary

tbd

tbd

Test Resolution Plans

Overview

tbd

MissingFeature

tbd

MissingAssembly

tbd

MissingSiteDefinition

tbd

tbd

tbd

tbd

References

  1. Microsoft Project Server 2010
  2. Microsoft Project Online
  3. Microsoft Project Server 2013
  4. enumallwebs
    1. Stsadm command-line tool (Office SharePoint Server)
    2. enumallwebs (Technet Forum question)
    3. STSADM (Part 3)
    4. Complete reference of all STSADM operations (with parameters) in MOSS 2007 SP1
    5. Stsadm to Microsoft PowerShell mapping in SharePoint Server
    6. Stsadm to Windows PowerShell mapping (SharePoint Foundation 2010)
  5. Get-SPSiteInventory
    1. Get a Web, List and Library Inventory using PowerShell
  6. Features
    1. Find Name of Feature using ID
    2. Activating and Deactivating Features with PowerShell in SharePoint 2010
  7. Web Templates and Site Definitions
    1. Determine Site Template
    2. Site Definitions and Configurations
    3. Deploy templates (SharePoint Foundation 2010)
    4. Deploy templates (SharePoint Server 2010)
    5. Site Definition and Site Template
    6. SharePoint 2010 and web templates
    7. SharePoint project and project item templates
    8. Understanding WebTemp*.xml Files
    9. Understanding Onet.xml Files
    10. Configuration Element (Site)
    11. WebFeatures Element (Site)
  8. Missing Dependencies

Notes

  • tbd
  • tbd
  • tbd

Reports

Enumerate All Webs
CD C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\BIN\
echo ^<?xml version="1.0" encoding="ISO-8859-1"?^> > "EnumAllWebs.xml"
stsadm -o enumallwebs -databasename "SP2010_Content_ORG" -includefeatures -includeeventreceivers -includesetupfiles >> "EnumAllWebs.xml"
Activated Farm Features
Get-SPFeature | Where {$_.Scope -eq "Farm"} | Export-csv -path "Get-SPFeature.Farm.csv"
Activated Web Application Features
Get-SPFeature -WebApplication "[Site URL]" | Export-csv -path "Get-SPFeature.WebApp.csv"
Activated Site Collection Features
Get-SPFeature -Site "[Site URL]" | Export-csv -path "Get-SPFeature.Site.csv"
Activated Web Features
Get-SPSite -Identity "[Site URL]" | Get-SPWeb -Limit ALL |%{ Get-SPFeature -Web $_ } | Export-csv -path "Get-SPFeature.Web.csv"
Installed Farm Solutions
Get-SPSolution | Export-csv -path "Get-SPSolution.Farm.csv"
All Webs
$site = Get-SPSite "[Site URL]";$site.AllWebs | Export-csv -path "AllWebs.csv"
All Lists and Libraries
. C:\Users\[user]\Get-SPSiteInventory.ps1
Get-SPSiteInventory2 -Url "[site URL]" -path "Get-SPSiteInventory.csv"

PowerShell Command Listing

Get-SPSiteInventory Code

function Get-SPSiteInventory {
Param(
[string]$Url,
[string]$path
)
#
# To run it from the prompt, first dot-source it like so:
# ". C:\MyDir\Get-SPSiteInventory.ps1"
# then execute it like any other function.
#
Start-SPAssignment -Global
$site = Get-SPSite $Url
$allWebs = $site.allwebs
Add-Content -Path $path -Value "ParentWebUrl, DefaultViewUrl,Title, BaseType, BaseTemplate, Author, Created, LastModifiedDate, ID, EventReceivers, ItemCount"
foreach ($spweb in $allWebs) {
$allLists = $spweb.Lists
foreach ($splist in $allLists){
$str = $splist.ParentWebUrl + ", " + $splist.DefaultViewUrl + ", " + $splist.Title + ", " + $splist.BaseType + ", " + $splist.BaseTemplate + ", " + $splist.Author + ", " + $splist.Created + ", " + $splist.LastModifiedDate + ", " + $splist.ID + ", " + $splist.EventReceivers + ", " + $splist.items.count
Add-Content -Path $path -Value $str
}
$spweb.dispose()
}
$site.dispose()
Stop-SPAssignment -Global
}