Top Menu

Friday, January 18, 2013

SharePoint 2013 - Administration Accounts

Multiple Server Farm

To manage SharePoint with multiple servers you need three types of roles/accounts:
Account Purpose
SQL Server service accountSQL Server prompts for this account during SQL Server Setup. This account is used as the service account for the following SQL Server services:
  • MSSQLSERVER
  • SQLSERVERAGENT
If you are not using the default instance, these services will be shown as:
  • MSSQL<InstanceName>
  • SQLAgent<InstanceName>
Setup user accountThe user account that is used to run:
If you run Windows PowerShell cmdlets that affect a database, this account must be a member of the db_owner fixed database role for the database.
  • Setup on each server computer
  • SharePoint Products Configuration Wizard
  • The Psconfig command-line tool
  • The Stsadm command-line tool
  • This account needs local admin access on the machine to run the SharePoint Setup.
Server farm accountThis account is also referred to as the database access account.
This account has the following properties:
  • It's the application pool identity for the SharePoint Central Administration website.
  • It's the process account for the Windows SharePoint Services Timer service.
  • This does not have to be the local account.


Start the installation with Setup user account and in SharePoint Configuration Wizard you will specify SQL Server service instance (because it will be on other server inside the farm) and Farm Account access.

Single Server Farm

To manage single server farm, all three roles can be handled by one account. So you need only local account (Setup user account) to do all the installation and configurations.

Start the installation with Setup user account and SharePoint Configuration Wizard will automatically pickup the SQL Server Instance and assign Setup user account as Farm account. 
See the single farm installation in here.

Ref: http://technet.microsoft.com/en-us/library/cc263445.aspx

SharePoint 2013 - Setup Development Environment

Pre-Requisite: Have your virtual machine ready with Microsoft Windows 2012 installed on it.

It will be a single server farm and following are the four steps to setup a SharePoint 2013 environment for development:
  1. Install Microsoft SQL Server 2012 (SP1)
    •  Select New SQL Server Stand-alone Installation
    • In the Installation wizard, under Feature Selection, select following features
  2. Install Microsoft SharePoint 2013
    • Install Pre-Requisite for SharePoint 2013
    • Launch SharePoint 2013 Setup and select Stand-alone installation on Server Type tab.
    • Launch SharePoint 2013 Product Configuration Wizard.
    • This wizard will perform configuration for SharePoint e.g. creating configuration database, registering features, provisioning Central Administration, creating sample data etc.
    • Launch Central Administration from Start menu
  3. Install Microsoft Visual Studio 2012
    • I am a developer so I will select all options to install
  4. Install Microsoft SharePoint Designer 2013

Monday, December 3, 2012

Backup and Restore SharePoint Site

Site Collection Backup and Restore

Backup: 
stsadm -o backup -url http://site1.com/sitecoll1 -filename c:\backup\backup1.dat
Restore: 
stsadm -o restore -url http://site2.com/sitecoll1 -filename c:\backup\backup1.dat -overwrite


Export and import a subsite, list, or library

Export:
stsadm -o export –url http://site1.com/sites/portal/Shared%20documents –filename c:\backup\lib.bak -quiet -overwrite 
Import:
stsadm -o import –url http://site2.com/sites/portal/Shared%20documents –filename c:\backup\lib.bak -quiet


Wednesday, September 19, 2012

JQuery: Batch update the list items via Lists.asmx

Quick JQuery script to batch update the list items via Lists.asmx.

I have two lists Projects(Title, ProjectStatus) and Teams(Title, Project, ProjectStatus). Team.Project is a lookup column from Projects.Title and I want to update Teams.ProjectStatus when Projects.ProjectStatus is updated in the Projects list via EditForm.aspx. Now we can link two columns from projects list into the Teams list but can not connect them together in the Teams list, so following script was a great help. It batch updates the Teams.ProjectStatus once Project.ProjectStatus is updated.

Thanks to the this post I found 100% functionality ready to go.


<script type="text/javascript" src="/Scripts/jquery-1.8.1.min.js"></script>

<script type="text/javascript">

var strProject = "";
var strProjectStatus = "";

function PreSaveItem()
{
 strProject = document.getElementById('ctl00_m_g_f2d95e24_befb_49d2_b15f_823d71c9c758_ctl00_ctl04_ctl00_ctl00_ctl00_ctl04_ctl00_ctl00_TextField').value;
 strProjectStatus = document.getElementById('ctl00_m_g_f2d95e24_befb_49d2_b15f_823d71c9c758_ctl00_ctl04_ctl01_ctl00_ctl00_ctl04_ctl00_DropDownChoice').value;
 
 GetProjectID();
  
 return true;
}

