Monday, 28 March 2016

Regarding SharePoint 2010, 2013 and 2016 project templates in Visual Studio 2015 community edition

Hi All,

In this article I’ll explain the issue of SharePoint 2010/2013 project templates are not available in Visual Studio 2015 community edition and solution. Also will show the SharePoint 2016 project templates available in Visual Studio 2015 in Office Developers Tools preview.
 
Background: Last year, Visual Studio 2015 launched and I have installed Visual Studio 2015 community edition on my dev box. But since long time I was working on SharePoint Online so didn't required Visual Studio recently :). Suddenly one request came for POC of SharePoint 2013 on premises. So I started visual studio to create new SharePoint 2013 project but found that there is no template available for either SharePoint 2010 or SharePoint 2013 as shown in below figure:
 
Figure 1 : No SharePoint Template while creating New project in Visual Studio 2015 community edition

Solution : I was really wondering that in Visual Studio 2015 community edition there is no template available for SharePoint 2013/2010 projects like Empty Project, Visual Web Part etc.
 
After googling bit I found that in November 2015 Microsoft has announce the Update 1 for Microsoft Office Developer Tools for Visual Studio 2015. This update incorporated the Apps for Office and SharePoint Add-Ins and bug fixes. 
 
We can download update 1 from http://aka.ms/officedevtoolsforvs2015 . I have downloaded and installed the same and I could see the Office / SharePoint option and SharePoint Solution options underneath it as shown in below figure
 
Figure 2 : SharePoint templates available after installing update1 for Microsoft Office Developer Tools for Visual Studio 2015


Project Template for SharePoint 2016 Beta 2 : Also now there is next round of improvements preview available for Microsoft Office Developers Tools for Visual Studio 2015 https://www.microsoft.com/en-us/download/details.aspx?id=49972 which includes the templates for developing SharePoint farm and sandboxed solutions for SharePoint 2016 Beta 2 as shown in following figure
 
Figure 3 : Visual studio 2015 improvement preview - SharePoint 2016 Beta 2 project templates available

 
This preview must be installed on the latest version of the Microsoft Office Developers Tools for Visual Studio 2015. 
 
References : Visual Studio 2015 community edition - aka.ms/VSCommunity2015.
 
Thanks!
 
Enjoy Reading :)
 
As usual any comment / suggestions / feedback / questions always welcome :)

Wednesday, 23 March 2016

SharePoint Online / Office 365 - Fetch all users manager and writing to .CSV file using CSOM + PowerShell

Hi All,

In this article I’ll explain in details step by step how to get all users manager in CSV file using CSOM and PowerShell.

Background: In one of our Office 365 project we have Approval workflow. We have written 2013 platform approval workflow. In workflow we are getting current users manager and then starting a task process (approval request) with Manager.

Need to write this script: Workflow was working fine. But for some users it didn't work. We looked into this issue and noticed that some user has no manager set in there user profile. There manager field is empty.

We need to update the manager field of those users. We need to have list of all users whose manager field is empty. So the need of script to find all the users whose manager field is empty and writing them to .CSV file. So that we can share the .CSV file with customer, they will fill the manager field and then we will update the manager property in user profile.

Step By Step PowerShell script to get manager and writing to .CSV file:

Step 1: Load the required libraries

 # add references to SharePoint client assemblies and authenticate to Office 365 site - required for CSOM
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.UserProfiles.dll"
 
Step 2: Set the required variables like root SiteCollection URL , tenant admin UserName and Password of your site to connect as
 
#Specify tenant admin and URL
$User = "" 
 
#Configure Site URL and User
$SiteURL = ""
 
#Password
$Password =" "
 
$securePassword = ConvertTo-SecureString -String $Password -AsPlainText –Force
 
$Creds = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($User,$securePassword)
 
Step 3: Get the Microsoft.SharePoint.Client.ClientContext instance and set the credentials as
 
 
 
#client context object and setting the credentials 
$Context = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
 
$Context.Credentials = $Creds
 
Step 4: Identify all the users and load them
 
#Users collection
$Users = $Context.Web.SiteUsers
$Context.Load($Users)
$Context.ExecuteQuery()
 
Step 5: Creating people manager instance
 
#create People Manager object to retrieve profile data
$PeopleManager = New-Object Microsoft.SharePoint.Client.UserProfiles.PeopleManager($Context)
 
