Tuesday, August 27, 2013

Unknown Feature in Site Template

The problem

You are trying to create a site according to some site template, and then you're getting this error:



You have no idea what feature is mentioned, and you want to activate it ASAP.


The solution

This script will work:

$a = (Get-SPFeature | Where-Object { $_.ID -eq "e978b1a6-8de7-49d0-8600-09a250354e14" })
Enable-SPFeature -identity $a.Id -url https://main.yourserver.com/sites/yoursite

Thursday, August 15, 2013

Migrating Publishing Images Libraries

The problem:

A team site was migrated from SharePoint 2007 to SharePoint 2010 using the Metalogix Content Matrix tool. After the migration, one of the users discovered that every image in the Images library is checked out by the farm administrator and not visible.

Attempting to remigrate the problem libraries resulted in an error, "One or more field types are not installed properly. Go to the list settings page to delete these fields."

The solution:

First of all, let's clarify what the Images library is. It is NOT a picture library; rather, it is a document library that is created by the Publishing site feature when this feature is activated. Also, it is usually not a good idea to use the Images library for storing your own images - see this link, http://social.technet.microsoft.com/Forums/sharepoint/en-US/7713e6b9-bf0e-418f-a857-960890839d81/what-is-the-difference-between-a-sharepoint-publishing-images-folder-and-a-picture-library .

Second, this library (just like other libraries created by the Publishing feature, such as Pages) supports item scheduling. If the versioning settings are configured so that both major and minor versions are created, and the submitted items require content approval, you can enable scheduling for the library by going to the "Manage Item Scheduling" link of the list settings and checking the "Enable scheduling of items in this list" checkbox. This adds two new columns to the library, "Scheduling Start Date" and "Scheduling End Date," of the types "Publishing Schedule Start Date" and "Publishing Schedule End Date," respectively.

The problem is that when you migrate such a library using the Metalogix Content Matrix tool, the scheduling of the library does not seem to migrate correctly. Therefore, in the SharePoint 2010 environment we need to carry out some additional steps. Here is what worked for us:

1) If the Publishing feature is not enabled on the SharePoint 2010 environment, delete the Images library.
2) Activate the Publishing feature. This will re-create the Images library. Note that this library is much richer in SharePoint 2010 than in SharePoint 2007, as it supports content types such as Audio and Video.
3) In the new Images library, make sure that the versioning settings are configured correctly (i.e., both major and minor versions are created, and all submitted items require content approval.)
4) Enable item scheduling for the Images library.
5) Re-migrate the images from the SharePoint 2007 Images library to the SharePoint 2010 Images library. Make sure you only migrate the items, not the list itself.

Thursday, August 8, 2013

Migrating a Multiterabyte Site Collection

The problem

A certain site collection grew too large (8TB, while the Microsoft-recommended limit is 100 GB), and it needs to be migrated to a SharePoint 2010 environment and split into many smaller site collections.

The solution

In this presentation, I show the approach my company (Exostar) took to solve this problem. The main idea is to use a third-party product (we recommend Metalogix) and to write automated scripts to be run in parallel.

Wednesday, August 7, 2013

Migration and Task Forms

The problem

We migrated a SharePoint 2007 site collection to SharePoint 2010, using the database attach method. This site collection contains a custom workflow with multiple task forms. After the migration, we found that one of the fields in the completed task forms is blank, even though it was a mandatory field that was indeed completed before the migration.

The solution

First of all, we needed to make sure that the data was there. The completed task form data is stored in the task's ExtendedProperty. So, we ran this script and made sure that the correct attribute was there:



cls

$tasks = $w.Lists["Tasks"]
$iscs  = $tasks.Items | Where-Object { $_.Title -eq "Some task on Some List Item."}
$iscs | % {
Write-Host " "
$_.Title
$_["ExtendedProperties"]
}

After we found that the data was stored correctly, the next task was to make sure that the InfoPath form was displaying this field correctly. Unfortunately, the InfoPath 2010 form had some problems with this field and would not display its value, even though the task's ItemMetadata.xml was perfectly correct.

The solution involved renaming the field in the InfoPath form, and then changing the migrated data so that the field is mentioned by its new name. Here is the PowerShell script that does the trick.

cls

$site = Get-SPSite "
https://main.myveryownsite.com/sites/somesite"

$webs = $site.AllWebs | Where-Object { $_.IsRootWeb -ne $true -and $_.WebTemplate.StartsWith("STS")} 

foreach ($web in $webs)
{
    $web.AllowUnsafeUpdates = $true

    Write-Host "Processing " $web.Url ", web template:" $web.WebTemplate
   
    $web.Lists | Where-Object { $_.BaseTemplate -eq [Microsoft.SharePoint.SPListTemplateType]::Tasks -and $_.Fields.ContainsField("ExtendedProperties") }  | % {
        Write-Host "  Task list" $_.Title " in web " $_.ParentWebUrl " contains ExtendedProperties - investigating..."
  
        $listItems = $_.Items
  
        $listItems | % {
       
                try
                {
                    $itemEP = $_["ExtendedProperties"]
             
                    if ($itemEP -ne $null -and $itemEP.Contains("ows_AuthoritiesComments"))
                    {
                        if ($_.Title.StartsWith("ISC Chairperson task on"))
                        {
                            $itemEP = $itemEP.Replace("ows_OldFieldName", "ows_NewFieldName");
                                                                                      
                            $_["ExtendedProperties"] = $itemEP
                  
                            Write-Host "      Trying to update " $_.Title " extended properties"
                            $_.SystemUpdate($false)
                            Write-Host "      Finished updating " $_.Title " extended properties"
                        }
                    }
                }
                catch [Exception] {
                        Write-Error $_.Exception.ToString()
                    }
            }
        }
        $web.AllowUnsafeUpdates = $false
        $web.Dispose()
}

Worked like a charm!