function GetProjectID(){

var soapEnv = "<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'> \
<soap:Body> \
    <GetListItems xmlns='http://schemas.microsoft.com/sharepoint/soap/'> \
        <listName>Teams</listName> \
        <query><Query><Where><Eq><FieldRef Name='Project'/><Value Type='Text'>"+ strProject +"</Value> </Eq></Where></Query></query> \
        <viewFields> \
            <ViewFields> \
                <FieldRef Name='ID' /> \
                <FieldRef Name='Title' /> \
            </ViewFields> \
        </viewFields> \
        <rowLimit>99999</rowLimit> \
        <queryOptions xmlns:SOAPSDK9='http://schemas.microsoft.com/sharepoint/soap/' ><QueryOptions/> \
        </queryOptions> \
    </GetListItems> \
</soap:Body> \
</soap:Envelope>";

jQuery.ajax({
url: "/itsglobal/_vti_bin/lists.asmx",
type: "POST",
dataType: "xml",
data: soapEnv,
complete: ResultMethod,
contentType: "text/xml; charset=\"utf-8\""
});

}

function ResultMethod(xData, status) 
{

    if (status=="success")
    {
        var oldbatch = "";
        $(xData.responseXML).find("z\\:row").each(function() 
        {
            oldbatch = AddTobatch(oldbatch, $(this).attr("ows_ID"));
        });
        
        UpdateTeamItem(oldbatch);
    }

}

function AddTobatch(oldbatch, itemId)
{

//Specify the batch query
var _batch = "<Method ID='1' Cmd='Update'><Field Name='ID'>" + itemId +"</Field><Field Name='ProjectStatus'>"+ strProjectStatus +"</Field></Method>";
oldbatch = oldbatch + _batch;

return oldbatch;
}

function UpdateTeamItem(batch) 
{
var soapEnv = "<?xml version=\'1.0\' encoding=\'utf-8\'?> \
<soap:Envelope xmlns:xsi=\'http://www.w3.org/2001/XMLSchema-instance\' \
xmlns:xsd=\'http://www.w3.org/2001/XMLSchema\' \
xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/\'> \
<soap:Body> \
<UpdateListItems xmlns='http://schemas.microsoft.com/sharepoint/soap/'> \
<listName>Teams</listName> \
<updates> \
<Batch OnError='Continue'>" + batch + "</Batch> \
</updates> \
</UpdateListItems> \
</soap:Body> \
</soap:Envelope>";

$.ajax({
url: "/itsglobal/_vti_bin/lists.asmx",
beforeSend: function(xhr) { xhr.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/sharepoint/soap/UpdateListItems");
},
type: "POST",
dataType: "xml",
data: soapEnv,
complete: updateResult,
contentType: "text/xml; charset=\"utf-8\""

});
}

function updateResult(xData, status) {
if (status != 'success' )
    alert("Update Project Status in Teams library failed");
}


</script>

JQuery: Read list Item via Lists.asmx

Following JQuery script is to get list items using Lists.asmx web service in MOSS 2007:
<script type="text/javascript" src="/Scripts/jquery-1.8.1.min.js"></script>
<script type="text/javascript">

//This function will call when OK button will be pressed on a List's default form (e.g. EditItem.aspx).

function PreSaveItem()
{
 var project = "Project A";
 
 GetProjectID(project);
 
 return true;
}

function GetProjectID(project){

var soapEnv = "<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'> \
<soap:Body> \
    <GetListItems xmlns='http://schemas.microsoft.com/sharepoint/soap/'> \
        <listName>Teams</listName> \
        <query><Query><Where><Eq><FieldRef Name='Project'/><Value Type='Text'>"+ project +"</Value> </Eq></Where></Query></query> \
        <viewFields> \
            <ViewFields> \
                <FieldRef Name='ID' /> \
                <FieldRef Name='Title' /> \
            </ViewFields> \
        </viewFields> \
        <rowLimit>99999</rowLimit> \
        <queryOptions xmlns:SOAPSDK9='http://schemas.microsoft.com/sharepoint/soap/' ><QueryOptions/> \
        </queryOptions> \
    </GetListItems> \
</soap:Body> \
</soap:Envelope>";

jQuery.ajax({
url: "/itsglobal/_vti_bin/lists.asmx",
type: "POST",
dataType: "xml",
data: soapEnv,
complete: ResultMethod,
contentType: "text/xml; charset=\"utf-8\""
});

}

function ResultMethod(xData, status) 
{

    if (status=="success")
    {
        alert(status);
        $(xData.responseXML).find("z\\:row").each(function() 
        {
            alert($(this).attr("ows_ID"));
        });
    }

}

</script>
I have copied this script from the internet and have tweaked it a bit to work with JQuery 1.8 version.

Tuesday, August 28, 2012

SharePoint 2007 - Save RSS Feed into List using JQuery

The idea is to fetch the RSS feed from multiple sources and then save into the SharePoint 2007 List so that we can perform search, archive the RSS news, display data nicely in Data View etc etc.



The following JQuery script will fetch the RSS feed from multiple sources and then save the data into the SharePoint 2007 list via lists.asmx:
<script src="/Scripts/jquery-1.8.0.min.js" type="text/javascript"></script>


