Leave a comment

Copy files to every server (SharePoint)

Even with the ‘new era’ being Office 365, sometimes (!) we have to deal with an on-premises SharePoint farm – often with many servers.

The recent environment I was upgrading has over a dozen servers – and we had a need to copy a file to EVERY server.

This was simply a PDF icon image – but a pain-in-the-butt to copy to lots of locations.

The solution was to define an XML file with a list of servers, and some PowerShell to do the copying.

Make sure to save both files to the same folder – and the image file (in this situation).








The PowerShell script does the following :

  • Open the XML file
  • Do a “Foreach” for the servers
  • Define the path for the file (destination)
  • Do a “Copy-Item” command – to each \\SERVER\C$\path


$xml = [xml] (Get-Content (resolve-path .\SERVERS_LIST.xml))

$currentPath = (resolve-path .\pdficon_small.png)

$servers = $xml.Servers.Server

$servers | % {

      $server = $_

      $path = “\\$server\C$\Program Files\Common Files\microsoft shared\Web Server Extensions\15\TEMPLATE\IMAGES\icpdf.png”

      Copy-Item $currentPath $path



This is a great option for a quick “deploy to every server” – as a scripted solution.

Hope this can be helpful / useful for your environment !


Leave a comment

Open in new window – MySites

Within SharePoint 2013, there is a navigation menu with the “About Me” link – which re-directs to MySites.

We have a customer request that asked if this link could be changed to display in a new tab.


After some investigation into the HTML, and markup within the Master Page, I determined the following :

There is a control called WELCOME.ASCX for this piece – in the master page :

<%@ Register TagPrefix=”wssuc” TagName=”Welcome” src=”~/_controltemplates/15/Welcome.ascx” %>

This loads a bunch of HTML and JavaScript – with the actual click-link being executed by a function called :

  • STSNavigate2


THIS function is actually within INIT.JS – and changes the window.location.href.


So – HOW do you change this ??

The change I introduced does the following, using some JavaScript added to the Master Page :

  • Find the HTML hidden nodes used for the WELCOME menu
  • Determine the OnClick JavaScript function – using jQuery
  • Change this to be MY function
  • New function to do ‘open in new window’ for the URL


** The biggest problem I had was whether to use ExecuteOrDelayUntilScriptLoaded, and WHERE in the Master Page to put this.

In the end, I included this at the very BOTTOM of the Master Page – just before the closing BODY tag – you can see this in the screenshot above.

The functions included are :

  • STSNavigationNewWindow – new function called when user clicks on the link
  • ReplaceMenuFunction – just a string replace function
  • OpenInNewWindow – gets the existing text in the onmenuclick property – and change it
  • _changeTargetForHyperlinks – can list the specific item to change – and any others

Here’s the full text of the above ‘magic’ – hope it helps you – let me know if it does, I love to see/hear nice comments from other SharePoint’ers out there.


<script type=”text/javascript”>
    // this is the new function that does the stuff
    function STSNavigateNewWindow(a, b) {, ‘_blank’);

    //helper function to replace out the property
    function ReplaceMenuFunction(a) {
        return a.replace(‘STSNavigate2′, ‘STSNavigateNewWindow’);

    //set the JS function for specific fields
    function OpenInNewWindow(idValue) {
        var jqControl = $(idValue);
        var oldFunctionRef = jqControl.attr(‘onmenuclick’);
        if (oldFunctionRef) {
            var newFunctionRef = ReplaceMenuFunction(oldFunctionRef);
            jqControl.attr(‘onmenuclick’, newFunctionRef);

    function _changeTargetForHyperlinks() {




Leave a comment

Cannot click ‘connect’ for Azure VM

In order to try out the new AZURE portal site (, as well as Windows 10, I’ve created myself a VM – entitled “Wookie10”.

Within the portal though, I’m unable to “connect” to the VM – the button is disabled !?


It turns out that the provisioning of a VM within Azure (for a Windows ‘client’ machine – not Windows Server) does not add the Endpoints to allow for this.

The steps to resolve this are :

(1) Click on the VM you’re using – click SETTINGS

(2) Choose ENDPOINTS

(3) Click [+ ADD]


(3) Enter the following :

** Make sure to keep the PRIVATE PORT = 3389


NB. Just choose a random port :


(4) Click OK – and wait a few moments – check your “Notifications”


You might need to close the ‘blades’ – and then re-select it.

If you’ve done it correctly, you should be able to do REMOTE DESKTOP :


This will save an RDP file – and you’ll be able to connect….

Thanks Azure !


Leave a comment

SharePoint Publishing Feature – Access Denied error for FULL CONTROL user

Within our SharePoint 2013 farm, we have a number of users who are ADMIN – and others who are simply FULL CONTROL.

We’re finding that we get an error when these ‘FULL CONTROL’ users activate the SharePoint Publishing feature.

Sorry, you don’t have access to this page


When looking with LOGS, there are some error messages related :

System.Runtime.InteropServices.COMException: <nativehr>0x81070211</nativehr><nativestack></nativestack>Cannot open file “_catalogs/masterpage/__DeviceChannelMappings.aspx

SPRequest.GetMetadataForUrl: UserPrincipalName=i:0).w|s-1-5-21-1159821373-1672690008-2013803672-278888, AppPrincipalName= ,bstrUrl=/DeviceChannels

System.UnauthorizedAccessException: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

ISSUE –> Device Channels

It would appear that these FULL CONTROL users do not have access to the library at the root site, that controls ‘DeviceChannels’.

Even if these aren’t being used within your farm, it’s part of the provisioning code for the Publishing feature.    If that errors, then it all causes the ‘access denied’.

When doing ‘check permissions’ within the library, it shows as this :




Within the library, choose to “GRANT PERMISSIONS” to the specific user – or group.    For some reason, this library has ‘unique permissions’ – it could be a consideration to “re-inherit” permissions.  

Or – grant read-only permissions to EVERYONE.


After you’ve done this, you will find that the “FULL CONTROL” users can now activate the PUBLISHING feature.


Leave a comment

List all Nintex Workflows

When needing to list the workflows within a SharePoint farm, there is a command that can be used from the Nintex SDK :

nwadmin -o FindWorkflows

But – the format (output) of the workflow list is a little tricky to use.   

You simply need to view the lines with “- -“ and “- – – -“ at the start of the line.


I have a newer script that writes out ONE line for each workflow – easy when you need to have a definitive “to do” list of SITE workflows, and LIST workflows.

Here’s the new output :


This can then be loaded into EXCEL – and sorted.

The script is as follows – just a PowerShelll function that processes the output from the NWADMIN command :


If you’d like to use the script – here it is :

function FormatListOfWorkflows
    # build the credential object
    $secpasswd = ConvertTo-SecureString $args[1] -AsPlainText -Force
    $credential = New-Object System.Management.Automation.PSCredential($args[0],$secpasswd);

    # find all the workflows and store them in a variable
    $foundworkflows = nwadmin -o FindWorkflows

    foreach($line in $foundworkflows)
        if($line.StartsWith(“Active at “))
            # get the site url
            $site = $line.Replace(“Active at “,””);
        if($line.StartsWith(“– “))
            # get the list name
            $list = $line.Replace(“– “,””);
            #make sure to NOT have &amp; error
            $list = $list.Replace(“&amp;”, “&”)
        if($line.StartsWith(“—- “))
            $loopCount = $loopCount + 1
            $totalCount = $totalCount + 1

            # get the workflow name
            $workflowname = $line.Replace(“—- “,””);

            #get the workflow – exported
            if($list -eq “Site workflow”)
                $s = “SITE WORKFLOW :       SITE > ” + $site + ”    WORKFLOW > ” + $workflowname
                echo $s
            elseif($list -eq “Reusable workflow template”)
                $s = “REUSABLE WORKFLOW TEMPLATE :       SITE > ” + $site + ”    WORKFLOW > ” + $workflowname
                echo $s
            elseif($list -eq “Site collection reusable workflow template”)
                $s = “SITE COLLECTION REUSABLE WORKFLOW TEMPLATE :       SITE > ” + $site + ”    WORKFLOW > ” + $workflowname
                echo $s
                $s = “LIST WORKFLOW :       SITE > ” + $site + ”    LIST > ” + $workflowname + ”    WORKFLOW > ” + $workflowname
                echo $s

$userName = ‘DOMAIN\username’
$userPassword = ‘password’

FormatListOfWorkflows $userName $userPassword


You could change the text further if you need, perhaps include “|” between columns, and can easily create columns when importing into EXCEL.

Good luck – and happy NINTEX’ing…


Leave a comment

SLK error with SP2013 – assignment (ID {0})

I’m working on a SharePoint 2013 + SharePoint Learning Kit (SLK) implementation as part of an upgrade from SharePoint 2010.  

We applied the new v1.7 of SLK, as well as the SQL Server patch (update).

We were finding that users could click on a course, but would see the following error message :

The assignment (ID {0}) does not exist or you may not have permission to access it.

Furthermore, this error was ONLY happening ‘in the morning’ on our environment !!


Explanation (after many days of investigation) :

Within the function “LearnerAssignmentListForLearners” (SQL), there is a WHERE clause :

WHERE lui.[Key] = @UserKey

AND GETUTCDATE() >= asi.StartDate


The data rows are added to ‘AssignmentItem’ (asi) as :

  • 16/10/2014 00:00:00     (today at midnight)

But – the UTC date was resolving as :

  • 15/10/2014 22:35:00 (yesterday)

And so – ZERO rows were returned – and the error above occurred.

After a few hours (~11am) the UTC date ticked along – and it all worked !

  • 16/10/2014 00:05:00 (today)

We have changed this FUNCTION to :

WHERE lui.[Key] = @UserKey

AND GETDATE() >= asi.StartDate


changed to


** I wonder if this ONLY impacts users that are more than ~10hrs ahead of the UTC (GMT) time ?      Australia, New Zealand, Fiji, Vanuatu ?


NB.  This has been logged with SLK (CodePlex).

Leave a comment


Over the last few days, the Australian SharePoint conference has been held in Sydney – it’s the FIFTH year that it’s been held – and the third time I’ve presented a session.

The conference began with a speaker dinner, at an amazing gourmet Mexican restaurant – one of the amazing highlights for me was the made-at-the-table guacamole (waitress used a mortar & pestle) – and the tempura cactus chips (!)

Lots of great chatter over more food, and margarita’s and mojito’s – a great crew of local and international speakers.

I had two sessions to deliver, but not until the 2nd day – so I went to see a number of sessions, and spoke with many of the vendors and other colleagues I’ve gotten to know over the years.

There was also a great VEGAS theme party, with blackjack tables, and poker, and a prize wheel too – lots more discussion & fun was had.

But – you’re here to check out the prezzo’s, right ?


Elaine van Bergen and I co-presented this slot, with Elaine covering much of the OOTB and ‘what you get’ aspects of Yammer – as well as considerations related to SSO (Single Sign-On) and DirSync.

I covered the next section, with some deep-dive DEV-content for integration of Yammer into your SharePoint site – we were showing this within Office 365 (btw).

The first of these was using the EMBED tags and SCRIPT blocks – which allows Yammer to inject an IFRAME into your page.   Some minor customisations, but still a bit limited – eg. can’t do any CSS / styles.

The next bit (and more interesting from a ‘code’ perspective) was to use the REST API from the Yammer SDK.  

This requires a SCRIPT tag reference, and then some URL’s to retrieve JSON data.   Then, you can do ‘whatever’ you want.

The demo showed :

  • Some example REST URL’s + the JSON data returned
  • An example GET to retrieve ‘messages’
  • An example GET to retrieve the current user, and determine the GROUPS they are part of – and load into a combo.  
  • The user could then choose a group – and enter some text, and click POST which would then create a Yammer post – nice !

I’ve loaded the slides for anyone wanting to see what we covered – please leave a comment if you’d like more information, and I can do another post about the demos.


My second session for the day was to cover the future of forms, with the perspective of InfoPath being deprecated, as was news earlier in the year.

This was a hot topic – and the presentation room was packed to capacity – every seat taken, and a bunch of people standing up the back, and even sitting on the floor at the front.   Was between 120-130 people – was great to have such a large audience !

My session covered the following aspects :

  • Brief history of InfoPath – why is it being put out to pasture
  • Wrap-up of the SPC348 session from Vegas – and the alternatives shown by Microsoft
    • Excel Surveys (FOSS = Forms On Spread Sheets)
      • Had a great crowd-participation survey “live demo” – lots of fun
    • Forms On SharePoint Lists (FOSL)
      • Not available until end-of-2014 – I had to do JPG demo
    • Structured documents (Word)
      • Much like content fields today – or so it seems
      • Again, not available till end of 2014
    • Access Web Apps
      • Table driven database ‘apps’ – using MS-Access
  • Other considerations
    • Rules/Validation
    • Back-end system integration
    • Workflows

After that run-down, the tone was pretty much “well, none of those are a replacement for InfoPath” !    

(I had a video-game-photo that I found entitled “Wasteland” – LOL !)

The next section covered some 3rd-party alternatives – with overview+demo :

  • Nintex Forms
  • K2 SmartForms (SmartObjects)
  • Formotus

The ending message that *I* wanted to leave with people was that you can STILL use InfoPath – it’s not going anywhere – not for 10 years (2023 – end of support).

If you’re using Office 365 of course, that could be sooner (much sooner).

So – don’t panic – just continue “as is” for now – and hopefully we’ll see something from Microsoft towards the end-of-the-year.

The murmurings I’ve heard are that Santa will kind to us – watch this space !

** Again, please leave a comment if you’d like to know more about FORMS – or you can contact me via twitter / email – check the slides for details :

OK – that’s all for now – only a few days until I head off to New Zealand, and do it all again !    

Hope you had a great AUSPC – if you were there.   If not, you MISSED OUT !



Get every new post delivered to your Inbox.

Join 31 other followers