SharePoint 2013 Product Line Architecture

 

There is a relatively new term being used by Microsoft Consulting Services, the Microsoft Product Line Architecture, or to give it its short name, PLA. If you haven’t heard of it by now, you certainly will in the coming months. This two part blog will present some of the things you can expect to hear about in the near future, especially if you engage directly with Microsoft.

What is the SharePoint 2013 Product Line Architecture?

Available from March 2013, the Product Line Architecture is the culmination of years of Microsoft Consulting Services project deliveries, Microsoft Premier Support expertise and feedback from the Exchange, Lync and SharePoint Product Groups, fused into a prescribed set of rules and models. The end goal being, a product deployment that ensures a predictable and high quality implementation that offers supportability, availability, capacity and workload portability.

Ok, enough with the marketing speak, let’s cut to the chase. By implementing your shiny new on-premise SharePoint 2013 farm as per the prescribed set of rules and models laid down, you are basically ensuring your implementation is cloud compatible. Client motivations for moving to cloud computing have changed considerably and with one eye on the future, its Microsoft’s way of ensuring that the almost inevitable migration of your Exchange, Lync and SharePoint implementation to the cloud will be as straightforward as possible.

If nothing else, my years of working with SharePoint have taught me one thing, SharePoint farms are like fingerprints. You will rarely, if ever find an identical SharePoint farm. The variations in guidance when architecting, planning & designing SharePoint environments and the near infinite number of configuration options has resulted in almost limitless variations of the SharePoint farm. In SharePoint 2010 we had the Service farm and Collaboration farm. With SharePoint 2013 and the PLA we go back to Services and Content in a single farm, just one of the changes implementers of the PLA can expect. 

The capability of network providers to offer high speed internet access, virtually anywhere, has made the cloud a viable proposition for business use as well as consumer adoption. Its no longer, "The cloud is the future".The future is already here. Clearly, Microsoft had to address the multiplicity if for no other reason than to simplify your businesses eventual move to cloud.

So the PLA is a good idea, right?

No more ambiguity. We get standardisation, commonality & greatly reduced complexity. Essentially, everybody sings from the same song sheet. The Manager in me says this is something SharePoint implementations have been crying out for, for some time. The Architect in me says, damn, they just took a sizeable slice of the fun out of my job.

How does the PLA work?

From a Microsoft perspective they would prefer your shiny new SharePoint 2013 deployment to be a SharePoint Online deployment. If that’s not feasible then a PLA deployment is the recommended alternative. Finally, if the PLA service description and design does not meet current business requirements then where possible Microsoft will encourage customers to leverage as much of the PLA guidance as is viable in a custom implementation. Basically, Microsoft will prescribe a service description, a set of service level objectives, a set of functional specifications, an operational plan & test plan. You are then required to implement them as stipulated.

What features does a PLA compliant SharePoint 2013 implementation provide?

Having decided to adopt the PLA there are some features that will NOT be available. These features are highlighted below in red

 

What is the PLA ruleset?

The PLA ruleset is a collection, or set of rules with specific requirements for the infrastructure and supporting technologies, i.e. Virtualization, Topology, Directory Services, Network, etc. In short, it is the complete description of the required infrastructure, configuration and settings to deploy a PLA complaint SharePoint farm. Rules are split into two categories, required and recommended. SharePoint 2013 implementations not adhering to the PLA ruleset are not considered PLA compliant. The idea being that a PLA compliant SharePoint 2013 implementation ensures that the farm will perform in an anticipated manner. Whilst required rules must be adhered to they may still be deviated from based on specific customer requirements.

In all honesty, if you apply the SharePoint best practices and adhere to Microsoft recommendations in your current environment then the vast majority of rules will already be known to you, whilst the majority of remaining rules apply to the new features available in SharePoint 2013 for example: “Do not use SharePoint resource management in place of a load balancer”.

In Summary

So there you have it. A brief introduction to the new Microsoft Production Line Architecture. Undoubtedly, the PLA provides implementers with clear guidance on how best to deploy their new SharePoint 2013 farm and this has been lacking to some degree in previous versions. I for one welcome this. From a business perspective the adoption of the PLA should hopefully realise financial benefits from minimising failures and downtime and a reduction in deployment costs and administrative overhead.

However, if I wanted to be cynical, I would say this is part of Microsoft’s grand plan to make your businesses transition from on-premise to cloud as smooth as possible and leverage this when the technology refresh discussions start and the inevitable cloud deliberations begin again.

In my next post I will elaborate on the ruleset and what will be expected of you in order to attain PLA compliance.

 

UPDATE: For more information take a look at the new Microsoft Product Line Architecture (PLA) Team Blog: http://blogs.technet.com/b/pla/archive/2013/04/09/introducing-the-microsoft-product-line-architecture.aspx

KB2756920 & Security Token Service Errors

 

If you are running SharePoint 2010 on Windows Server 2008 R2 RTM server(s), installing MS13-004 KB2756920 will result in errors with the Security Token Service. The error manifests itself with one of the following errors: 

Possible Error:
 
An exception occurred when trying to issue security token: The requested service, ‘http://localhost:32843/SecurityTokenServiceApplication/securitytoken.svc/actas’ could not be activated. See the server’s diagnostic trace logs for more information.

Possible Error:
 
Method Not found: "System.String System.ServiceModel.Activation.Iis7Helper.ExtendedProtectionDotlessSpnNotEnabledThrowHelper(System.Object)"

By simple process of elimination I was able to determine which was the offending patch by comparing the patches applied to the affected servers and then unaffected servers. This in turn highlighted a disparity between the operating systems.

Essentially, our FAST servers were Windows Server 2008 R2 RTM and our SharePoint servers were Windows Server 2008 R2 SP1. The upshot of this was that during the delivery of the latest round of patches MS13-004 KB2756921 was applied to the servers running Windows Server 2008 R2 SP1 and MS13-004 KB2756920 to those servers running Windows Server 2008 R2 RTM.

A quick search on Windows Server 2008 R2 RTM and KB2756920 returned the following KB article: KB2801728 - WCF services that are hosted on IIS on Windows 7 or Windows Server 2008 R2 may receive an exception error message after you install an update for the .NET Framework 3.5 SP1 for WCF.

Possible Resolution:

There are a number of remedial steps that can be undertaken to resolve the issue that results. These are:

Option 1:

  1. Leave KB2756920 installed
  2. Apply hotfix KB2637518

Option 2:

  1. Remove KB2756920
  2. Install Windows Server 2008 R2 SP1
  3. Install KB2756921

Option 3:

  1. Remove KB2756920

  Note: This will leave the vulnerability the application of this patch was intended to resolve.

References:

  • KB2756920 - http://support.microsoft.com/kb/2756920 - MS13-004: Description of the security update for the .NET Framework 3.5.1 on Windows 7 and Windows Server 2008 R2: January 8, 2013 
  • KB2756921 - http://support.microsoft.com/kb/2756921 - MS13-004: Description of the security update for the .NET Framework 3.5.1 on Windows 7 Service Pack 1 and Windows Server 2008 R2 Service Pack 1: January 8, 2013
  • Windows Server 2008 R2 SP1 - http://support.microsoft.com/kb/976932 - Information about Service Pack 1 for Windows 7 and for Windows Server 2008 R2
  • KB2637518 - http://support.microsoft.com/kb/2637518 - WCF services that are hosted on IIS on Windows 7 or Windows Server 2008 R2 may receive an exception error message after you install an update for the .NET Framework 3.5 SP1 for WCF

 

 

A text field contains invalid data.

 

A lot of my PowerShell scripts involve writing to a SharePoint list to store information. One particular script was throwing me an error on execution. The exact error being:

Invalid text value. A text field contains invalid data. Please check the value and try again.

This error typically occurs when the value supplied for a text field is exceeds 255 characters. To correct this problem, simply change the field type from text to note. Text being a Single line of text and Note a Multiple lines of text column field type.

See below for an example:

Change Text

# Add fields - Site Owner (Primary)
$list.Fields.Add($siteAdministratorsColumn,"Text",$false)

to Note

# Add fields - Site Owner (Primary)
$list.Fields.Add($siteAdministratorsColumn,"Note",$false)

Hope this helps.

Unable to Display This Web Part.

 

I am currently working with a team of developers as part of a Lotus Notes migration to SharePoint. Whilst this particular issue has been around a while, we only encountered it recently as part of the migration. Following one of the weekly releases, developers reported an issue where they would randomly be presented with the following error messsage by one of the web parts on the page:

Unable to display this Web Part. To troubleshoot the problem, open this Web page in a Microsoft SharePoint Foundation-compatible HTML editor such as Microsoft SharePoint Designer. If the problem persists, contact your Web server administrator.

On checking the resulting correlation ID, I was presented with the following:

Error while executing web part: System.StackOverflowException: Operation caused a stack overflow.

The root cause?

In June 2011 Cumulative Update for SharePoint 2010 code was added to the DataFormWebPart (which is used to display list data) that if an XSLT transform took longer than 5 seconds, a StackOverflowException was thrown. This was done to avoid a potential Denial Of Service attack on SharePoint if crafted XML could be sent that would continually clog up the XSLT, thereby stopping pages from rendering.

As a result, with the release of August 2011 Cumulative Update for SharePoint 2010 XsltTransformTimeOut had been lowered to 1. In many cases the timeout threshold was insufficient and what resulted was the error shown above. Microsoft have published a KB article related to this particular issue. http://support.microsoft.com/kb/2639184

A later patch, February 2012 Cumulative Update for SharePoint 2010 provided a workaround for those experiencing this issue which allowed the farm administrators to configure this timeout threshold and indeed, increase the timeout threshold if required. To do this you should execute the following:

$farm = Get-SPFarm
$farm.XSLTTransformTimeout = 5
$farm.Update()

This should correct the issue for anyone experiencing this.

Confirm your change.

To confirm your change has been applied enter the following:

$farm = Get-SPFarm
$farm.XSLTTransformTimeout

The next thing to do is having, implemented this is to go back to your developers and show them the KB article shown above and implement the recommended options.

Hope this helps.

 

Backing up ULS trace log files

 

Another useful script to add to your SharePoint administrators toolbag. Using the Merge-SPLogfile cmdlet, this script combines trace (diagnostic) log entries from all farm computers into a single log file to a specified location. The script returns records from Unified Logging Service (ULS) trace log files on each farm server and writes the results to a new log file on the local computer. If no merged logfile exist, one is created merging the last 60 minutes logs (with no filtering). This then becomes the "start point" for subsequent backups. Scheduled to run periodically these merged logs provide a useful reference to aid troubleshooting/investigation in the event of a failure.

<#
.SYNOPSIS
	Combines trace (diagnostic) log entries from all farm computers into a single log file.

 .DESCRIPTION 
	Using the Merge-SPLogfile cmdlet, this script combines trace (diagnostic) log entries from all farm computers into a single log
	file to a specified location. The script returns records from Unified Logging Service (ULS) trace log files on each farm server 
	and writes the results to a new log file on the local computer. If no merged logfile exist, one is created merging the last 60 
	minutes logs (with no filtering). This then becomes the "start point" for subsequent backups.
 
	Subsequent backups are filtered by using the StartTime and EndTime parameters to optimise performance of the script. The StartTime 
	is the last log entry in the preceding log backup. The EndTime is the date & time of script execution.

	To mitigate the potential for overload the log level filter can be set. These filter options are: Unexpected, Monitorable, High, 
	Medium, Verbose and VerboseEx.  
 
.LINKS  
	http://technet.microsoft.com/en-us/library/ff607721.asp

.NOTES  
	File Name 	- Backup-ULSLogs.ps1  
	Author    	- Darren Marsden   
	Blog		- http://www.darrenmarsden.com
	Requires  	- PowerShell v2.0 or higher

.EXAMPLE
	PowerShell -noprofile ".\Backup-ULSLogs.ps1"
	
	Script can be scheduled to run as a scheduled task to run at specified intervals.

#>

<#

DISCLAIMER: This script should be thoroughly tested before use in a Production environment. You have a royalty-free right to use,  
modify, reproduce, and distribute this script file in any way you find useful, provided that you agree that the creator, owner    
above has no warranty, obligations, or liability for such use. 

#>

Clear-Host

#Region Setup Paths

	# Check if the execution policy is set to Unrestricted   
	try
	{	
	    $policy = Get-ExecutionPolicy   

	    if($policy -ne "Unrestricted")
	    {   
	        Set-ExecutionPolicy "Unrestricted" 
	    } 
	}
	catch
	{
	    $errText = $error[0].Exception.Message
	    Write-Host -ForegroundColor Red "A problem occurred whilst attempting to set the the Execution Policy. Reason: $errText"
	}
	
	#Get the path that this script is running in	
	$scriptRoot = Split-Path (Resolve-Path $myInvocation.MyCommand.Path)		

	# To mitigate the potential for overload consider setting the log level filter. 
	# Options are: Unexpected, Monitorable, High, Medium, Verbose and VerboseEx
	
	$GLOBAL:logLevel = "Default" # Default log level means no filtering of entries
	
	# Set path to log backups directory
	$GLOBAL:logsBackup = Join-Path $scriptRoot "\Merged Logs" 

	if (!(Test-Path $logsBackup))
    {
		Create-Folder $logsBackup
	}
	
#EndRegion

#Region Create folder/directory
function Create-Folder
{
	param ([String]$folder)
	
	try 
	{
		New-Item $folder -type Directory -ErrorAction SilentlyContinue -Verbose
		Write-Host -ForegroundColor Green "Folder $folder successfully created.`r" 
	} 
	catch 
	{ 
		$errText = $error[0].Exception.Message
		Write-Host -ForegroundColor Red "A fatal error occured whilst attempting to create the folder $folder. Reason: $errText.`r"
		Exit
	}
}
#EndRegion

#Region Convert DateTime to same format as System Locale (required when farm local is different to system locale)
function Convert-DateTime
{
	param ([string]$date)

	# Get Farm Locale (Language/Regional Settings)
	$Locale = [Microsoft.SharePoint.SPRegionalSettings]::GlobalServerLanguage
	# Get CultureInfo for parsing date
	$Culture = [System.Globalization.CultureInfo]::GetCultureInfo($Locale.LCID)

    $dateOut = [DateTime]::Parse($date, $Culture)
    
	return $dateOut
}
#EndRegion

#Region Backup ULS logs (all servers) from last time ULS logs were backed up to present time. 
function Backup-ULSLogs
{	
	$hasErrors = $false
	
	# Get previously archived logfile(s), sort them and select the last one
	$logFile = Get-ChildItem $logsBackup\*.* | Sort-Object -property LastWriteTime | Select-Object -Last 1
		
	if ($logFile -ne $null)   
	{
		try
		{
			$lastLogEntry = Get-Content $logFile | Select-Object -Last 1 
			$lastLogEntryTime = $lastLogEntry.Substring(0,19) 

			$startTime = $(Convert-DateTime $lastLogEntryTime)
			$endTime = $(Convert-DateTime (Get-Date))
			
			# To mitigate the potential for overload consider setting the log level filter.
			# Options are: Unexpected, Monitorable, High, Medium, Verbose and VerboseEx
			
			if ($logLevel -eq "Default")
			{
				Write-Host -ForegroundColor Green "Performing merge of ULS log(s) from all servers in farm from [$($startTime)] until [$($endTime)]. More Info: http://technet.microsoft.com/en-us/library/ff607721.asp"		
				Merge-SPLogFile –Path $logsBackup\MergedLog-$(Get-Date -Format ddMMyyyyHHmmss).log –StartTime $startTime –EndTime $endTime -ErrorAction Stop
			}
			else
			{
				Write-Host -ForegroundColor Green "Performing merge of ULS log(s) from all servers in farm from [$($startTime)] until  [$($endTime)]. Filter level $logLevel or higher. More Info: http://technet.microsoft.com/en-us/library/ff607721.asp"		
				Merge-SPLogFile –Path $logsBackup\MergedLog-$(Get-Date -Format ddMMyyyyHHmmss).log -Level $logLevel –StartTime $startTime –EndTime $endTime -ErrorAction Stop			
			}
		}
		catch
		{
			$errText = $error[0].Exception.Message
			Write-Host -ForegroundColor Red "Merge of ULS log(s) failed. Reason: $errText"
			$hasErrors = $true
		}
	}  
	else
	{
		try
		{
			Write-Host -ForegroundColor Green "Performing merge of ULS log(s) from all servers in farm. Merging the last 60 minutes logs (with no filtering)." 
			# Merges the last hour of log data from all farm computers with no filtering.
		    Merge-SPLogFile –Path $logsBackup\MergedLog-$(Get-Date -Format ddMMyyyyHHmmss).log -ErrorAction Stop
		} 
		catch 
		{
			$errText = $error[0].Exception.Message
			Write-Host -ForegroundColor Red  "Merge of ULS log(s) failed. Reason: $errText"
			$hasErrors = $true
		}
	}
	
	if($hasErrors -ne $true)
	{
 		Write-Host -ForegroundColor Green "Merge of ULS log(s) successfully completed."
	}
}
#EndRegion

#Region MAIN

	Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue
	Backup-ULSLogs
	Remove-PsSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue

#EndRegion

Task Scheduler error 2147944309

 

I was configuring a scheduled task and had made a small typographical error whilst creating it. Being the perfectionist that I am I decided to edit the task, however when trying to save the task I was returned an error: An error has occured for task <Name of Task>. Error message: The following error was reported: 214794430

Of course, the first task is to decipher what a 214794430 error is, which is in actual fact relatively straight forward. Casting my mind back to my NT4.0 days I seem to recall there was a utility called Translate that would do the translation. What I aim to demonstrate here is the way I decipher what the error code being returned actually means.

Translating Windows Error Codes.

So how exactly do you translate 2147944309 into a user-friendly text message?

To begin with, an error prefixed with 0n identifies the number as DECIMAL. Similarly, a number prefixed with 0x is HEXIDECIMAL.

  1. Click Start > Run and in the resulting field type: calc
  2. Once calculator (calc.exe) has opened, change to Programmer mode by selecting click View > Programmer.
  3. Click on Dec and enter 2147944309.
  4. Clicking on Hex will convert it from decimal to hexidecimal resulting with 80070775 being displayed.
  5. 8007 is the part of the code identifies it as a Win32 status code and 0775 the last 4 digit are the error code.
  6. Ensuring Hex is selected enter the last four numbers, 0775 and click on Dec to convert to decimal.
  7. The resulting number is 1909.
  8. Now, open a command prompt (cmd.exe) and type the following command: "net helpmsg" followed by the decimal number that appears in the calculator. In this case, the command would be: "net helpmsg 1909".
  9. You will then be returned what is hopefully a more friendly version of the error message. In this case The referenced account is currently locked out and may not be logged on to.

There are of course some caveats that you need to be aware of. These are:

  1. This process will only work for Win32 error codes that originate from Microsoft Windows.
  2. The codes will often start with 8007 but not always. 
  3. If the net helpmsg command does not return a result it most likely means that the error either did not originate from Windows, or is not a valid Win32 process.

 

References: http://technet.microsoft.com/en-us/library/bb490705.aspx

 

Determining SharePoint Products (Updated)

 

UPDATED:To include SharePoint 2013 products.

There are a couple of ways of determining which version of SharePoint and associated products are installed, the registry or by the SharePoint PowerShell Management Console. The need to determine which version of SharePoint is installed was probably more prevalent in the earlier days of SharePoint 2010 when determining upgrade paths or upgrading from the trial to full version of SharePoint.

I however needed to determine the version of SharePoint 2010 installed as part of the continued development of my SharePoint farm backup script. In order to exclude MySites from being backed up I first needed to determine the MySite Host. One of the SharePoint Foundation 2010 limitations is the exclusion of MySite functionality and so attempting to determine the MySite Host when executed on SharePoint Foundation 2010 would result in a failure.

The MySite Host check required that I determine the version of SharePoint installed and subsequently execute the check having determined the installed version was SharePoint 2010 Enterprise/Standard or bypass the check having determined it was SharePoint Foundation 2010 installed.

Determining version of SharePoint 2010 via Registry:

  1. Log onto the server hosting SharePoint Central Administration.
  2. Open the Registry Editor. Click Start > Run > type: Regedit
  3. Navigate to: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\14.0\WSS\InstalledProducts (SharePoint 2010)
    or
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\15.0\WSS\InstalledProducts (SharePoint 2013)
  4. The installed product codes are listed in the InstalledProducts key.

Determining version of SharePoint 2010 via PowerShell:

The second method of determining the installed products is via PowerShell incorporating the Get-SPFarm SharePoint cmdlet. More Info: http://technet.microsoft.com/en-us/library/ff607966.aspx


# Based on: 

# http://msdn.microsoft.com/en-us/library/ff721969.aspx (SharePoint 2013)
# http://msdn.microsoft.com/en-us/library/ff721969.aspx (SharePoint 2010) 

Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue 

Clear-Host

#Region Determine which SharePoint products are isntalled. 
function Get-SharePointProducts
{
    # Note: Standard &  Enterprise installations return the Foundation SKU as well as the Enterprise SKU or Standard SKU.
    
	try 
	{ 
		$products = (Get-SPFarm -ErrorAction Stop).Products
		$version = (Get-SPFarm -ErrorAction Stop).BuildVersion.Major

		If ($version -eq "14") 
		{ 
            switch ($products)
			{
				"BEED1F75-C398-4447-AEF1-E66E1F0DF91E"
				{
					Write-Host -ForegroundColor Blue "Product Code: BEED1F75-C398-4447-AEF1-E66E1F0DF91E" "SKU: SharePoint Foundation 2010"
				} 
				"1328E89E-7EC8-4F7E-809E-7E945796E511"
				{
					Write-Host -ForegroundColor Blue "Product Code: 1328E89E-7EC8-4F7E-809E-7E945796E511" "SKU: Search Server Express 2010"
				}
				"B2C0B444-3914-4ACB-A0B8-7CF50A8F7AA0"
				{
					Write-Host -ForegroundColor Blue "Product Code: B2C0B444-3914-4ACB-A0B8-7CF50A8F7AA0" "SKU: SharePoint Server 2010 Standard (Trial)"
				}
				"3FDFBCC8-B3E4-4482-91FA-122C6432805C"
				{
					Write-Host -ForegroundColor Blue "Product Code: 3FDFBCC8-B3E4-4482-91FA-122C6432805C" "SKU: SharePoint Server 2010 Standard"
				}
				"88BED06D-8C6B-4E62-AB01-546D6005FE97"
				{
					Write-Host -ForegroundColor Blue "Product Code: 88BED06D-8C6B-4E62-AB01-546D6005FE97" "SKU: SharePoint Server 2010 Enterprise (Trial)"
				}
				"D5595F62-449B-4061-B0B2-0CBAD410BB51"
				{
					Write-Host -ForegroundColor Blue "Product Code: D5595F62-449B-4061-B0B2-0CBAD410BB51" "SKU: SharePoint Server 2010 Enterprise"
				}
				"BC4C1C97-9013-4033-A0DD-9DC9E6D6C887"
				{
					Write-Host -ForegroundColor Blue "Product Code: BC4C1C97-9013-4033-A0DD-9DC9E6D6C887" "SKU: Search Server 2010 (Trial)"
				}
				"S08460AA2-A176-442C-BDCA-26928704D80B"
				{
					Write-Host -ForegroundColor Blue "Product Code: S08460AA2-A176-442C-BDCA-26928704D80B" "SKU: Search Server 2010"
				}
				"84902853-59F6-4B20-BC7C-DE4F419FEFAD"
				{
					Write-Host -ForegroundColor Blue "Product Code: 84902853-59F6-4B20-BC7C-DE4F419FEFAD" "SKU: Project Server 2010 (Trial)"
				}
				"ED21638F-97FF-4A65-AD9B-6889B93065E2"
				{
					Write-Host -ForegroundColor Blue "Product Code: ED21638F-97FF-4A65-AD9B-6889B93065E2" "SKU: Project Server 2010"
				}
				"926E4E17-087B-47D1-8BD7-91A394BC6196"
				{
					Write-Host -ForegroundColor Blue "Product Code: 926E4E17-087B-47D1-8BD7-91A394BC6196" "SKU: Office Web Companions 2010"
				}
			}
		} 
		elseif ($version -eq "15") 
		{ 
			switch ($products)
			{		
				"35466B1A-B17B-4DFB-A703-F74E2A1F5F5E"
				{
					Write-Host -ForegroundColor Blue "Product Code: 35466B1A-B17B-4DFB-A703-F74E2A1F5F5E" "SKU: Project Server 2013"
				}
				"BC7BAF08-4D97-462C-8411-341052402E71"
				{
					Write-Host -ForegroundColor Blue "Product Code: BC7BAF08-4D97-462C-8411-341052402E71" "SKU: Project Server 2013 Preview"
				}
				"C5D855EE-F32B-4A1C-97A8-F0A28CE02F9C"
				{
					Write-Host -ForegroundColor Blue "Product Code: C5D855EE-F32B-4A1C-97A8-F0A28CE02F9C" "SKU: SharePoint Server 2013"
				}
				"CBF97833-C73A-4BAF-9ED3-D47B3CFF51BE"
				{
					Write-Host -ForegroundColor Blue "Product Code: CBF97833-C73A-4BAF-9ED3-D47B3CFF51BE" "SKU: SharePoint Server 2013 Preview"
				}
				"B7D84C2B-0754-49E4-B7BE-7EE321DCE0A9"
				{
					Write-Host -ForegroundColor Blue "Product Code: B7D84C2B-0754-49E4-B7BE-7EE321DCE0A9" "SKU: SharePoint Server 2013 Enterprise"
				}
				"298A586A-E3C1-42F0-AFE0-4BCFDC2E7CD0"
				{
					Write-Host -ForegroundColor Blue "Product Code: 298A586A-E3C1-42F0-AFE0-4BCFDC2E7CD0" "SKU: SharePoint Server 2013 Enterprise Preview"
				}            
				"D6B57A0D-AE69-4A3E-B031-1F993EE52EDC"
				{
					Write-Host -ForegroundColor Blue "Product Code: D6B57A0D-AE69-4A3E-B031-1F993EE52EDC" "SKU: Microsoft Office Web Apps Server 2013"
				}  
				"9FF54EBC-8C12-47D7-854F-3865D4BE8118"
				{
					Write-Host -ForegroundColor Blue "Product Code: 9FF54EBC-8C12-47D7-854F-3865D4BE8118" "SKU: SharePoint Foundation 2013"
				}  
			}
		} 
		else 
		{ 
			Write-Host -ForegroundColor Red "Unable to determine version of SharePoint." 
		}
	}
	catch
	{
		$errText = $error[0].Exception.Message
		Write-Host -ForegroundColor Red "Unable to determine version of SharePoint. Reason: $errText"
	}
}
#EndRegion

#Region MAIN 

Get-InstalledProducts 

#EndRegion

 

Finally, the following MSDN articles titled: How To: Detect the Installed SKU of SharePoint 2010. More Info: http://msdn.microsoft.com/en-us/library/ff721969.aspx or How to: Detect the installed SKU of SharePoint 2013. More Info: http://msdn.microsoft.com/en-us/library/jj659075.aspx

Both articles contain code extracts which illustrate how to determine which SKU of SharePoint Server 2010/2013 is installed however the code needs to be compiled.

Events not displayed in SharePoint Calendar.

 

I took a call the other day regarding an issue with Calendars.  I have to hold my hands up and confess I was racking my brains for about an hour and a half.  Users were using a SharePoint Calendar on their team site to enter their holidays, training courses and public holidays etc. The idea being that the calendar was to be used to give the team visibility of when their colleagues would be in and out of office by manually adding events into the calendar.

All items were visible in the All Events view, there was no Content Approval set and Check permissions showed that all permissions were fine, no Item level permissions or such like. It was a standard SharePoint Calendar, not modified in any way.  What could it be? 

So after lots of clicking and around and scratching of the head I chanced upon the solution.

The solution was the Use this calendar to share member's schedule option. By setting it to No entries made by other users become visible and are displayed in the Calendar.

Setting the Use this calendar to share member's schedule option:

  1. In a calendar, in the ribbon, click the Calendar tab, and then click List Settings.
  2. Under General Settings, click Title, description and navigation.
  3. In the Group Calendar Options section, set Use this calendar to share member’s schedules to No.
  4. Save and Exit.

Note: To change calendar settings, you must have at least the design permission level for the site.

SharePoint 2010 EventID 7043

 

I am sure anyone using SharePoint 2010 will have encountered the SharePoint 2010: Error 7043 "Load control template file /_controltemplates/TaxonomyPicker.ascx failed" issue. There are countless blog entries available as well as a Microsoft knowledge base article KB2481844 explaining how to solve this.

Brian Lalancette has also published a small script that will correct this. This can be found here: Fix for 'Load control template... TaxonomyPicker.ascx".

I however, came across another issue which also threw the SharePoint 2010: Error 7043. The entries for these three were different. These were:

  • Load control template file /_controltemplates/EawfDocLibTemplates.ascx failed: The resource object with key 'EawfDocLibDisplayFormOpenScopeLabel' was not found.
  • Load control template file /_controltemplates/EGOrganizationItemSelector.ascx failed: The resource object with key 'ItemPicker_AddButton_Text' was not found.
  • Load control template file /_controltemplates/EGOrganizationMemberSelector.ascx failed: The resource object with key 'MemberSelector_AddLeaderButton_Text' was not found. 

I checked the 14 Hive and the aforementioned files were in fact present. A search returned nothing meaningful in relation to these errors. So, how did I solve these errors? Well, I re-ran the SharePoint 2010 Products Configuration Wizard and on completion these errors were gone, never to return.

Hope this helps.

SSL Host Headers in IIS 7.x

 

On a recent SharePoint project, customer requirements were that I create a number of site collections on a specified web application. Each of these site collections had to be created in their own database and SSL enabled. To host multiple sites on the same IP Address you will need to add a host header for each site collection.

Now, when attempting to add host headers using the IIS Manager interface, you are only able to bind one site on each IP address to port 443 using an SSL certificate. If you try to bind a second site on the IP address to the same certificate, IIS 7.x will give you an error when starting the site up stating that there is a port conflict. Additionally, when assigning the SSL certificate to more than one site or in my case web application (Example: mysite.domain.com and portal.domain.com) this will again result in a conflict and cause the site to stop.

In order to assign a certificate to be used by multiple IIS sites on the same IP address, you will need to set up SSL Host Headers. SSL Host Headers in IIS 7 allow you to use one SSL certificate for multiple IIS websites on the same IP address.

Which type of SSL Certificate?

You can only use one certificate, that certificate needs to work with all the hostnames of the websites that you use it with (otherwise you will receive a name mismatch error). For example, if each of your IIS 7 websites use a subdomain of a single common domain name (Example: site1.mydomain.com, site2.mydomain.com, etc.), you can obtain a Wildcard Certificate for *.mydomain.com and it will secure site1.mydomain.com, site2.mydomain.com, etc.

However, if all your sites are using different domain names (Example: site.mydomain1.com, site.mydomain2.com, etc.), then you will need to obtain a Unified Communications Certificate (these are sometimes referred to as a SAN certificate).

Configuring SSL Host Headers on IIS 7.x

  1. Obtain an SSL certificate and install it into IIS 7.x
  2. Next, bind the certificate to the first site on the IP address.
  3. Launch the Command prompt.
  4. Navigate to: C:\Windows\System32\Inetsrv\ by typing cd C:\Windows\System32\Inetsrv\ and hitting Enter.
  5. Run the following command for each site on the IP address that needs to use the certificate:
  6. appcmd set site /site.name:"<IISSiteName>" /+bindings.[protocol='https',bindingInformation='*:443:<hostHeaderValue>']

    Note: Replace <IISSiteName>  with the name of the IIS site and <hostHeaderValue> with the host header value.

  7. When accessing the site you should be presented the correct page and the lock icon should be displayed without any errors.

Something you should keep in mind is SharePoint terminology. This of course is a subject in itself and worthy of a blog post in its own right. I will however, highlight the pertinent terms which apply in this case.

Web Application – In layman’s terms a Web Application is an IIS web site and an associated Application Pool extended to use SharePoint. Individual application pools allow the web application to run under a different process on the IIS web server. Web applications allow for the logical separation of SharePoint content. A web application acts as a 'container' for the SharePoint site collections.

The Central Administration site is one example of a web application. Central Administration runs on an arbitrary port number (but can also be set to a desired port during configuration). Standard SharePoint sites typically run on port 80, however they both run under separate processes in IIS. In short, a SharePoint web application will be seen in IIS as an IIS Site.

Site Collection – Sometimes referred to as the Top Level Site or Parent Site or in it's simplest form, Site. A site collection is a container for SharePoint sites (also referred to as a web.) which exists within a specific content database. A site collection contains a single top-level or root site and (optional) child sites. The site collection shares the same owner and administrators, and is the unit of ownership, security, and recoverability.

Note: By default settings set on the Site collection are also applied to the site collection's sub sites.

In a future post I will explain the process for SSL enabling SharePoint and how you will apply the process of configuring SSL Host Headers.

 

 

Page List

Month List