Wednesday, 25 November 2015

Exception “Only Content controls are allowed directly in a content page that contains Content controls.” while creating page from the custom page layout : SharePoint Online / Office 365

Hi All,
 
New problem in SharePoint Online world :) and solution :).
 
In this article I will explain how the exception “Only Content controls are allowed directly in a content page that contains Content controls.” occurs and solution to it.
 
Background : For our SharePoint online application we were working on new custom page layout. Our page layout is very simple and as such no major changes. So we just downloaded OOB “Article Page” layout and opened it in Visual Studio (Visual Studio 2015 community edition), modified it and manually uploaded in “Master Page” gallery. Set the “Content Type” as “Page Layout” content type and “Associated Content Type” as our custom content type. We made page layout available from the “Page Layout and Site Template Settings” for creating the pages. 
 
So next step is to create the content page from our custom page layout and verify it. Content page successfully get created but when we open the page it throws an following exception as
 
Figure 1 : Exception on page which is created from new custom page layout
 
Sorry, something went wrong
Only Content controls are allowed directly in a content page that contains Content controls.
TECHNICAL DETAILS
 
Troubleshoot issues with Microsoft SharePoint Foundation.
Correlation ID: 034a449d-d02b-2000-1648-733d4593b008
Date and Time: 11/22/2015 7:46:39 PM
 
Only the above exception and not much details. Googled bit but no luck. Also went through the page layout in visual studio again but seems to be no issues. 
 
So finally I downloaded the our page layout from “Master Page” gallery and surprisingly found that there were below extra commented code added at the bottom of the page layout after the closing section of “PlaceHolderMain” control place holder:
 
<%--<div class="captioned-image">
<div class="image">
<PublishingWebControls:RichImageField FieldName="PublishingPageImage" runat="server"/>
</div>
<div class="caption">
<PublishingWebControls:RichHtmlField FieldName="PublishingImageCaption"  AllowTextMarkup="false" AllowTables="false" AllowLists="false" AllowHeadings="false" AllowStyles="false" AllowFontColorsMenu="false" AllowParagraphFormatting="false" AllowFonts="false" PreviewValueSize="Small" AllowInsert="false" AllowEmbedding="false" AllowDragDrop="false" runat="server"/>
</div>
</div>--%>
 
Root Cause / Solution : This type of issue there also previously we have in on premises but with different exception message like "No parameterless constructor defined for this object". 
 
After again going through the page layout, it seems to be problem with casing of <asp:content> tagThere were mismatch between casing of opening and closing of <asp:content> tag
 
Opening tag is - <asp:Content> : C in Content is capital case and
Closing tag is - </asp:content> : c in Content is small case
 
It should always be capital ‘C’ in Content of opening as well as in closing tag like <asp:Content> </asp:Content>

"No parameterless constructor defined for this object"

We corrected our page layout and problem went away :)
 
Thanks!
 
Enjoy Reading :)
 
As usual any comment / suggestion / feedback / question always welcome :)
 
 

Monday, 7 September 2015

SharePoint Online - Option “Open with Explorer” in document libraries is disabled in Edge browser

Hi All,

In this article I’ll explain the workaround to enable the option “Open with Explorer” in SharePoint online document libraries in Edge browser.

Background: Yesterday, one my colleague (Non SharePoint Background) came to me and asked that he want to download all documents (those are around 100+) from one of the document library. So two possible options came to my mind

1. For document library from “LIBRARY” section using “Open with Explorer” option and copy all the documents
2. PowerShell script to download all the documents. 

As first option is the easiest one, I suggested for first option

Problem: So when we tried first option, we found that “Open with Explorer” option is disabled as
Figure 1 : "Open with Explorer" option is disabled

Figure 2 : "Open with Explorer" option is disabled
We were really wondering since we are logged in with the Admin account so it shouldn't be permission issue. Our environment is Windows 10 and browser is Edge. 


As usual we googled bit and found that this is Edge browser issue, confirmed on Microsoft KB article - Issues that occur when you use the Edge browser with Office 365  test ff

Solution / WorkaroundSo we thought to open the site with Internet Explorer. 
So in Edge with following option
More actions >> Open with Internet Explorer

Figure 3 : Open with Internet Explorer option
site is opened in Internet Explorer and “Open with Explorer” option is enabled :) as


Figure 4 : Enabled "Open with Explorer" option in IE
We clicked on the “Open with Explorer” option in IE but then Sync now dialog as

Figure 5 : "Open with Explorer" sync dialog
For time being to proceed further we just closed this dialog and again clicked on “Open with Explorer” option and finally we could successfully open the documents in Windows Explorer as
Figure 6 : Documents in Windows Explorer
Thanks!

Enjoy reading :)

As usual any comment / suggestion / feedback / question always welcome :)


Thursday, 27 August 2015