<script type="text/javascript">
  
    function LoadFeed() 
    {
        var varFeedURL = new Array();
            varFeedURL[0] = "http://feeds.bbci.co.uk/news/business/rss.xml";
            varFeedURL[1] = "http://www.ft.com/rss/home/uk";
            varFeedURL[2] = "http://www.ft.com/rss/home/us";

            for (i = 0; i < varFeedURL.length; i++)
            {

                $.get(varFeedURL[i], function(data) {
                    var $xml = $(data);
                    $xml.find("item").each(function() {
                        var $this = $(this),
                            item = {
                                title: $this.find("title").text(),
                                link: $this.find("link").text(),
                                description: $this.find("description").text(),
                                pubDate: $this.find("pubDate").text()
                        }
                        
                        
                        //Show only Today's Items
                        var a = new Date(item.pubDate);
                        var b = new Date(); //Today's Date
                        
                        var msDateA = Date.UTC(a.getFullYear(), a.getMonth()+1, a.getDate());
                           var msDateB = Date.UTC(b.getFullYear(), b.getMonth()+1, b.getDate());
                                                   
                        if (parseFloat(msDateA) == parseFloat(msDateB))
                        {
                        
                            var content = document.getElementById('content');
                            content.appendChild(document.createTextNode(item.title)); 
                            content.appendChild(document.createElement('br'));
                            content.appendChild(document.createTextNode(item.description));
                            content.appendChild(document.createElement('br'));
                            content.appendChild(document.createTextNode(item.link));
                            content.appendChild(document.createElement('br'));
                            content.appendChild(document.createElement('hr'));
                            
                            CreateNewItem(item.title, item.description, item.link);
                        }
                        
                    });
                });
            }
        alert('Done');
    }        
        
        
        function CreateNewItem(varTitle, varDescription, varLink) 
        {
                    var batch =
                        "<Batch OnError=\"Continue\"> \
                            <Method ID=\"1\" Cmd=\"New\"> \
                                <Field Name=\"Title\">" + varTitle + "</Field> \
                                <Field Name=\"Description\">" + varDescription + "</Field> \
                                <Field Name=\"Link\">" + varLink + "</Field> \
                            </Method> \
                        </Batch>";
                
                    var soapEnv =
                        "<?xml version=\"1.0\" encoding=\"utf-8\"?> \
                        <soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \
                            xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" \
                            xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"> \
                          <soap:Body> \
                            <UpdateListItems xmlns=\"http://schemas.microsoft.com/sharepoint/soap/\"> \
                              <listName>RSSData</listName> \
                              <updates> \
                                " + batch + "</updates> \
                            </UpdateListItems> \
                          </soap:Body> \
                        </soap:Envelope>";
                
                    $.ajax({
                        url: "http://portalstg.amr.kworld.kpmg.com/_vti_bin/lists.asmx",
                        beforeSend: function(xhr) {
                            xhr.setRequestHeader("SOAPAction",
                            "http://schemas.microsoft.com/sharepoint/soap/UpdateListItems");
                        },
                        type: "POST",
                        dataType: "xml",
                        data: soapEnv,
                        complete: processResult,
                        contentType: "text/xml; charset=utf-8"
                    });
                }
                
                function processResult(xData, status) {
                    //alert(status);
                }
        
  
    </script>

<input id="btnGo" onclick="LoadFeed()" type="button" value="Get RSS Data" />


Ref: http://weblogs.asp.net/jan/archive/2009/04/10/creating-list-items-with-jquery-and-the-sharepoint-web-services.aspx


Thursday, August 9, 2012

SharePoint 2013 - Facebook style Discussion with Like Button

This post has also been published at NothingButSharePoint.

The famous Facebook Like is one of the features that everybody want these days so that they can like/unlike everything they can read and see over the internet. I was exploring SharePoint 2013 Technical Preview's new features and how to use them in real world scenarios when I came across the amazing new Discussion Board list and its configuration settings so that users can like/unlike a discussion, comment and a reply. 

First I am going to show the new features (displayed in the image below) and then I will show you how to configure the like/unlike button (in the video below). 

New Discussion Board list has following cool features:
  1. Display Picture - Now users can see the person who has started the discussion and who is replying. 
  2. Rich text - Users can reply with rich text to highlight the important parts of the conversation in their comments. 
  3. Reply to Reply - Users can now reply to an existing reply just like the discussion topic. 
  4. Multimedia Reply - Users can attach picture, video or a simple link with in their reply to provide a reference etc. 
  5. Like a reply - Users can rate a post by liking it.
  6. Best Reply - A reply can be marked as Best reply in order to avoid other users to dig for an answer in the thread.
Following video shows how to configure the Discussion Board list for Facebook style Like Button on posts:


Official SharePoint Documentation

I have recently contributed to the official SharePoint documentation for developement. Check it out here: https://docs.microsoft.com/en-us...