Não, não há uma maneira de fazer isso - você precisa codificá-lo. Agora, isso não é um argumento de venda e a ferramenta não está disponível comercialmente ou mesmo comercialmente, mas eu tenho uma ferramenta de análise de conteúdo que eu escrevi que faz o que você pede e muito mais. Basicamente, eu uso a ferramenta para analisar novos farms de clientes e, especialmente, perto de uma migração, para que eu saiba o que mora e saiba os tipos de conteúdo que eles armazenam e como eles são armazenados. De qualquer forma, como exemplo, aqui está um trecho do que você pode fazer:
public XmlDocument CreateAssetLibrary(string siteURL, Delegate callback)
{
//Set up the XML and go get the data
XmlDocument doc = new XmlDocument();
XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", null, null);
doc.AppendChild(dec);
var pi = doc.CreateProcessingInstruction("xml-stylesheet", "type=\"text/xsl\" href=\"contentanalysis.xsl\"");
doc.AppendChild(pi);
using (SPSite siteColl = new SPSite(siteURL))
{
using (SPWeb web = siteColl.OpenWeb())
{
web.AllowUnsafeUpdates = true;
XmlElement sitecollections = doc.CreateElement("sitecollections");
SPWebApplication webApp = web.Site.WebApplication;
totalSites = webApp.Sites.Count;
foreach (SPSite site in webApp.Sites)
{
started = DateTime.Now;
websProcessedThisSite = 0;
totalWebsThisSite = site.AllWebs.Count;
webCount = 0;
listCount = 0;
itemCount = 0;
fileCount = 0;
listItemCount = 0;
userCount = 0;
groupCount = 0;
//initiate the global profile hashtable with a catch all entry for non-file based content (i.e. SPListItems)
globalHash.Clear();
globalHash.Add(nonFileID, new ContentItem(nonFileID, 0, 0));
SPWeb currentWeb = site.OpenWeb();
XmlElement sitecollection = doc.CreateElement("sitecollection");
sitecollection.SetAttribute("sitename", currentWeb.Title);
sitecollection.SetAttribute("link", currentWeb.Url);
XmlElement structure = getXML(currentWeb, doc, callback);
XmlElement profile = getProfile(doc);
XmlElement stats = getStats(doc);
structure.AppendChild(profile);
structure.AppendChild(stats);
sitecollection.AppendChild(structure);
sitecollections.AppendChild(sitecollection);
sitesProcessed++;
callback.DynamicInvoke(new Object[6] { doc.InnerXml, Convert.ToInt32(totalSites), Convert.ToInt32(sitesProcessed), 0, 0, doc });
}
web.AllowUnsafeUpdates = false;
doc.AppendChild(sitecollections);
}
}
return doc;
}
A coisa mais fácil a fazer seria relatar quais SITES ou WEBS estavam usando um recurso / solução. Mais difícil seria por página - você pode estender isso para percorrer cada página da biblioteca e inspecionar os metadados para especificar os recursos que estão sendo usados.