Friday, June 19, 2015

Failed to load toolbox item. Item will be deleted from the toolbox.

(This post is written for SharePoint 2010 where workflow is being created using VS 2010 Ultimate).

You intend to create multiple tasks from your custom workflow. So, you want to create a custom sequence activity in your SharePoint solution.

First Problem:
SharePoint solution doesn't contain any template for custom activity.
Let's say somehow you managed to create custom sequence activity (Create a separate 'Worklow' -> 'Workflow Activity Library' project and copy custom activity from there). Now, you drag and drop custom activity on your workflow and you see the error "Failed to load toolbox item. Item will be deleted from the toolbox".
You will find other solutions on Internet like
1. Remove project from GAC
2. Restart Visual Studio

If above doesn't resolve, then please try this solution:
1. Create component class (General -> Component Class) in SharePoint project
2. Create separate 'Workflow Activity Library' project and then a custom activity. Copy and paste .cs and .designer.cs content (not files) in your component class.
3. Build solution. You should see custom activity on toolbox window. Drag and drop this on your workflow.

I hope this little trick will help.

Saturday, November 17, 2012

"File Not Found" error in SharePoint 2010

You open your SharePoint site page and see "File Not Found". You have no clue what's went wrong.

This issue might be caused due to following actions:
1. Retracted any solution package from SharePoint site
2. Deactivated any feature.

If you have taken any of the action mentioned above then you needn't to worry as things are under control.

Now, try to open following pages:
http://<site name : port>/_layouts/managefeatures.aspx?Scope=Site
http://<site name : port>/_layouts/viewlsts.aspx

You should be able to open above pages.

If yes (or even no :)), just re-deploy the solution or re-activate the feature and you are good to go.

What went wrong when you took any of the action mentioned above?

Your solution package or feature are responsible for deploying any custom master page, custom control or some thing which was being referenced by SharePoint site. When you retract solution package or deactivate the feature, site doesn't find those components and shows "File Not Found" error.

Even if this doesn't solve your problem, you will find lots of other solution so keep your hopes alive. All the best!

Wednesday, October 10, 2012

Administrative and Service Accounts for SharePoint Foundation 2010

Given below is a consolidated list of all accounts required for administrative deployments and services for SharePoint Foundation 2010.

Server farm-level accounts:

1. SP_SQLService (local account can be used so not required)

This account should be:
  • Either a Local System account or 
  • Domain user account
Purpose: The SQL Server service account is used to run SQL Server. SQL Server prompts for this account during SQL Server Setup. It is the service account for the following SQL Server services:

2. SP_Install

This account should be:
  • Domain user account.
  • Member of the Administrators group on each server on which Setup is run.
  • SQL Server login on the computer that runs SQL Server.
  • Member of the following SQL Server security roles:
    • securityadmin fixed server role
    • dbcreator fixed server role
Purpose: This is Setup user account and is used to run the following:
  • Setup on each server computer
  • SharePoint Products Configuration Wizard
      If you run Windows PowerShell cmdlets that affect a database, this account must be a member of the db_ownerfixed database role for the database.

3. SP_Farm

This account should be:
  • Domain user account.
Purpose: This is server farm account (referred as database access account) and is used to perform the following tasks:
  • Configure and manage the server farm.
  • Act as the application pool identity for the SharePoint Central Administration Web site.
  • Run the Microsoft SharePoint Foundation Workflow Timer Service.
      Additional permissions are automatically granted for the server farm account on Web servers and application servers that are joined to a server farm.
        The server farm account is automatically added as a SQL Server login on the computer that runs SQL Server. The account is added to the following SQL Server security roles:
  • dbcreator fixed server role
  • securityadmin fixed server role
  • db_owner fixed database role for all SharePoint databases in the server farm

Service application accounts

4. SP_ServiceApp
This Account: 
  • Must be a member of the Farm Administrators group.
NoteFor following service applications:
  • Business Data Connectivity Service
  • Search Service
  • Usage and Health Data Collection Service
  • Application Discovery and Load Balancer Service Application (Must be farm account)
Used as the identity for the service application endpoint application pool. Unless there are specific isolation requirements, the application pool can be used to host multiple service application endpoints.

Microsoft SharePoint Foundation 2010 Search accounts

5. SP_SearchService
This account:

  • Must be a domain user account.
  • Must not be a member of the Farm Administrators group.

Note: The following are automatically configured:
  • Access to read from the configuration database and the SharePoint_Admin content database.
  • Membership in the db_owner role for the WSS_ Search database

