Imports Microsoft.SharePoint
Imports Microsoft.SharePoint.StsAdmin
Imports Microsoft.SharePoint.Administration
Imports System.Text
Imports System.Xml
Imports System.IO
''' <summary>
''' Classe implementing the StsAdm Extension
''' </summary>
''' <remarks></remarks>
Public Class FarmManifest
Implements ISPStsadmCommand
'Private variables
Private ManifestFile As String = String.Empty
Private writer As XmlTextWriter
Private mincludeAll As Boolean = False
Private mincludeSites As Boolean = False
Private mincludeWebs As Boolean = False
Private mincludeLists As Boolean = False
''' <summary>
''' Methode to return the help message
''' </summary>
''' <param name="command"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function GetHelpMessage(ByVal command As String) As String Implements Microsoft.SharePoint.StsAdmin.ISPStsadmCommand.GetHelpMessage
Dim strHelpMsg As String = String.Empty
strHelpMsg = "stsadm -o FarmManifest" + Environment.NewLine
strHelpMsg = strHelpMsg + " -Filename <filename> (required)" + Environment.NewLine
strHelpMsg = strHelpMsg + " [-IncludeAll] (optional) : Include all sites, webs and lists" + Environment.NewLine
strHelpMsg = strHelpMsg + " [-IncludeSites] (optional) : Include only sites" + Environment.NewLine
strHelpMsg = strHelpMsg + " [-IncludeWebs] (optional) : Include webs if IncludeSites" + Environment.NewLine
strHelpMsg = strHelpMsg + " [-IncludeLists] (optional) : Include lists if IncludeSites and IncludeWebs" + Environment.NewLine
Return strHelpMsg
End Function
''' <summary>
''' Method to execute the STSADM command
''' </summary>
''' <param name="command"></param>
''' <param name="keyValues"></param>
''' <param name="output"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function Run(ByVal command As String, ByVal keyValues As System.Collections.Specialized.StringDictionary, ByRef output As String) As Integer Implements Microsoft.SharePoint.StsAdmin.ISPStsadmCommand.Run
'Read the commad entered parameters
If keyValues.ContainsKey("IncludeAll") Then
mincludeAll = True
Else
If keyValues.ContainsKey("IncludeSites") Then
mincludeSites = True
If keyValues.ContainsKey("IncludeWebs") Then
mincludeWebs = True
If keyValues.ContainsKey("IncludeLists") Then
mincludeLists = True
End If
End If
End If
End If
'Using the farm content service
Dim contentService As SPWebService = SPWebService.ContentService
If keyValues.ContainsKey("FileName") And keyValues("FileName") IsNot Nothing Then
Try
' Open a new XML file stream for writing
Dim stream As IO.FileStream
stream = File.OpenWrite(keyValues("FileName"))
writer = New XmlTextWriter(stream, Encoding.UTF8)
' Causes child elements to be indented
writer.Formatting = Formatting.Indented
writer.WriteProcessingInstruction("xml", "version=""1.0"" encoding=""utf-8""")
writer.WriteStartElement("Manifest")
' Web Applications element
writer.WriteStartElement("WebApplications")
writer.WriteAttributeString("Count", contentService.WebApplications.Count.ToString)
Dim webApp As SPWebApplication
For Each webApp In contentService.WebApplications
If Not webApp.IsAdministrationWebApplication Then
writer.WriteStartElement("WebApplication")
writer.WriteAttributeString("ID", webApp.Id.ToString)
writer.WriteAttributeString("Name", webApp.Name)
writer.WriteAttributeString("AppPool", webApp.ApplicationPool.Name)
'Content databases element
writer.WriteStartElement("ContentDataBases")
writer.WriteAttributeString("Count", webApp.ContentDatabases.Count.ToString)
Dim contentDatabases As SPContentDatabaseCollection = webApp.ContentDatabases
Dim database As SPContentDatabase
For Each database In contentDatabases
writer.WriteStartElement("ContentDataBase")
writer.WriteAttributeString("Name", database.Name)
writer.WriteAttributeString("DataBaseServer", database.Server)
writer.WriteAttributeString("SiteCount", database.Sites.Count.ToString)
writer.WriteAttributeString("WarningSiteCount", database.WarningSiteCount.ToString)
writer.WriteAttributeString("MaximumSiteCount", database.MaximumSiteCount.ToString)
writer.WriteEndElement() ' Content DataBase
Next database
writer.WriteEndElement() ' Content DataBases
'Site Collections
If mincludeAll Or mincludeSites Then
writer.WriteStartElement("SiteCollections")
writer.WriteAttributeString("Count", webApp.Sites.Count.ToString)
For Each site As SPSite In webApp.Sites
writer.WriteStartElement("Site")
writer.WriteAttributeString("ID", site.ID.ToString)
writer.WriteAttributeString("Url", site.Url)
writer.WriteAttributeString("OwnerName", site.Owner.Name)
writer.WriteAttributeString("OwnerEmail", site.Owner.Email)
' Webs
If mincludeAll Or mincludeWebs Then
For Each web As SPWeb In site.AllWebs
If web.IsRootWeb Then
'RootWeb
writer.WriteStartElement("RootWeb")
writer.WriteAttributeString("ID", web.ID.ToString)
writer.WriteAttributeString("Url", web.Url)
writer.WriteAttributeString("Title", web.Title)
writer.WriteAttributeString("Template", web.WebTemplate & "#" & web.WebTemplateId.ToString)
writer.WriteStartElement("SubWebs")
writer.WriteAttributeString("Count", web.Webs.Count.ToString)
'Webs
ProcessWebs(web.Webs)
writer.WriteEndElement() 'SubWebs
writer.WriteEndElement() ' RootWeb
End If
web.Dispose()
Next
End If
'Site features
ProcessFeatures(site.Features, "SiteFeatures")
writer.WriteEndElement() ' Site
site.Dispose()
Next site
writer.WriteEndElement() 'Site Collections
End If
'Web App features
ProcessFeatures(webApp.Features, "WebAppFeatures")
writer.WriteEndElement() ' Web Application
End If
Next webApp
writer.WriteEndElement() ' Web Applications
'Solutions
writer.WriteStartElement("Solutions")
writer.WriteAttributeString("Count", SPFarm.Local.Solutions.Count.ToString)
For Each solution As SPSolution In SPFarm.Local.Solutions
writer.WriteStartElement("Solution")
writer.WriteAttributeString("ID", solution.Id.ToString)
writer.WriteAttributeString("Name", solution.Name)
writer.WriteAttributeString("Deployed", solution.Deployed.ToString)
writer.WriteAttributeString("ContainsGlobalAssembly", solution.ContainsGlobalAssembly.ToString)
writer.WriteAttributeString("ContainsCodeAccessSecurityPolicy", solution.ContainsCasPolicy.ToString)
writer.WriteAttributeString("LastOperationResult", solution.LastOperationResult.ToString)
writer.WriteAttributeString("LastOperationTime", solution.LastOperationEndTime.ToString)
writer.WriteEndElement() ' Solution
Next solution
writer.WriteEndElement() ' Farm features
'Features
writer.WriteStartElement("Features")
writer.WriteAttributeString("Count", SPFarm.Local.FeatureDefinitions.Count.ToString)
For Each feature As SPFeatureDefinition In SPFarm.Local.FeatureDefinitions
writer.WriteStartElement("Feature")
writer.WriteAttributeString("ID", feature.Id.ToString)
writer.WriteAttributeString("Name", feature.DisplayName)
writer.WriteAttributeString("Scope", feature.Scope.ToString)
writer.WriteAttributeString("SolutionID", feature.SolutionId.ToString)
writer.WriteEndElement() ' Feature
Next feature
writer.WriteEndElement() ' Farm features
writer.WriteEndElement() ' Manifest
' Flush the writer and close the stream
writer.Flush()
stream.Close()
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
Else
Throw New ArgumentException("FileName parameter is empty")
End If
End Function
''' <summary>
''' 'Recusive method to process webs and sub webs
''' </summary>
''' <param name="webcollection"></param>
''' <remarks></remarks>
Private Sub ProcessWebs(ByVal webcollection As SPWebCollection)
For Each web As SPWeb In webcollection
writer.WriteStartElement("Web")
writer.WriteAttributeString("ID", web.ID.ToString)
writer.WriteAttributeString("Url", web.Url)
writer.WriteAttributeString("Title", web.Title)
writer.WriteAttributeString("Template", web.WebTemplate & "#" & web.WebTemplateId.ToString)
'Web Lists
If mincludeLists Or mincludeAll Then
writer.WriteStartElement("Lists")
writer.WriteAttributeString("Count", web.Lists.Count.ToString)
For Each list As SPList In web.Lists
writer.WriteStartElement("List")
writer.WriteAttributeString("ID", list.ID.ToString)
writer.WriteAttributeString("Title", list.Title)
writer.WriteAttributeString("Author", list.Author.Name)
writer.WriteAttributeString("Template", list.BaseTemplate.ToString)
writer.WriteAttributeString("ItemsCount", list.ItemCount.ToString)
writer.WriteEndElement() ' List
Next
writer.WriteEndElement() 'Lists
End If
'Web features
ProcessFeatures(web.Features, "WebFeatures")
'Sub Webs
ProcessWebs(web.Webs)
writer.WriteEndElement() ' Web
web.Dispose()
Next
End Sub
''' <summary>
''' Processing features
''' </summary>
''' <param name="features"></param>
''' <param name="element"></param>
''' <remarks></remarks>
Private Sub ProcessFeatures(ByVal features As SPFeatureCollection, ByVal element As String)
writer.WriteStartElement(element)
writer.WriteAttributeString("Count", features.Count.ToString)
For Each feature As SPFeature In features
writer.WriteStartElement("Feature")
writer.WriteAttributeString("ID", feature.Definition.Id.ToString)
writer.WriteAttributeString("Name", feature.Definition.DisplayName)
writer.WriteAttributeString("Scope", feature.Definition.Scope.ToString)
writer.WriteAttributeString("SolutionID", feature.Definition.SolutionId.ToString)
writer.WriteEndElement() ' Feature
Next feature
writer.WriteEndElement() 'Features
End Sub
End Class