Step 6: Lopping through each user in Users collection, retrieving user profile, fetching all user profile properties to get the Manager
 
#CSV file path to write the user profile properties 
$Output = "c:\userproperties.csv"
 
Foreach ($User in $Users)
{
    #Get properties for user 
    $UserProfile = $PeopleManager.GetPropertiesFor($User.LoginName)
    $Context.Load($UserProfile)
    $Context.ExecuteQuery()
 
    If ($UserProfile.Email -ne $null)
     {
         $upp = $UserProfile.UserProfileProperties
 
         #retrieving User display name, Email, Manager and Job Title 
$Properties = $UserProfile.DisplayName$UserProfile.Email$UPP.Manager
#writing all above properties to csv file 
$Properties -join "," | Out-File -Encoding default -Append -FilePath $Output
} #If 
         
} #for each
 
Also using the above script we can fetch any other user properties also. We can make this script generic also by passing property name or we can loop through each and every property and write to CSV file. 
 
Thanks!
 
Enjoy Reading :)
 
As usual any comment / suggestions / feedback / questions always welcome :)

Friday, 18 March 2016

Office 365 / SharePoint Online - Why it is important to Migrate 2010 platform workflow to 2013 platform even though back-word compatibility is there

Hi All,

In this article, I’ll explain issue which we faced with SharePoint 2010 platform workflow. New Workflow service APIs doesn’t shows the associated 2010 platform workflows to the list. So this will also explain why it is important to migrate the 2010 platform workflow with 2013 even though 2010 platform workflows are supported for background compatibility.
 
Background: We have migrated one of our SharePoint 2010 site to SharePoint online. We have lots of SharePoint designer workflows associated to our custom lists. Some are approval workflows; some workflows are there just to send emails, some workflows just to break the permissions etc. So these workflows are migrated as it is and they directly supported into SharePoint online since these all are SharePoint designer workflows and no custom code.
 
In one of the workflow we received one small change and we need to rerun the workflow on existing items. There are total around 3000 existing items so manual run is not an option. So we thought to write PowerShell script.
 
Following are the high level steps, not sharing complete script here, if required please download from the below URL.
 
1. Create Workflow Service manager instance
 
2. Get Workflow subscription service 
 
3. Get Workflow instance service instance
 
4. Load all above instances
 
5. Get all the associated workflows collection by calling method of workflow subscription service EnumerateSubscriptionsByList($list.Id), load the collection object as, 
 
$WorkflowAssociations = $WorkflowSubscriptionService.EnumerateSubscriptionsByList($list.Id) 
 
$ClientContext.Load($WorkflowAssociations
 
Here, $list.Id is the Id of the list on which we need to start the workflow
 
6. Find the workflow from the associated workflows collection
 
7. Call the StartWorkflowOnListItem of Workflow instance service
 
 
Issue: We have opened the “SharePoint Online Management Shell” and started step by step executing the script. We noticed that in the Step 5, $WorkflowAssociations collection we didn’t got our 2010 platform workflows which are associated to the list.
 
So we didn’t have any option to automate the rerunning the associated 2010 platform workflow to the list except manual starting them.
 
This becomes challenge for us and this is the main issue. This means new workflow service APIs introduced in 2013 doesn’t contain the API to return the associated 2010 platform workflow and to start/terminate those.
 
Resolution: Only resolution we found for this problem is to rewrite our 2010 platform to 2013 platform. Then only we could start the workflow on existing items using PowerShell script.
 
This is one of the reasons why we should consider migrating 2010 platform to 2013 platform.
 
Important Point to consider: While doing initial migration, we thought we will not rewrite the 2010 platform workflows to 2013 platform since there is no official announcement from Microsoft if they will be deprecated or not or till how long 2010 platform will be supported.
 
But once we faced this issue then we started rewriting the workflows in 2013 platform. 
So key point is start planning those in migration phase only. We must consider rewriting the workflows in 2013 platform while migration phase only.
 
References:
 
  1. What's new in workflows for SharePoint 2013 - https://msdn.microsoft.com/library/office/jj163177%28v=office.15%29.aspx
  2. Workflow actions quick reference (SharePoint 2013 Workflow platform) - https://msdn.microsoft.com/en-us/library/office/jj164026.aspx
Thanks!
 
Enjoy Reading J
 
As usual any comment / suggestion / feedback / questions always welcome :)