Searching Documents by Document ID

Enabling the Document ID Service in a site collection creates a new Document ID column for documents and document sets in the site collection, which will contain a unique ID based on a configurable format.

Really nice feature to have to be able to uniquely identify your documents across a site collection and for the permalink function that comes with it (the document will have the same unique URL regardless of where the document moves to within the site collection).

However, when you search for a Document ID, you’ll get this: Nothing here matches your search…

No Search Results.PNG

Continue reading


Building a Custom SharePoint Connector for Sitefinity

We had a requirement from a client who was planning to build a new Sitefinity portal that allows external users to log in and view documents, based on document types and other metadata. All the documents and metadata exists on their SharePoint 2013 intranet, so they were looking to synchronise the documents from SharePoint into Sitefinity and surface the documents in listings and search results based on metadata.

Sitefinity does provide an OOTB SharePoint Connector, which allows you to target a specific SharePoint list and download the documents and selected fields into Sitefinity. However, there were a few limitations and design choices that made it unsuitable for our purposes:

  1. Documents are downloaded into a Sitefinity document library, but field values are added as a new list item in a custom module. This separates out the document and its metadata, making it difficult to create searches that can index document content and filter based on document metadata at the same time.
  2. The connector does not support certain SharePoint field types, such as Managed Metadata fields. This in particular was critical for us as our document types were managed in SharePoint as a Managed Metadata field.
  3. Basic filtering options, which only supports text field comparison of equals or not equals.
  4. Documents deleted in SharePoint still exist in Sitefinity’s document library, and is only removed from the custom module list.

To overcome those limitations, we decided to prototype our own custom SharePoint connector to get documents and its metadata out of SharePoint and into Sitefinity’s document library. What we built was only a one way connector (from SharePoint to Sitefinity) but it was able to overcome the obstacles above.

Continue reading

Uncheck Send an Email Invitation in SharePoint Grant Permissions Dialog

In SharePoint 2013, when you want to grant permissions, this dialog opens, with the secret “Send an email invitation” checkbox hidden in the Options section.

Share Dialog

Most of the time, I would uncheck that before sharing, to avoid email spams.

One of our clients wanted it unchecked by default, so that users don’t have to always remember to manually uncheck it to prevent spams, if they even knew it existed there in the first place.

You could easily default it to uncheck by updating the OOTB layouts page in the 15 hive at TEMPLATE\LAYOUTS\AclInv.aspx, and updating the chkSendEmailv15 asp:CheckBox control and setting Checked=”false”.

But we don’t want to do that! Updating OOTB components is not recommended and we like to stick to Microsoft best practices.

So we’ll do it the fancy pants way of using JavaScript embedded as a Script Link in a Site Collection User Custom Action.

Continue reading

SharePoint Search Expired Claims Cookie

We had an issue with a client where their SharePoint search crawls were periodically crawling successfully, but then on other subsequent crawls show a lot of warnings, saying “The claims cookie used by the crawler has expired.”

Expired Claims Cookie

For this web application, we had the Default zone set up with Windows Authentication for the search crawler, and an ADFS Trusted Identity Provider for users to log in through a custom login page.

The client also had a requirement where logins have to expire after an hour, so the CookieLifetime setting in the Security Token Service Config for the farm had been modified to 1 hour from 5 days.

Continue reading

PowerShell to Insert Field to List View at Specific Location

Added a new field (AddressLine1) to a list, and needed to display the field in all list views. It needed to always display before another field (AddressLine2).

Script below loops through all views of a list, and if the AddressLine2 field exists, it will add AddressLine1 just before it.

Note: Can’t use ForEach loop to go through each list view as the .Update() will throw an error, due to restrictions in updating collection items while enumerating.

Continue reading