Office 365 - PowerShell script to verify if user is already exist if not then creating new user


Hi All,

Background:
We have Office 365 setup for our one of the customer. There were around 1000+ already users. Customer has given new list of users which need to add to office 365. But the problem is, in that list there were already few users which already exists. So we need to write a PowerShell script which already check if users is already exists, if not then add new user. 

We can directly upload excel to office 365 and excluding existing users, new users will be created but our customer also want the different passwords for the new users and don't want to change when they will login first time. If we specify password column to excel, Office 365 doesn't accepts it. Office 365 shows following result:

 Fig 1 : Office 365 result when we upload excel with Password column.

If we view log file it shows following error:

 Fig 2 : Log File showing error

So we don't have option except writing PowerShell script.

Solution:
Initially my thought was that its very easy job since we could easily create new users with the password we want using -Password and -ForceChangePassword option as $false as 

Import-Csv “D:\Users.csv” | Foreach-Object {New-MsolUser -UserPrincipalName  $_. UserName -DisplayName $_.DisplayName -Password  $_.Password -ForceChangePassword $false

But for me it took some time to verify whether user is already exists or not thorough PowerShell and so this article comes :)

Following are steps: (If you are newbie, please read my previous blog - Office 365 - Updating all users password at a time)


1. Set the Path of users excel file
 $path = "D:\Users.csv" 

2. Connect to Office 365 as 
 $cred=Get-Credential
  Connect-MsolService -Credential $cred 

3. Check if user is already exists :
 Get-MsolUser -UserPrincipalName $_.UserName -ErrorAction SilentlyContinue -ErrorVariable errorVariable

The above command is very important, Get-MsolUser get the existing users based on user name. Important parameters are -ErrorAction and -ErrorVariable. If given user is not exists then this command throws an exception but since we are executing command with SilentlyContinue option, it doesn't break the flow and error is copied in error variable “errorVariable” which we specified with ErrorVariable parameter. So here we have chance to check the errorVariable whether it is null or contains an error. If it is null it means user is not exists as 

 Import-Csv $path | Foreach-Object { 
if($errorVariable -ne $null){
       Write-Host "Creating new user"
       New-MSOLUser -UserPrincipalName  $_.UserName -DisplayName $_.DisplayName -Password  $_.Password -FirstName $_.FirstName -LastName $_.LastName -Department $_.Department -City $_.City -Country $_.Country_or_Region -MobilePhone $_.MobilePhone -PhoneNumber $_.OfficePhone -State $_.State_or_Province -StreetAddress $_.Address -Title $_.JobTitle  -Office $_.OfficeNumber -Fax $_.Fax -PostalCode $_.ZIP_or_Postal_Code -ForceChangePassword $false -ErrorVariable errorVariable 
              
   }
  else{
          Write-Host "User already exists : " $_.UserName
       } 
}#Foreach-object


References:

Thanks!

Enjoy Reading :)

Any feedback / suggestions / comment always welcome.

Wednesday, 19 August 2015

Office 365 - Updating all users password at a time

Hi All,
 
Background:
 
We have scenario like, in our project we have to give customers sample users for testing our SharePoint online site. We need to give around 50+ users to customer for testing. 
 
So in office 365 we have option to create bulk users, we can have .csv file and we can upload it from admin portal as 
 
Fig 1: Office 365 - Bulk user option
 
So we have prepared our users.csv file and uploaded and with few steps our users are created successfully. Everything fine till the time :). So for all these users Office 365 generated random password. Then for every user while first time log in need to change the password. 
But our customer requirement is all users must have same password and when they log in then no need to ask for change. 
 
Approaches: There are two possible approaches for this
 
1. Create the users using bulk user option as shown in above figure and then set the same password for all the users. 
 
2. We can set the password while creating the users
For above both he approaches we will need to install Microsoft Online Services Sign-in Assistant and Windows Azure AD Module for Windows PowerShell (Pleas look at reference section for more details of these tools)
 
Open Windows Azure AD Module for Windows PowerShell and execute following cmdlet
 
Connect-MsolService 
 
You will get the pop up to ask the credentials for connecting the Office 365 site as 
 
Fig 2: Credential Pop up 
 
Let’s keep our .csv file ready having column “UserName”. We are ready to execute the commands and lets consider both the approaches
 
1. Update the password for all the users which are created : Execute the following command
 
Import-Csv "D:\Users.csv"|%Set-MsolUserPassword -UserPrincipalName $_.UserName -NewPassword "abcd@123" -FoceChangePassword $false}
 
2. Set the password while creating the users
 
Import-Csv “D:\Users.csv” | Foreach-Object {New-MsolUser -UserPrincipalName  $_. UserName -DisplayName $_.DisplayName -Password  "abcd@123" } 
 
References:
1. Microsoft Online Services Sign-in Assistant: MOS SIA provides sign – in capabilities to Microsoft Online services like Office 365. The MOS SIA installs client components that allow desktop applications like “Windows Azure AD Module for Windows PowerShell” to authenticate to Microsoft Online Services. 
 
 
 
 
Thanks!
 
Enjoy Reading J
 
Please free to comment / suggestions / Feedback J

Saturday, 25 July 2015

Exploring Event Hubs in Azure

Hi All,

Recently in project I got a chance to explore Azure Event Hub and I really liked it, its brilliant service from Azure for some targeted scenarios. There is lots of good stuff available but since it took time for me to explore, I thought to share here in a simple way. Lets start the show :)

What is Event Hub : 

1. Event hub is a azure service that can be used to take large amount of data/events (can take/log millions of data/events per second in near real time). 
2. This large amount of data can be collected from WebSites, client apps (Mobile, web), IOT sensors, feeds from social network 
3. Process/analyze this large amount of event data using any real-time analytics system like Apache Storm, Azure analytic system etc.
4. Either store/transform this data into any data storage system including blob storage, hDInsight and Hadoop based solutions

Scenarios: What are the scenarios where we can think to use Event Hub?

1. Where we need to integrate/coordinate/receive millions of things (IoT Internet of Things), for example receive messages from millions of sensors, coordinate messages between thousands of trains or taxis and why not, send millions of logging messages to the Cloud (On Premise Tracking/Monitoring/Advertising Centralization) and more.
2. Where we need to collect audit data from devices on the field.
3. To collect the GPS locations of devices. 
And many more...

Few points to be consider while using Event Hubs

1. Event data size: Maximum event data of a batch that contains multiple event data is 256kb.

This is all about theory part, now we will see how to send the messages to Event Hub and receive those for further analyzing/processing. 

Steps:
1. We need to create Event Hub in Azure Portal. For this we will require Azure account to login to Azure management portal. If you don't have an azure account we can also create free trial azure account.

2. Log on to Azure management portal. Click on “+NEW” 


 Go to APP SERVICES >> SERVICE BUS >> EVENT HUB as


 Click on QUICK CREATE and enter the respective details “EVENT HUB NAME”, “REGION” and ‘’NAMSPACE NAME” as
  

Once event hub successfully created, you will see as


 So here event hub is created now we will send and receive the message to event hub.  

Now lets explore the code require for sending message. Before starting code we will require sdk for “Microsoft Service Azure Bus”, you can install it with the help of NuGet manager as 
 

Once the above NuGet package installed it will add references to ServiceBus library. To send the message we will also require the event hub connection string, which we will get from azure management portal, click on the namespace 




Click on Management tasks >> Manage Connection Strings, we will get the connection string for sending and receiving the messages as


 Copy the above connection strings. 

And finally, following is the code for sending the message:

var eventHubClient = EventHubClient.CreateFromConnectionString(connectionString, eventHubName);
   try{
      var serializedString = JsonConvert.SerializeObject(“Message to send”);
      EventData data = new EventData(Encoding.UTF8.GetBytes(serializedString));
      data.PartitionKey = "15";
                
      await eventHubClient.SendAsync(data);

     }catch (Exception exception){
//ToDo: Exception handling
     }

Receiving the message:

For receiving message we use EventProcessorHost class. To use this class we will require azure storage account. Use the Azure Management Portal to create the storage account, click on “+NEW” as 



Once data storage successfully created, click on it. From the bottom of the page click on “MANAGE ACCESS KEYS” as 

 Manage Access Keys pop up will appear as 


 Copy the primary access key which we will require in our receiver code. 

Finally simple receiver code:

 string eventHubConnectionString = "my event hub connection key for receiver";

 string eventHubName = "eventhubname";
 string storageAccountName = "storage account name";
 string storageAccountKey = "storage account key;
 string storageConnectionString =  string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}",storageAccountName, storageAccountKey);

string eventProcessorHostName = Guid.NewGuid().ToString();
EventProcessorHost eventProcessorHost = new EventProcessorHost(eventProcessorHostName, eventHubName, EventHubConsumerGroup.DefaultGroupName, eventHubConnectionString, storageConnectionString);
     eventProcessorHost.RegisterEventProcessorAsync<EventProcessor>().Wait();

In above code in RegisterEventProcessorAsyncwe are registering the EventProcessor class which is derived from IEventProcessorThis class allows us to processes the events/messages. 

public class EventProcessor : IEventProcessor
    {

async Task IEventProcessor.ProcessEventsAsync(PartitionContext partitionContext, IEnumerable<EventData> messages)
  {
            foreach (EventData event in messages)
            {
//ToDo: event processing logic
                 
            }
        }

 References:


Thanks!

Enjoy reading :)

Please share your suggestion / comments / feedback if any.