6. SP_ContentAccess

This account:
  • Same requirements as the SharePoint Foundation Search Service account.
  • For proper search functionality and information security, do not use an administrator account or an account that can modify content. 

Note: Automatically added to the Web application Full Read policy for the farm.
This account is automatically added to the Full Read policy, giving it read-only access to all Help content.

Additional application pool identity accounts

7. SP_WebApp

No manual configuration is necessary.
Note: The following are automatically configured:
  • Membership in the db_owner role for content databases and search databases associated with the Web application.
  • Membership in specific application pool roles for the configuration and the SharePoint_AdminContent databases.
  • Additional permissions for this account to front-end Web servers and application servers are automatically granted.

Also consider following important points:

1.) After you complete installation and configuration of accounts, ensure that you do not use the Local System account to perform administration tasks or to browse sites.

2.) A user account that is used by application pools or services must have permissions of a domain user account and must not be a member of the Farm Administrators group or a member of the Administrators group on the local computer. Using highly privileged accounts for application pools or services poses a security risk to the farm, and could allow malicious code to execute.

3.) Using built-in accounts as application pool identities or as service identities is not supported in a farm configuration. Built-in accounts include Network Service, Local Service, and Local System.

4.) The Farm Account, which is used for the SharePoint 2010 Timer service and the Central Administration site, is highly privileged and should not be used for other services on any computers in the server farm.

Technical Reference:

(1-3) Deployment administrative and service accounts

(4-7) Plan for administrative and service accounts

Monday, September 17, 2012

Internal server error exception: System.ServiceModel.ServerTooBusyException: SearchService.svc is too busy. ---> System.Net.WebException: The remote server returned an error: (503) Server Unavailable.

Problem Summary
Search stops working when multiple users try to search the SharePoint site.
(Server restart can solve the issue which should not be accepted as a solution.)

Problem itself provided two clues :
- Search stops working with multiple users (Multiple requests causes problem)
-  Server restart can solve the issue  (Some cache is being cleaned which enables search again)

Please note 503 error is returned when web server directs request to web site itself. It means there is some limit of requests which can be served by web server. These settings are defined at application pool level.

FYI, SharePoint search is handled by Search Service Application which uses an application pool for serving search requests.

Given below are the configurations which are required to resolve this issue:

1. Configure Search Service Application to use a separate application pool if application pool is being shared by other Service Applications also.  
Reason : It application pool is being shared by other service applications, doing configuration changes can have unexpected impact on other services.

2. Increase application pool's (in advance settings) Queue Length from 1000 to 10000.
Reason : Increasing this limit would minimize the chances of throwing 'Server unavailable (503)' error.

3. Enable recycling for application pool on following conditions:
  i.) When number of requests exceed 100 count
  ii.) Every day at 1:00 AM.
Reason : Exception seems to be very much related with number of search requests processed by server crossing the limit. Enabling recycle settings would overcome this.

Friday, August 31, 2012

Custom Web Part to Add document to SharePoint document library

I am categorizing this post into two parts. First part is just to make foundation for this post.


To display files and folders of a document library in a tree view style you will need to create a custom web part and for that, you can always refer this link:

Now, let's come to the second part which is also the focus of this post.


Now suppose, you need to add a document from above web part while refreshing the tree view at the same time.

Given below is the code to achieve this:

Code Description:
a.) Get document library permission level for logged in user so that 'Add Document' link can be hidden for less privileged users.
b.) Put 'Add document' link on web part with SharePoint look and feel. On clicking, it calls a java script function which is registered using 'RegMyScript'.
c.) It adds document to document library in the SharePoint way and also refreshes library tree view to show the newly uploaded document.

Code Download Link.

Tuesday, August 28, 2012

Using Multiple Selection List Box control in InfoPath 2010

Multiple Selection List Box control acts like a list box which can be populated with values stored in a SharePoint list while rendering items with a check box in front of them at the same time.

Here, we will look into two capabilities of this control which are not very straight forward:

  • Retrieving all selected options with a delimiter
  • Show/Hide input details mapped with one of the item in control

Retrieving all selected options with a delimiter

Let's say, you have the requirement of getting all selected items from Multiple Selection List Box control and need to promote these to SharePoint form library.

(To promote this control value, you select 'merge' from drop down at the time of property promotion.)

Here comes the problem !

You may find promoted values unexpected as selected values are merged without any separator/delimiter. This control doesn't provide any option for putting a delimiter between merged values.

