Tag Archives: SharePoint

Troubleshooting “this site has not been shared with you”

I’m often asked to solve permission errors in SharePoint. It’s not hard to do with the tools available in SharePoint, you don’t even have to know much about AD especially if you use SharePoint groups.

Ways to permission a SharePoint site:

  • Permission directly against the user – not recommended as a lot of maintenance required when someone joins or leaves the organisation.
  • Use SharePoint Groups – SharePoint groups allow you to manage users within the SharePoint interface, they can be reused all over the site collection
  • Active Directory Security Groups – AD groups might already exist on your domain, these can be used but be aware that SharePoint 2013 caches the membership of these groups for around 2 hours and when using Office 365, DirSync will need to run to replicate these groups in the cloud.

What can be permissioned in SharePoint?

  • Sites – entire subsites
  • Lists – individual lists and libraries such as a document library
  • Folders – folders within a library
  • Items – items within a list or library

SharePoint permissions flow down the site from the root of the site collection unless otherwise changed. If permissions are changed at any level, any items below it will inherit the changed permissions.

SharePoint has a very easy way to check permissions of an individual user, check out my video below on how to use it.



How to create a basic content type

I’ve just created a video guide on creating a simple content type and attaching it to a document library.

You can add custom metadata to a SharePoint list by:

  • Adding columns directly onto the list
  • Using Site Columns (can be reused with other lists)
  • Content Types (can be reused and keeps a set of custom columns together in a content type)

If you decide to use a content type, you will also get the benefits of being able to apply a workflow to the content type (rather than to each list individually). If you are thinking of developing search, content types can be a great way to filter and search for specific types of data in a list. You can also use multiple content types in a list (each with different columns), for example an invoice and a receipt.



Looping through all subsites in SharePoint Online

SharePoint Online requires use of the Client Object model when modifying the site via PowerShell due to there being no backend server exposed in Office 365. Users with previous experience of using JavaScript Client Object model will find this a familiar method.

In the example below, the Powershell iterates through all subsites (and subsites of subsites) in a site collection or root site. This could be used for disabling a web scoped feature or automating site modification.

First of all, the variables are initiated including the path to the relevant DLLs.

#connection variables and reference DLL
$username = "user@onmicrosoft.com"
$password = "Password123"
$SiteCollectionUrl = "https://tonyishere.sharepoint.com"
Add-Type -Path "c:\Microsoft.SharePoint.Client.dll"

A new object for the client context requires creating, this can be done in a reusable function as shown below.

# Generate ClientContext function so we can reuse
function GetClientContext($SiteCollectionUrl, $username, $password) {
     $securePassword = ConvertTo-SecureString $password -AsPlainText -Force
     $context = New-Object Microsoft.SharePoint.Client.ClientContext($SiteCollectionUrl) 
     $credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($username, $securePassword) 
     $context.Credentials = $credentials
     return $context
}

The following function has a nested call to call itself, this enables it to iterate through subsites of subsites. Without the nested function call, it would only cover a single subsite depth. The function writes the url of the site to the screen but this could be replaced with more complex functionality such as enabling a feature or creating a list item.

# function to loop through subsites
function catchsubsites ($subsiteurl){
	$clientContext = GetClientContext $subsiteurl $username $password
	$rootWeb = $clientContext.Web
	$childWebs = $rootWeb.Webs
	$clientContext.Load($rootWeb)
	$clientContext.Load($childWebs)
	$clientContext.ExecuteQuery()
	#do something on top level site
	write-host $rootWeb.url -ForegroundColor Yellow
	foreach ($childWeb in $childWebs)
	{
		#do something for each subsite
		write-host $childWeb.url -ForegroundColor Yellow
		#see if there are any subsites beneath this and loop all of them too
		catchsubsites $childWeb.url
	}
}

Finally the function is called to kick off the whole process of looping through the site.

#Finally run the function to get it all started!
catchsubsites $SiteCollectionUrl

This example could be refined so that it doesn’t authenticate at every request but it does show how simple it can be to create the complex PowerShell scripts that we are all used to using on SharePoint on-premises in the cloud version of Microsoft’s Office 365 SharePoint Online.

Update: Code updated 01/10/2016, fixed variable in loop and added section to run code for parent site

Create a simple helpdesk in SharePoint

Below is a quick tutorial on how to create a simple helpdesk/support log in SharePoint online (Office 365) or using the on-premises SharePoint 2013 release. It uses out-of-the-box functionality to create a simple system for users to log and track support issues.

The steps required to create the help desk are:

  • Create a custom list
  • Add additional columns
  • Create list views
  • Create a new item form
  • Set list permissions
  • Configure Alerts
  • Create a notify workflow

Create a custom list
Select “Add an App” from the SharePoint menu

Office 365 menu

Select “Custom List”

SharePoint 2013 App

Give the App a Name

SharePoint 2013 App Custom List
Create additional columns
In the list settings, create some additional columns:

Description (multiple lines of text)*

