Archive

Archive for the ‘Powershell’ Category

SharePoint 2010 – Database is up to date, but some sites are not completely upgraded

August 23, 2011 Leave a comment

In Central Administration, if you visit Upgrade and Patch Management, Review Database Status and notice some DBs have the status ‘Database is up to date, but some sites are not completely upgraded.’ follow the procedure below to rectify.

If you are attempting to upgrade the Admin Content Database then Get-SPContentDatabase will not work, or at least it didn’t for me so refer to the extra steps at the end of this article.

The upgrade status reflects the current state of the database and hence this is not resolved via PSConfig but  rather by PowerShell.  If you need to perform this on a production or any other important environment, make sure you have an agreed maintenance window plus backups before beginning!

  • Using the farm account or equvilently privileged user, start the SharePoint 2010 Management Shell
  • Enter $DB = Get-SPContentDatabase -Identity [ Your Database Name]
  • Now enter Upgrade-SPContentDatabase -id $DB
  • You’ll now be prompted to confirm, just hit enter to accept the default of Yes
  • The upgrade will begin and a percentage complete will be displayed

When the process completes, return to Manage Databases Upgrade Status in Central Admin and the status will not be No action required.

Upgrading the Admin Content Database

As stated at the beginning of this article, Get-SPContentDatabase will not work with the Admin Content Database so another method needs to be found.  As long as you know the DB GUID, you can still execute Upgrade-SPContentDatabase so a simple query of the Config database could be used to find this.  However a better solution is to use Powershell.

The following script iterates though all Content DBs for a given Web Application, so can be used to upgrade the Central Admin Content Database.  You will need to the replace <WA URL> in the script with your Central Administration URL.

$wa = Get-SPWebApplication -Identity "<WA URL>"
foreach($ContentDB in $wa.ContentDatabases)
{
   Upgrade-SPContentDatabase -id $ContentDB
}

Opening .msg e-mails in Outlook from a SharePoint 2010 document library.

August 16, 2011 7 comments

Out of the box, if you attempt to open a .msg file from a document library you’ll notice that IE only offers the choice to save this file or cancel.  This behaviour is caused by SharePoint 2010’s Browser File Handling and is set per Web Application.  There are two options, Strict which specifies that MIME types not listed in “AllowedInlineDownloadedMimeTypes” are forced to be downloaded and Permissive which permits all MIME types to be opened in the browser.

There are two ways to permit SharePoint 2010 to serve .MSG files so they can be opened from the browser.

Option 1:

The first option is a rather brute force approach since it involves changing the default file handling from Strict to Permissive which effectively allows any file types for that on web application level to be opened in the browser and not just .MSG files.  This is achieved by the following procedure:

  • Go to SharePoint 2010 Central Administration > Application Management > Manage Web Applications
  • Select the row of your web application
  • Click General Settings in the ribbon
  • Scroll down to Browser File Handling and select Permissive
  • Click OK
Recycle the Application Pool for the Web Application on each of your web front end servers and you will now be able to open .MSG or .PDFs or any other file type directly in the browsers from a SharePoint document library.

Option 2:

This is my preferred method, it’s more involved but means the Strict browser file handling remains in place.  First of all you need to add the correct MIME type to IIS for .msg files on each of your front end servers as it’s not present out of the box.

  • Start Internet Information Manager
  • Select the server node in the left pane, however this can be done on a per web application basis if required.
  • Open in the MIME Types settings, click add.
  • Enter .msg for file name extension and application/vnd.ms-outlook
IIS 7 Mime setting for .msg files
  • Repeat for all front end servers
Next you need to run the following Powershell in the SharePoint Management Shell on a single server in the farm.  First replace YOUR WEB APPLICATION at the top of the script with the URL of your Web Application.
$webApp = Get-SPWebApplication http://YOUR WEB APPLICATION
If ($webApp.AllowedInlineDownloadedMimeTypes -notcontains "application/vnd.ms-outlook")
{
  $webApp.AllowedInlineDownloadedMimeTypes.Add("application/vnd.ms-outlook")
  $webApp.Update()
  Write-Host "application/vnd.ms-outlook added to AllowedInlineDownloadedMimeTypes"
}

You now need to run IISRESET on each web front-end server for these settings to be applied.

If you’re looking to do the same for PDFs then the MIME type already exists in IIS, so just amend the powershell script for the MIME Type:  ‘application/pdf’

Categories: Powershell, SharePoint

Creating a Site Directory in SharePoint 2010

August 8, 2011 Leave a comment

You may have noticed in General Application Settings within Central Administration there are two links which relate to a Site Directory, however no option to create a site collection or subsite based on the Site Directory template via the GUI.

The template is present in 14\TEMPLATE\1033\XML\WEBTEMPSPS.XML with template name SPSSITES but marked as HIDDEN, hence why it doesn’t appear in the GUI and to be fair, this functionality has been included just for backwards compatibility for upgraded environments.

A few posts around the Internet recommend hacking the XML and changing the Hidden attribute to FALSE.   This is far from ideal and I believe all changes to WEBTEMP*.XML files should be done through the object model especially in a multi-server farm.  Furthermore it’s not required either thanks to PowerShell.

If you need to create a site collection based on the Site Directory template, launch the SharePoint 2010 Management Shell and enter

New-SPSite <URL> -TEMPLATE “SPSSITES#0”

of course replacing the <URL> parameter with the location where you wish the site to be hosted.  You’ll be prompted for an OwnerAlias, enter the account of the primary site collection owner.

The site can also be created as a web underneath an existing site collection, however the Site Collection feature “SharePoint Server Publishing Infrastructure” must be activated.  To create as a web use this command.

New-SPWeb <URL> -TEMPLATE “SPSSITES#0”

That’s it, but if you have already hacked your WEBTEMPSPS.XML and the Site Directory template is not available, then it’s most likely because its visibility depends on the hidden “Portal Layouts Feature” which has the GUID 5F3B0127-2F1D-4cfd-8DD2-85AD1FB00BFC.  This can either activated through the excellent SharePoint Manager or via this PowerShell command.

Enable-SPFeature “PortalLayouts” -Url <Site Collection URL>

If you’re looking to offer better functionality from a Site Directory and you are able to install CodePlex solutions within your organisation, then check out  Site Directory for SharePoint 2010.

Remove SharePoint moderation and approval from publishing sites with powershell

August 4, 2011 2 comments

Publishing approval and moderation are useful features in SharePoint but when you need to build out a site quickly, they can become both tiresome and time consuming.

This script will remove moderation and the approval workflow from all sites in a publishing site collection. I recommend you check-in and approve all pages first, an excellent script which will do this for you can be found here.

$siteUrl = "http://intranet" #UPDATE TO YOUR PUBLISHING SITE URL
$listNames = @("Pages", "Documents", "Images")
$workFlowName = "Page Approval"
$site = Get-SPSite $siteUrl
try
{
	foreach ($web in $site.AllWebs)
	{
		write-host "Site: $web"
		foreach($listName in $listNames)
		{
			$list = $web.Lists[$listName]
			if(!($list -eq $null))
			{
				Write-Host "- Disabling Moderation on" $listName
				$list.EnableModeration = $false
				$list.update()
				$wa = $list.WorkflowAssociations.GetAssociationByName($workFlowName, [System.Globalization.CultureInfo]::CurrentCulture)
				if(!($wa -eq $null))
				{
					Write-Host "- Removing" $wa.Name "from" $listName
					$list.WorkflowAssociations.Remove($wa)
				}
			}
		}
	}
}
finally
{
	$site.Dispose()
}
%d bloggers like this: