SharePoint 2013 Re-installation – Prerequisite Installer Continuously Restarts

If you are attempting to re-install SharePoint on a server, after you have run the uninstall option for both SharePoint 2013 and Appfabric 1.1, you may encounter an issue when running the Prerequisite Installer.

It may reach the end of the installation process and then ask to reboot. When the server comes back up it may go through the same process over again, and then continue to reboot over and over again.   The solution is to go into the registry editor (regedit) and browse to: HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager/Enviroment/PSModulePath

If there is an entry there, the uninstall option for Appfabric did not fully remove itself, leaving behind an old entry.

Remove that key and reboot the server.

psmodulepath

 

Now when you attempt to run the Prerequisite Installer, it will complete successfully.

Creating a Classic Authentication Web Application in SharePoint 2013

To create a new web application using classic mode, run the following:

New-SPWebApplication -Name "Portal" -ApplicationPool "Classic App Pool" -AuthenticationMethod "Kerberos" -ApplicationPoolAccount"Contoso\SPFarm" -Port 80 -URL "http://portal.contoso.com" -Path "C:\inetpub\wwwroot\wss\VirtualDirectories\Portal" -HostHeader "portal.contoso.com" 

If you are (most likely) upgrading a content database from SharePoint 2010, you will need to run the Test-SPContentDatabase / Mount-SPContentDatabase commands afterwards to get your old database associated with the new web application.  You cannot attach a 2010 content database and create the web application in Kerberos mode simultaneously.

Be sure to register the farm account as a managed account, and also add your Kerberos entries using SETSPN before running this.

Moving the Search Service Application to a Different Farm Server

For performance reasons, you may wish to move the Search Service Application in SharePoint 2013 to a different farm server. After adding the server to the farm, and provisioning the Search Service, in order to move the service, you will need to do so through Powershell, as that is the only way to get the components moved over.

Rather than breaking up the SSA components onto multiple servers, to reduce lag, etc. between servers, its suggested to keep the components together on the same server.

before-moving-ssa

So for instance, you may have Central Admin running on Server A, along with the User Sync and Search. To reduce the load on Server A, you may want to move the entire search portion over to Server B.

To do so, run the following commands:

$ssa = Get-SPEnterpriseSearchServiceApplication
$active = Get-SPEnterpriseSearchTopology -SearchApplication $ssa -Active
$clone = New-SPEnterpriseSearchTopology -SearchApplication $ssa -Clone –SearchTopology $active
$newSrv = Get-SPEnterpriseSearchServiceInstance -Identity <<Server B Name>>
New-SPEnterpriseSearchQueryProcessingComponent -SearchTopology $clone -SearchServiceInstance $newSrv
New-SPEnterpriseSearchAnalyticsProcessingComponent -SearchTopology $clone -SearchServiceInstance $newSrv
New-SPEnterpriseSearchContentProcessingComponent -SearchTopology $clone -SearchServiceInstance $newSrv
New-SPEnterpriseSearchCrawlComponent -SearchTopology $clone -SearchServiceInstance $newSrv
New-SPEnterpriseSearchAdminComponent -SearchTopology $clone -SearchServiceInstance $newSrv
New-SPEnterpriseSearchIndexComponent –SearchTopology $clone -SearchServiceInstance $newSrv -IndexPartition 0
Start-SPEnterpriseSearchServiceInstance -Identity $newSrv
Set-SPEnterpriseSearchTopology -Identity $clone

Next, you will need to re-clone it again to remove the old components off the old server

$ssa = Get-SPEnterpriseSearchServiceApplication
$active = Get-SPEnterpriseSearchTopology -SearchApplication $ssa -Active
$clone = New-SPEnterpriseSearchTopology -SearchApplication $ssa -Clone –SearchTopology $active

Run the following, this will give you a list of all the component IDs you will need to remove them from Server A

Get-SPEnterpriseSearchComponent -SearchTopology $clone

Replace the IDs in the following commands:

Remove-SPEnterpriseSearchComponent -Identity <<Server A Component ID>> -SearchTopology $clone -confirm:$false
Remove-SPEnterpriseSearchComponent -Identity <<Server A Component ID>> -SearchTopology $clone -confirm:$false
Remove-SPEnterpriseSearchComponent -Identity <<Server A Component ID>> -SearchTopology $clone -confirm:$false
Remove-SPEnterpriseSearchComponent -Identity <<Server A Component ID>> -SearchTopology $clone -confirm:$false
Remove-SPEnterpriseSearchComponent -Identity <<Server A Component ID>> -SearchTopology $clone -confirm:$false
Remove-SPEnterpriseSearchComponent -Identity <<Server A Component ID>> -SearchTopology $clone -confirm:$false
Set-SPEnterpriseSearchTopology -Identity $clone

Run a refresh in central admin, and you should see the following:

after-moving-ssa

Using CQWP To Show Discussion Rollup with Reply Count and Last Update Date

This is what we want our final result to look like:

DiscussionRollupFinal

1) Add a Content Query Web Part to your page.  Go in and expand the “Query” section.  Modify it to show just the discussions for your site.  Then click OK.  Verify that you can see your discussions.

DiscussionRollupStep1

2) This is where things get a little tricky.  You will need to access the ItemStyle.xsl file of your site, and modify it by adding a new template within the file.  Just find a spot where the templates are within that file and copy and paste the following template entry (be sure to keep what you already have in that file):

<xsl:template name="DiscussionAndReplies" match="Row[@Style='DiscussionAndReplies']" mode="itemstyle">
 <xsl:variable name="vv1"> 
 <xsl:value-of select="@LinkUrl"/> 
 </xsl:variable>
 <xsl:variable name="formattedLastUpdatedDate">
 <xsl:value-of select="ddwrt:FormatDateTime(string(@DiscussionLastUpdated) ,1033 ,'dd MMM yyyy')" />
 </xsl:variable>
 <xsl:variable name="listTitleEnd">
 <xsl:call-template name="substring-before-last">
 <xsl:with-param name="list" select="@LinkUrl" />
 <xsl:with-param name="delimiter" select="'/'" />
 </xsl:call-template>
 </xsl:variable>
 <xsl:variable name="listTitle">
 <xsl:call-template name="substring-after-last">
 <xsl:with-param name="string" select="$listTitleEnd" />
 <xsl:with-param name="delimiter" select="'/'" />
 </xsl:call-template>
 </xsl:variable>
 <xsl:variable name="DisplayTitle">
 <xsl:call-template name="OuterTemplate.GetTitle">
 <xsl:with-param name="Title" select="@Title"/>
 <xsl:with-param name="UrlColumnName" select="'LinkUrl'"/>
 </xsl:call-template>
 </xsl:variable>
 <xsl:variable name="LinkTarget">
 <xsl:if test="@OpenInNewWindow = 'True'" >_blank</xsl:if>
 </xsl:variable>
 <div class="item link-item">
 <a href="{$vv1}" target="{$LinkTarget}" title="{@LinkToolTip}"> 
 [<xsl:value-of select="$listTitle" />] <xsl:value-of select="$DisplayTitle"/> - Replies:(<xsl:value-of select="substring-after(@ItemChildCount,'#') "/>) - Last updated: <xsl:value-of select="$formattedLastUpdatedDate" />
 </a>
 </div>
</xsl:template>

3) Once you’ve done that, go back and edit your Content Query Web Part.  Now, scroll down to “Presentation” and expand it.  Be sure to select the sorting / counts you’d like displayed.  Then be sure to select your new style template you just added.

DiscussionRollupStep2

5) If you are using SharePoint 2013, you will want to make sure you add the entry for the ItemChildCount, as it will not be picked up automatically.  (I spent a good couple hours trying to figure out why it would display in SP2010 and not SP2013.)

DiscussionRollupStep3

6) Click ok, and voila!  A nice rollup of a more detailed view of the discussion content on your site.

DiscussionRollupFinal

SharePoint 2013 Search Not Returning Results / SP1 Configuration Wizard Fails At Step 8

We recently upgrade our environment from SharePoint 2010 to SharePoint 2013.  As part of the upgrade we created a new search service application, performed database attach upgrades for our content and then ran the appropriate crawls.

Along the way, we encountered an issue where search results were not being returned.  Just a correlation ID, and a “Web part could not be displayed” error.  Curiously, there did not appear to be anything wrong with the Search Service Application, or the Web Application.

Thinking the issue could have been some sort of SharePoint bug, we attempted to upgrade our environment to SP1.  All the front end servers upgraded fine, but the server hosting Central Admin and the Search Service Application failed at step 8.

It turns out the solution was to re-provision the Search Service Application, and then clear the SharePoint Configuration Cache.

$ssa = Get-SPEnterpriseSearchServiceApplication "Search Service Application"
$ssa.Status = "Disabled"
$ssa.Update()
$ssa.Provision()
  • Stop the “SharePoint Administration” and “SharePoint Timer Service”
    stopservice
  • Browse to %SystemDrive%\ProgramData\Microsoft\SharePoint\Config\<GUID>
  • Select every file *EXCEPT* Cache.ini
    deleteconfigurationfiles
  • Delete the all XML configuration files
  • Open Cache.ini. Delete all the contents of the file, and type 1
  • (This will cause the configuration cache to rebuild itself.)
  • Start the “SharePoint Timer Service” and “SharePoint Administration” service.

Try searching for content on your site. It may take a minute as the cache will need to rebuild.

If all goes well you should see results. You should also be able to run the SharePoint Configuration Wizard successfully now.

How to install PDF iFilter for SharePoint 2013

SharePoint 2013 out of the box supports PDF crawling, making installing a PDF iFilter unnecessary.

Despite this, it does however support iFilters, so if there is one you are looking to install for other file types, it does support this.

Migrating SharePoint 2010 Reporting Services To SharePoint 2013

I ran into a bit of a snag migrating a SharePoint 2010 Web Application that had utilized SQL Reporting Services.  This was mainly because there is not a lot of helpful documentation on the web.  Hopefully this will help if you are struggling to find the information you need.

1) The first thing you will want to do is ensure that you have installed the SSRS components for SharePoint.  To do this, I recommend finding a copy of the SQL version you are using and running the install on your SharePoint servers, but only installing the necessary SharePoint bits.

installssrsforsharepoint

You may also want to download and run the latest version of rsSharepoint.msi for good measure: http://www.microsoft.com/en-us/download/details.aspx?id=35583

After that, you’ll want to run the following commands via the SharePoint 2013 Management Shell:

Install-SPRSService 
Install-SPRSServiceProxy
Get-spserviceinstance -all |where {$_.TypeName -like "SQL Server Reporting*"} | Start-SPServiceInstance”

2) After completing this, you should be able to see an option to create a new “SQL Server Reporting Services Service Application” under “Manage Service Applications”

newssrsserviceapp

From here, go ahead and create a new SSRS Service App.  Give it a name like “SSRS”, use the existing Default Service App Pool, and get rid of the GUIDs on the database name.  (Although you will soon be getting rid of those DBs anyway.)  Normally, you’d stop here if you were doing a “fresh” SSRS install.

However, if you are like me, and you have sites in SharePoint 2010 that already have SSRS reports you have been using that have stored processing options, history records and subscriptions, starting all over just isn’t an option.

This is where the migration comes in.

3) You will need a few things from your previous SharePoint 2010 environment.

  • A backup copy of the encryption keys
  • Report Server DB
  • Report Server Temp DB

To get a backup of your encryption keys, log onto your SharePoint 2010 server that is being used for Reporting Services currently.  Go to “Reporting Services Configuration Manager” which can be found under your SQL “Configuration Tools.”  Connect to your server.  On the left, click on “Encryption Keys” and then select “Backup.”  Create a new password and write it down somewhere.

encryptionkeysbackup

4) Copy that file over to your SharePoint 2013 server.  Go to “Manage Service Applications” and click on “SSRS”  (the service app you just created).  Click on “Key Management.” Then click “Restore Encryption Key.”

restorekey

5) Once you’ve restored the key, move on to the databases.  You will need to get a backup of your SP2010 Reporting Services databases.  Typically, these are titled something like “ReportServer_DB” & “ReportServer_TempDB”.  Attach those databases to your 2013 farm and make sure you update the owner to your 2013 farm account.

6) (optional) Depending on if you have a lot of customizations, at this point you may also want to copy the configuration files from your SharePoint 2010 machine to “C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\WebServices\Reporting”.  (I didn’t have any customizations, so I skipped this step).  Example files:

  • Rsreportserver.config
  • Rssvrpolicy.config
  • Web.config for the Report Server ASP.NET application.
  • Machine.config for ASP.NET.

7) Now here’s where the tricky part comes in.  You will need to go back to the SharePoint 2013 Management Shell and run the following:

Get-SPServiceApplication

Find the GUID for the SQL Server Reporting Services, and copy it.

get-spserviceapps

Then run:

Mount-SPRSDatabase

Supply the database name, service application GUID (which you just copied), and database server.

mount-upgrade

Run the following to check your work.  You should see both the new database and the one you just mounted.

Get-SPRSDatabase

get-sprsdatabase

Finally, you will want to clean up the SSRS Service by deleting the temporary DB.  Grab the GUID of the DB above that is the temporary one.  Run the following and enter the GUID:

Remove-SPRSDatabase

remove-sprsdatabase

8) Once you’ve done all that.  Navigate to your Web Applications.  Click on the Web Application that needs SSRS, and click “Service Connections” in the ribbon.

serviceconnections

You should then have the option to associate your upgraded SSRS Service with your upgraded SharePoint 2010 Web App.

You may also want to go back in to your SSRS Service App and update some of the settings, such as your email server, etc.

Also, do not forget to update the permissions for any new service app accounts so that it can get to your content database.

Some helpful links:

SP10 to SP13 SSRS Migration Overview
http://msdn.microsoft.com/en-us/library/hh759331.aspx

SharePoint Powershell Commands for SSRS:
http://msdn.microsoft.com/en-us/library/gg492249.aspx

Hide “Experience All SharePoint 2013 Has To Offer” (Pink Bar)

Experience_all_Sharepoint_Has_To_Offer
If you are upgrading to SharePoint 2013, and not quite ready to upgrade the UI, you may want to hide this rather annoying popup bar, since it will continue to appear, even after you dismiss it.  A good example would be if  you want the stability of SP13 and access to the new Service Application infrastructure.

A simple way to dismiss this message is via PowerShell (SP13 Management Shell).  This command will hide the message for 1 year.  You can adjust the date range as desired:

Get-SPWebApplication http://portal.contoso.com | % { $_.UpgradeReminderDelay = 365; $_.Update() }

Or alternatively, to hide it entirely right out of the gates for all applications:

Get-SPWebApplication | % { $_.UpgradeReminderDelay = 365; $_.Update() }
Get-SPSite -Limit All -CompatibilityLevel 14 | % { $_.ExtendUpgradeReminderDate() }

SharePoint On Premises vs. SharePoint Online (Office 365)

Listing of notable limitations of SharePoint Online for Enterprise

Sites Types

  • Single public facing site
  • Multiple internal/private sites (top level is a Team Site).
    *There are no web applications.  All sites must exist under a single web application using separate site collections

Data Storage Limitations

  • Tenant storage: 10 GB + 500 MB per subscribed user + additional storage purchased.  For example, if you have 10,000 users, the base storage allocation is approximately 5 Terabytes (10 GB + 500 MB * 10,000 users).
  • Site collection: Hard limit of 100GB
  • Overall subscription limit: 25TB

External Users

Per MS: “An external user is a person who has been granted access to your SharePoint Online site, but who is not a licensed user within your organization. External users are users who are not employees, contractors, or onsite agents for either you or your affiliates.”

  • Maximum number of external users: 10,000
  • External users cannot create their own My Sites or OneDrive Pro
  • Cannot change their profile, edit picture or see tasks
  • Cannot be an administrator for a site collection
  • Cannot access search center or execute searches against “everything”

Missing Features/Services in SharePoint Online (365)

Missing: Central Administration

Does not exist in SharePoint Online (SPO), rather there is an “SharePoint Admin Center”

Office365-SharePoint-Admin-Center

Missing: Web Application Management / Managed Paths

  • Starts at the Site Collection level
  • All sites, other than the public and top level team site, must exist under the “.sharepoint.com/sites/” area

Office-365-Managed-Paths-Options

Missing: Full Trust Solutions

You can only create Sandbox and App model solutions.  3rd party solutions would need to be in this format.

Missing: Search Control and Index

  • Unable to set crawl schedules
  • Unable to initiate crawl (default is ~5 minutes)
  • Unable to create custom solutions against Search Index
  • Unable to add entity extraction (custom refiners)
  • Unable to enhance relevancy (custom ranking models)
  • No federated search

Missing: Cross site publishing

Per MS: “Cross-site publishing is a new publishing method that lets you create and maintain content in one or more authoring site collections and publish this content in one or more publishing site collections by using Search Web Parts. Cross-site publishing complements the already existing publishing method, author-in-place, where you use a single site collection to author content and make it available to readers of your site.”

Missing: Content by search

(Content by search allows content to be displayed in a web part via search.  One of the top features of SP13.)

Unavailable SharePoint Services

  • Access Services 2010
  • PerformancePoint Service
  • PowerPoint Automation Service
  • State Service
  • User and Health Data Collection Service*
    *(Office 365 provides separate health info in admin center)
  • Word Automation Service
  • Work Management Service
  • Microsoft Foundation Subscription Settings Service

Branding Limitations

Adding a custom design to the internal site “Team Site” is a bit counter intuitive.  The option to select a MasterPage is not available under “Site Settings.”  You must upload the MasterPage to the MasterPage gallery, along with a “Preview” file.  Then, you must create a “Composed” look.  From there it will be available under the “Change the Look” feature.  I hope to detail this out more in a future post.

Other Notable Limitations

  • Migration must be done remotely
  • Disks cannot be shipped
  • Cannot control upgrade schedule
  • BCS security concerns about opening local data up to the cloud

A detailed feature comparison from Microsoft:

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

Another consideration: hybrid environment

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

Another consideration: Azure hosted

http://msdn.microsoft.com/en-us/library/windowsazure/dn275958.aspx

Modify “Upload To” (“Destination Library”) Choices For Discussions

I will start out with a caveat by saying that I have not tried this script on 2013.  However, the “Upload file” dialog also has an iframe like 2010, so I believe it should work, or will work with some minor alterations.

The problem we had is that users have permissions to contribute to multiple document libraries, however, for a specific discussion board, we wish to have them upload their attachments (when not using the “Attach File” option, but rather the “Upload file” option), to a specific document library.  The beauty of having the users create their posts using this method is that it allows the content to be directly embedded in the post itself, rather than having to click on the “View Properties” link to get to the attachment.

doc-libraries

SharePoint however, does not present a way to modify the list of upload locations it presents.  Whilst browsing the interwebs, I did find ways that recommend modifying the underlying aspx pages, however, trying to adhere to what Microsoft recommends, I never modify these pages unless it has been recommended.

upload-embed-attachment

Undesired choice appears in “Upload Document” select box:

upload-location-choices

Find the value of the option we wish to remove:

find-choice-to-remove
Add the following script to your masterpage. This assumes you already have a reference to jQuery lying around. You may need to update the “live” reference to “on” if you have a new version.

//for removing the load detecting

var hideRibbonTimeout = 0;

var newButtonPresent = false;

 

//check to see if this the discussion board we want to trim

if (jQuery('#s4-titlerow a:contains(Product)').length > 0) {

       setTimeout(HideRibbonButton, 10);

}

//replace the current "Upload File" button to override the SharePoint button

function HideRibbonButton() {

       $('a[id*="UploadFile-Large"]').replaceWith('<a class="ms-cui-ctl-large newDialog" id="btnUpload" aria-describedby="Ribbon.EditingTools.CPInsert.Links.UploadFile_ToolTip" mscui:controltype="Button" role="button" id="Ribbon.EditingTools.CPInsert.Links.UploadFile-Large"><span unselectable="on" class="ms-cui-ctl-largeIconContainer"><span unselectable="on" class=" ms-cui-img-32by32 ms-cui-img-cont-float"><img unselectable="on" alt="" src="/_layouts/1033/images/formatmap32x32.png" style="top:-224px; left: -64px;"></span></span><span unselectable="on" class="ms-cui-ctl-largelabel">Upload<br>File</span></a>');

       if (jQuery('.newDialog').length> 0) {

              newButtonPresent = true;

       }

       hideRibbonTimeout++;

       if (hideRibbonTimeout < 1000) {

              if (newButtonPresent == false{

                     setTimeout(HideRibbonButton, 10);

              }

       }

}

//handle the "Upload File" click and create our own upload

$('#btnUpload').live('click'function () {

       newButtonPresent = true;

       SP.UI.ModalDialog.showModalDialog({

              url: L_Menu_BaseUrl + "/_layouts/RteUploadDialog.aspx?LCID=1033&Dialog=UploadDocument&UseDivDialog=true",

              title: "Upload a file",

              dialogReturnValueCallback: function (result, value) {

                     if (result == SP.UI.DialogResult.OK) {

                           //adds the link to the body of the discussion post

                           $('.ms-rtestate-write').append($(value));

                     }

              }

       });

       setTimeout(function () {         

       //finds the upload choice dialog box

              var dlg = SP.UI.ModalDialog.get_childDialog();

              if (dlg != null) {

                     var dlgWin = $("html"window.parent.document);

                     //get the iframe with the select box

                     var dlgCont = $(dlgWin).find("#dialogTitleSpan:contains('Upload a file')").parent().parent().parent().find('iframe');

                     //remove the option we want taken out

                     $(dlgCont).contents().find("#ctl00_PlaceHolderRteDialogBody_TargetList option[value='3141e042-d74f-440d-b836-a82b79a576f5']").hide();

              }

       }, 1000);

});

 

Upload choice has been removed and users are now directed to upload to the correct document library.

choice-removed