Status (choice with the options: New, In Progress, Resolution Offered, Closed)*+

Resolution (multiple lines of text)

* Set column as required – force users to enter a value

+ Set default value to “New”

SharePoint App Columns
Create list views
On the list page, select “Create View”

SharePoint 2013 list view

Create a new view based on All Items called “My Open Calls”. This is the default end user view to review their open calls.

Select the following columns:

Title (linked to item)

Status

Created

Uncheck any other columns. Add a filter to show items created by the user and items that do not have the status “Closed”.

Filter 365 list view

Create another view called “My Closed Calls”. Display the following columns:

Title

Status

Filter by the user and items that have the status “Closed”.

Filter SharePoint 2013 View

You may also want to sort these items by newest first to make it easier for the end user to see recently closed items.

Create another view called “All Resolved Calls”. Display the following columns:

Title

Description

Resolution

Created By

Created

This time only add a filter to show items with the status “Closed”.

Filter View

Create another view called “All Open Calls”. Display the following columns:

Title

Description

Status

Resolution

Created

Created By

This time only add a filter to show items without the status “Closed”.

Filter 365

The views “All Open Calls” and “All Resolved Calls” will be used by the resolution team to manage logged issues. The other views will be used by the end user to track their own open issues.

Permission List
At this stage, users with contribute access can add and edit all the logged incidents. This needs to be locked down so users can only edit their own items. To do this, select “Advanced Settings” from the List Settings page.

List Settings

Lock down the Item-level Permissions so that users can only read and edit their own items.

Item Level Permission

Users will Full Control on the list will have access to see and edit all of the items despite the settings above.

Create a new form
Open the site in SharePoint Designer 2013. Using the Site Objects Navigation, find the “Lists and Library” category and select the list.

SharePoint Designer 2013

Create a new Form for the list by selecting “New” in the Forms section.

New Form Advanced Mode

Give the form a new name and select the “New item form” type. Set this as the default form for the selected type.

Form Settings

Right click on the new form and select “Edit in Advanced Mode”

Edit in advanced mode

Locate the table rows in the HTML for the Status and Resolution. Remove these including the start and end tr tag. This will remove the columns from the new form. Save the form, this should now apply to any new items added to the list.

New Form

Set up alerts and workflows
The support team should sign up for alerts on the list so that they are notified when a new issue is added or updated. A simple workflow can be added to the list to notify the end user when their issue has been updated. I will write a blog post on how to do this soon.

Design
Adding icons to a SharePoint page to point directly to the views will make it easier to navigate for the end user and much more attractive to use

List subsites using the JavaScript client object model in SharePoint 2013

SharePoint Office 365 Site Creation JavaScript

To do this, use the script editor web part or the page viewer web part (and put the HTML file in a document library).

To start off, setup the HTML to include jQuery and sp.js (see below).

SP.SOD.executeFunc('sp.js', 'SP.ClientContext', function () {
 //alert('loaded');
});

JQuery functions are used to populate HTML containers on the page.

<div id="tonycontent">
	<!-- Dashboard -->
	<div id="tonydashboard" class="tonycontenttable">
	</div>
</div>

The first function loads the current site. The get_current function returns the current context of the user from which the subsites can be retrieved (see below).

function getSubWebs(){
	clientContext = new SP.ClientContext.get_current();
	web = clientContext.get_web();
    	webCollection = web.getSubwebsForCurrentUser(null);
    	clientContext.load(webCollection);
    	clientContext.executeQueryAsync(onGetSubwebsSuccess, onGetSubwebsFail);
}

If the query is successful it will load the onGetSubwebsSuccess function, otherwise it will run onGetSubwebsFail function.

In the success function, the webCollection variable is looped through to retrieve the URL and the title of each subsite. JQuery functions are then used to append the HTML containers.

function onGetSubwebsSuccess(sender, args){
	jQuery("#tonydashboard").empty();
	var html4 ="<div class='tonycontenttablerow'><div class='tonycontenttabletitle'>Site Name</div><div class='tonycontenttabletitle'>Site URL</div></div>";
	jQuery("#tonydashboard").append(html4);
    var webEnumerator = webCollection.getEnumerator();	
    while (webEnumerator.moveNext()){
        var web = webEnumerator.get_current();
		var webtitle = web.get_title();
		var weburl = web.get_serverRelativeUrl();
        var html3="<div class='tonycontenttablerow'><div class='tonycontenttablecolumn'>" + webtitle + "</div><div class='tonycontenttablecolumn'>" + weburl + "</div></div>";
		jQuery("#tonydashboard").append(html3);
    }
}

Download the full code here

The client object model can also be used to create subsites from templates, permission sites, create lists and much more! This method works on both 365 SharePoint Online and SharePoint 2010 and SharePoint 2013 on-premises.

SharePoint 2013 JavaScript Client Object Model

Using document templates in SharePoint (365 and on premise)

Document Library Templates

Each content type in a document library can be assigned an individual document templates. In the document library below, two different content types have been added, each with a different template.

Tony is here

To edit the word templates, open the site in SharePoint designer 2013.

SharePoint Designer

Open the document library.

SharePoint Designer

In the content types section, open the content type (in this case it is called Policy).

Content Types

In the ribbon select “Edit Document Template”.

Edit Template

This will allow you to create a dotx document which will be the template for this particular content type in this library. Once the template has been saved, it will be available as the main template for the content type.

Select Document

When users create a document using the Policy content type from the new menu, it will prompt them to enter a name for the new document.

Name Document

Please note that currently, the new templates will only open in Office Web Apps (online) if using Internet Explorer. Other browsers will prompt to open in the client application.

Office web Apps online

Troubleshooting Office Web App Farm Installations

New functionality in Microsoft Office Web Apps is the preview feature in search (see below). Setting up a separate farm for Office Web Apps is a great way to improve performance and make a scalable solution but it can bring up some new technical challenges. A couple of the most common issues are listed below.

Web Apps Search Preview

Do the internal and external URLs of the Web Apps Server resolve from the SharePoint server?

Test: https://webapps.contoso.com/hosting/discovery
Should return XML without certificate error

Test: https://WebAppServer01.contoso.com/hosting/discovery
Should return XML without certificate error

Certificate Error?

When setting up the web apps farm, a SAN certificate needs to be specified with both the internal URL and the external URL (see below). Wildcard or single host certificates will not work.

SAN Certificate
404 not found?

Both the SharePoint and Web App server need to see each other. Make sure that internal DNS is setup for the external web app address. Run ipconfig /flushdns on the SharePoint server. The SharePoint server needs to resolve both addresses internally.

The Web Apps server also needs to have an entry for the SharePoint site URL. Ensure that the SharePoint site has an internal DNS entry and flush the DNS on the web apps server. Browse to the SharePoint site on the web apps server to ensure that it can see the site without any certificate errors.

How to enable blob cache for SharePoint 2013 image renditions

One of the new features of SharePoint 2013 is the image renditions. When configuring this you may find the following error:

The blob cache is not enabled in this web application. Image renditions will not be generated until the blob cache is enabled. For information on turning on the blob cache, please review the product documentation.

Image Renditions Error SharePoint 2013

Resolution:

Open the web.config file for the web application in a text editor. Search for “blobcache location”.

Inside this tag, change the “enabled” attribute from false to true (see below). This will enable blob cache on the server to enable SharePoint 2013 image renditions.

 
<BlobCache location="C:\BlobCache\14" path="\.(gif|jpg|jpeg|jpe|jfif|bmp|dib|tif|tiff|themedbmp|themedcss|themedgif|themedjpg|themedpng|ico|png|wdp|hdp|css|js|asf|avi|flv|m4v|mov|mp3|mp4|mpeg|mpg|rm|rmvb|wma|wmv|ogg|ogv|oga|webm|xap)$" maxSize="10" enabled="true" />

Save the web.config file and refresh your browser page. All sorted!

Image Rendition Working in SharePoint 2013

Fixing SharePoint 2010 dynamic menus on the iPad

When using an iPad with the default v4 Master Page in SharePoint 2010, the dynamic drop down menus do not function as expected. When using a mouse, a simple hover over the menu item will drop down the dynamic menu child items (as shown below).

SharePoint 2010 menu on ipad

When using an iPad, iPhone and most other smart phone/tablets device, there is no mouse and no hover over action. When clicking on the parent menu item, the user is taken to that link instead of showing the child items.

To solve this issue (partially), I created some jQuery code to allow the first tap to drop down the menu items and the second tap to take the user to the chosen page.

First I use the jQuery ready function to load my script when the page has fully loaded.

jQuery(document).ready(function() {
});

When the page has finished loading, the type of device needs to be detected. In the example below I have used the iPhone, iPad and iPod devices. There are alternative devices!

if((navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i)) || (navigator.userAgent.match(/iPad/i))) {
}

This solution involves using a counter to detect the first tap of a dynamic menu item as a hover over and the second tap as the actual click. First, set the counter to 0.

var countipad=0;

Another handy jQuery function is used to detect when a dynamic menu item is clicked. Using this class “dynamic-children” ensures that only the first click of a drop down menu is cancelled.

jQuery("a.dynamic-children").click(function() {
}

If the click is the first click, the default action (redirect) is prevented. The counter is then incremented ready for the next click.

if(countipad==0){
	event.preventDefault();
	countipad=countipad+1;
}

The full solution is as follows:

jQuery(document).ready(function() {
	if((navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i)) || (navigator.userAgent.match(/iPad/i))) {
		var countipad=0;
 		jQuery("a.dynamic-children").click(function() {
			if(countipad==0){
				event.preventDefault();
				countipad=countipad+1;
			}
		});
	}
});

This isn’t a great solution as the second click will always take you to the link. A better solution would detect which link is selected and only redirect on the second click of that particular menu item.

ipad menu SharePoint 2010