To achieve this, you need to work with expressions in InfoPath.

At the time of Submit,
- Create a rule to store provided expression (below) in any hidden control.
- Promote hidden control to SharePoint form library instead of multiple selection list control.

substring(eval(eval(lbControl[. != ""], 'concat(", ", .)'), ".."), 3)     // Store this into hidden control

It is using eval function of InfoPath which iterates through every item of list box control and put a prefix ", " with item if selected. lbControl is our list box control.

Show/Hide Input Details mapped with one of the item in control

Let's say, we have a requirement of making a control (text box, drop down list etc.) visible or invisible based on selection of a particular item in multiple list box control.

Put your target control in a section and create a formatting rule on section saying like this:


b.) And, if above condition is true, then hide the section.

lbRequestType -> This is your multiple selection list box control
"IT Department" -> It is an item populated in multiple selection list box control.

Launching applications from Internet Explorer browser

Solution provided here assume that application is placed on a known location on any client machine (for e.g. Notepad.exe).

I have used ActiveX with shell scripting for launching Win32 (Non Win32 can be launched too) applications.

JavaScript Code:

Wednesday, July 25, 2012

Accessing web.config of SharePoint Web Application

Finding this information was not very easy, so decided to write this post.

- Microsoft.SharePoint.Administration
- System.IO

Credit goes to KickTech blog post.

Tuesday, July 24, 2012

Microsoft Officially Announces SharePoint 2013

Wait is over !!!

Microsoft has announced the next version of SharePoint. It is SHAREPOINT 2013!

Two versions :

- SharePoint Foundation 2013 Preview
(Minimum RAM : 8GB, Processor : 64-bit, 4 cores )

- SharePoint Server 2013 Perview
(Minimum RAM : 24GB, Processor : 64-bit, 4 cores )

For details go to Hareware and Software Requirements

One good news !

SharePoint 2013 is based on Microsoft .NET Framework version 4.5 Release Candidate (RC). So this time SharePoint seems not to lag being .Net framework. :)

For more details on SharePoint 2013, visit official information here

Tuesday, June 12, 2012

"The collection has not been initialized. It has not been requested ..." in SharePoint 2010 ECMAScript Client Object Model.

This is a common error which you will see while working with ECMAScript Object Model of SharePoint 2010. There could be multiple reasons behind this issue as discussed below:

Cause 1:
Error occurs when you try to access properties of an object which has not been initialized.
Let's understand it through an example (excluding script start and end tags).

var currentUser;
var uLogin;
var uTitle;
var ctx;

function LoadUserDetails() {
//Get Context
ctx = new SP.ClientContext.get_current();

//Get logged in user
currentUser = ctx.get_web().get_currentUser();

ctx.executeQueryAsync(queryTrackerList, failure);

function  AccessUserDetails() {
//Get user login name
uLogin = currentUser.get_loginName();
//Get User title
uTitle = currentUser.get_title();
        alert('Current user login name : ' + uLogin);

        alert('Current user display name : ' + uTitle);

Here, I am displaying current logged user details : Login Name and Display Name.

currentUser = ctx.get_web().get_currentUser();

Above code line returns an SP.User object which is uninitialized (does not contain any property value) until a call to executeQueryAsync method.

So if we call user object properties (get_loginName and get_title) in first method ' LoadUserDetails ', it will return us an error i.e. "The collection has not been initialized. It has not been requested ...".

Alway access object properties only after it has been initialized. As, accessing SP.User properties in second method ' AccessUserDetails' will work without any problem as executeQueryAsync method has been called so object has been initialized and contains properties values.

Cause 2:
Let's say you have more than one functionalities on the same page which are interacting with SharePoint list/s to read/update/delete items.

JS file1:


    ExecuteOrDelayUntilScriptLoaded(function(){func1();}, "sp.js");


function func1()
       //Doing something...

JS file2:


     ExecuteOrDelayUntilScriptLoaded(function(){func2();}, "sp.js");


function func2()
       //Doing something...

As you can see, on page load two different functions are executing which are calling "ExecuteOrDelayUntilScriptLoaded" function. This would also result in the same error.

Solution : 
If possible, try to do both functionalities with single JS file as given below...


     ExecuteOrDelayUntilScriptLoaded(function(){func1();}, "sp.js");


function func1()
       //Doing something...
       ctx.executeQueryAsync(func2, func2);  //func2 will be called on success or failure both