Introduction
I am involved in a large project which is creating a large number of SharePoint webs. The webs content and configuration are being modified using Features and Feature Upgrades.
We are using PowerShell to process the Feature Upgrades using Chris O’Brien’s excellent SharePoint Feature Upgrade Kit.
One of the issues that we started to see during testing was when looking for Features which are scoped at the Site Collection using the SPWebApplication object’s QueryFeatures(SPFeatureScope, Boolean) function.
The following PowerShell was being used:-
$webapp = Get-SPWebApplication http://dev.itsp.local;
$webapp.QueryFeatures("Site",$true);
When this code was run in SharePoint 2010 Management Console the following error was displayed.
An error occurred while enumerating through a collection: The site with the id f6f2e2bb-46bf-4c46-995e-65055512114e could not be found.. At line:1 char:22 + $webapp.QueryFeatures <<<< ("Site",$true); + CategoryInfo : InvalidOperation: (Microsoft.Share...esultCollection:SPFeatureQueryResultCollection) [], RuntimeException + FullyQualifiedErrorId : BadEnumeration
Investigation
Investigation started by looking at whether this error could be reproduced on other SharePoint environments which it could. Further testing was performed using different SharePoint builds including SharePoint 2010 Service Pack 1 and Cumulative Updates from June 2011 to December 2011.
The cause of the error seems to be when you have a site collection that has been deleted from SharePoint but had a feature that needs to be upgraded.
Looking in the Content Database for the Web Application revealed a entry in the AllSites table which looked like this:-
Reminder: Accessing the SharePoint databases is not supported by Microsoft and should not be performed in a production environment.
The row in the database has a column called Deleted which has a status of 1.
Using the Get-SPSite cmdlet the Site Collection could not be found. However, a colleague reminded me that there is a Get-SPDeletedSite. This returns back site collections that are found in the site collection recycle bin. The command returned a site collections that had been deleted a few weeks ago.
There is a function, Remove-SPDeletedSite but while this removes the site collection so it cannot be accessed via Get-SPDeletedSite, the error still occurs and the record is still found in the Content Database.
The issue seems to be down to the way that the SPWebApplication.QueryFeatures function works and does not filter the site collections which have been deleted and hence the error occurs.
Solution
Currently there is no fix for this issue that I am aware of. However, all is not lost and a workaround was possible by a few additional lines of PowerShell.
$webapp = Get-SPWebApplication http://dev.itsp.local;
$webapp.Sites | ForEach-Object {$queryFeatureResults += $_.QueryFeatures("Site",$true)};
This PowerShell command will enumerate through all the SPSite in the Web Application and call the same function but on each Site Collection. This gets around the problem with the QueryFeature() function finding the deleted site collection.

